Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A térbeli adatok az objektumok fizikai helyét és alakját jelölik. Számos adatbázis támogatja az ilyen típusú adatokat, így indexelhetők és lekérdezhetők más adatokkal együtt. A gyakori forgatókönyvek közé tartozik az objektumok lekérdezése egy adott helytől megadott távolságon belül, vagy annak az objektumnak a kiválasztása, amelynek szegélye egy adott helyet tartalmaz. Az EF Core a NetTopologySuite térbeli kódtár használatával támogatja a térbeli adattípusokra való leképezést.
Telepítése
Ahhoz, hogy térbeli adatokat használhasson az EF Core-jal, telepítenie kell a megfelelő támogató NuGet-csomagot. A telepíteni kívánt csomag a használt szolgáltatótól függ.
EF Core-szolgáltató | Térbeli NuGet-csomag |
---|---|
Microsoft.EntityFrameworkCore.SqlServer | Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite |
Microsoft.EntityFrameworkCore.Sqlite | Microsoft.EntityFrameworkCore.Sqlite.NetTopologySuite |
Microsoft.EntityFrameworkCore.InMemory | NetTopologySuite |
Npgsql.EntityFrameworkCore.PostgreSQL | Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite |
Pomelo.EntityFrameworkCore.MySql | Pomelo.EntityFrameworkCore.MySql.NetTopologySuite |
Devart.Data.MySql.EFCore | Devart.Data.MySql.EFCore.NetTopologySuite |
Devart.Data.Oracle.EFCore | Devart.Data.Oracle.EFCore.NetTopologySuite |
Devart.Data.PostgreSql.EFCore | Devart.Data.PostgreSql.EFCore.NetTopologySuite |
Devart.Data.SQLite.EFCore | Devart.Data.SQLite.EFCore.NetTopologySuite |
Teradata.EntityFrameworkCore | Teradata.EntityFrameworkCore.NetTopologySuite |
FileBaseContext | NetTopologySuite |
NetTopologySuite
A NetTopologySuite (NTS) a .NET térbeli könyvtára. Az EF Core lehetővé teszi az adatbázis térbeli adattípusainak leképezését a modell NTS-típusaival.
Ha NTS-en keresztül szeretné engedélyezni a térbeli típusok leképezését, hívja meg a UseNetTopologySuite metódust a szolgáltató DbContext-beállítások szerkesztőjén. Az SQL Serverrel például így hívhatja.
options.UseSqlServer(
@"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=WideWorldImporters;ConnectRetryCount=0",
x => x.UseNetTopologySuite());
Számos térbeli adattípus létezik. A használni kívánt típus az engedélyezni kívánt alakzattípusoktól függ. Íme a modell tulajdonságaihoz használható NTS-típusok hierarchiája. A névtérben NetTopologySuite.Geometries
találhatók.
- Geometria
- Pont
- LineString (vonallánc)
- Sokszög
- GeometriaGyűjtemény
- MultiPoint
- Többsoros karakterlánc
- MultiPolygon
Figyelmeztetés
Az NTS nem támogatja a CircularString, a CompoundCurve és a CurePolygon szolgáltatást.
Az alapgeometriai típus használatával bármilyen típusú alakzatot meg lehet adni, amelyet a tulajdonság határoz meg.
Hosszúság és szélesség
Az NTS koordinátái X és Y értékeket tartalmaznak. A hosszúság és a szélesség megjelenítéséhez használja az X-et a hosszúsághoz és az Y-t a szélességhez. Vegye figyelembe, hogy ez visszafelé van attól a formátumtól, amelyben általában ezeket az latitude, longitude
értékeket látja.
Adatok lekérdezése
A következő entitásosztályokkal képezhetők le a Wide World Importers mintaadatbázis táblái.
[Table("Cities", Schema = "Application")]
public class City
{
public int CityID { get; set; }
public string CityName { get; set; }
public Point Location { get; set; }
}
[Table("Countries", Schema = "Application")]
public class Country
{
public int CountryID { get; set; }
public string CountryName { get; set; }
// Database includes both Polygon and MultiPolygon values
public Geometry Border { get; set; }
}
A LINQ-ban az adatbázisfüggvényekként elérhető NTS-metódusok és tulajdonságok az SQL-be lesznek lefordítva. A Távolság és a Tartalmaz metódus például a következő lekérdezésekben lesz lefordítva. Tekintse meg a szolgáltató dokumentációját, hogy mely metódusok támogatottak.
// Find the nearest city
var nearestCity = await db.Cities
.OrderBy(c => c.Location.Distance(currentLocation))
.FirstOrDefaultAsync();
// Find the containing country
var currentCountry = await db.Countries
.FirstOrDefaultAsync(c => c.Border.Contains(currentLocation));
Visszafejtés
A térbeli NuGet-csomagok visszafejtést is lehetővé tesznek a térbeli tulajdonságokkal rendelkező modellek esetében, de a csomagot telepíteni kell mielőtt vagy Scaffold-DbContext
futtatása előtt. Ha nem, figyelmeztetést kap arról, hogy nem talál típusleképezéseket az oszlopokhoz, és a program kihagyja az oszlopokat.
Az SRID figyelmen kívül hagyva az ügyfélműveletek során
Az NTS figyelmen kívül hagyja az SRID-értékeket a műveletek során. Egy planáris koordinátarendszert feltételez. Ez azt jelenti, hogy ha hosszúsági és szélességi koordinátákat ad meg, bizonyos ügyfél által kiértékelt értékek, például a távolság, a hossz és a terület fokban, nem pedig méterben lesznek meghatározva. Az érthetőbb értékek érdekében először egy másik koordinátarendszerbe kell kivetítenie a koordinátákat egy olyan kódtár használatával, mint a ProjNet (GeoAPI esetén).
Megjegyzés:
Az újabb ProjNet NuGet-csomagot használja, nem a ProjNet4GeoAPI nevű régebbi csomagot.
Ha egy műveletet az EF Core kiértékel az SQL-en keresztül, az eredményegységet az adatbázis határozza meg.
Íme egy példa a Két város közötti távolság kiszámítására a ProjNet használatával.
public static class GeometryExtensions
{
private static readonly CoordinateSystemServices _coordinateSystemServices
= new CoordinateSystemServices(
new Dictionary<int, string>
{
// Coordinate systems:
[4326] = GeographicCoordinateSystem.WGS84.WKT,
// This coordinate system covers the area of our data.
// Different data requires a different coordinate system.
[2855] =
@"
PROJCS[""NAD83(HARN) / Washington North"",
GEOGCS[""NAD83(HARN)"",
DATUM[""NAD83_High_Accuracy_Regional_Network"",
SPHEROID[""GRS 1980"",6378137,298.257222101,
AUTHORITY[""EPSG"",""7019""]],
AUTHORITY[""EPSG"",""6152""]],
PRIMEM[""Greenwich"",0,
AUTHORITY[""EPSG"",""8901""]],
UNIT[""degree"",0.01745329251994328,
AUTHORITY[""EPSG"",""9122""]],
AUTHORITY[""EPSG"",""4152""]],
PROJECTION[""Lambert_Conformal_Conic_2SP""],
PARAMETER[""standard_parallel_1"",48.73333333333333],
PARAMETER[""standard_parallel_2"",47.5],
PARAMETER[""latitude_of_origin"",47],
PARAMETER[""central_meridian"",-120.8333333333333],
PARAMETER[""false_easting"",500000],
PARAMETER[""false_northing"",0],
UNIT[""metre"",1,
AUTHORITY[""EPSG"",""9001""]],
AUTHORITY[""EPSG"",""2855""]]
"
});
public static Geometry ProjectTo(this Geometry geometry, int srid)
{
var transformation = _coordinateSystemServices.CreateTransformation(geometry.SRID, srid);
var result = geometry.Copy();
result.Apply(new MathTransformFilter(transformation.MathTransform));
return result;
}
private class MathTransformFilter : ICoordinateSequenceFilter
{
private readonly MathTransform _transform;
public MathTransformFilter(MathTransform transform)
=> _transform = transform;
public bool Done => false;
public bool GeometryChanged => true;
public void Filter(CoordinateSequence seq, int i)
{
var x = seq.GetX(i);
var y = seq.GetY(i);
var z = seq.GetZ(i);
_transform.Transform(ref x, ref y, ref z);
seq.SetX(i, x);
seq.SetY(i, y);
seq.SetZ(i, z);
}
}
}
var seattle = new Point(-122.333056, 47.609722) { SRID = 4326 };
var redmond = new Point(-122.123889, 47.669444) { SRID = 4326 };
// In order to get the distance in meters, we need to project to an appropriate
// coordinate system. In this case, we're using SRID 2855 since it covers the
// geographic area of our data
var distanceInDegrees = seattle.Distance(redmond);
var distanceInMeters = seattle.ProjectTo(2855).Distance(redmond.ProjectTo(2855));
Megjegyzés:
A 4326 a GPS-ben és más földrajzi rendszerekben használt WGS 84 szabványra utal.
További erőforrások
Adatbázis-specifikus információk
A térbeli adatokkal kapcsolatos további információkért olvassa el a szolgáltató dokumentációját.
- Térbeli adatok az SQL Server-szolgáltatóban
- Térbeli adatok az SQLite-szolgáltatóban
- Térbeli adatok az Npgsql-szolgáltatóban
Egyéb erőforrások
- NetTopologySuite Docs
- .NET Data Community Standup session, a térbeli adatokra és a NetTopologySuite-ra összpontosítva.