Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Ruimtelijke gegevens vertegenwoordigen de fysieke locatie en de vorm van objecten. Veel databases bieden ondersteuning voor dit type gegevens, zodat deze naast andere gegevens kunnen worden geïndexeerd en opgevraagd. Veelvoorkomende scenario's zijn het uitvoeren van query's op objecten binnen een bepaalde afstand van een locatie of het selecteren van het object waarvan de rand een bepaalde locatie bevat. EF Core ondersteunt toewijzing aan ruimtelijke gegevenstypen met behulp van de ruimtelijke bibliotheek NetTopologySuite.
Installeren
Als u ruimtelijke gegevens wilt gebruiken met EF Core, moet u het juiste ondersteunende NuGet-pakket installeren. Welk pakket u moet installeren, is afhankelijk van de provider die u gebruikt.
EF Core-provider | Spatial NuGet-pakket |
---|---|
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
NetTopologySuite (NTS) is een ruimtelijke bibliotheek voor .NET. EF Core maakt toewijzing naar ruimtelijke datatypes in de database mogelijk met behulp van NTS-typen in uw model.
Om toewijzing aan ruimtelijke typen via NTS in te schakelen, roept u de methode UseNetTopologySuite aan op de DbContext-optiesbouwer van de provider. Met SQL Server noemt u deze bijvoorbeeld als volgt.
options.UseSqlServer(
@"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=WideWorldImporters;ConnectRetryCount=0",
x => x.UseNetTopologySuite());
Er zijn verschillende typen ruimtelijke gegevens. Welk type u gebruikt, is afhankelijk van de typen shapes die u wilt toestaan. Hier volgt de hiërarchie van NTS-typen die u kunt gebruiken voor eigenschappen in uw model. Ze bevinden zich in de NetTopologySuite.Geometries
naamruimte.
- Meetkunde
- Punt
- Lijnstring
- Veelhoek
- GeometryCollection
- MultiPoint
- MultiLineString (meerlijnige reeks)
- MultiPolygoon
Waarschuwing
CircularString, CompoundCurve en CurePolygon worden niet ondersteund door NTS.
Door het type basisgeometrie te gebruiken, kan elk type vorm worden opgegeven door de eigenschap.
Lengtegraad en breedtegraad
Coördinaten in NTS zijn in termen van X- en Y-waarden. Als u lengte- en breedtegraad wilt weergeven, gebruikt u X voor lengtegraad en Y voor breedtegraad. Houd er rekening mee dat dit achteruit gaat in de latitude, longitude
indeling waarin u deze waarden doorgaans ziet.
Query's uitvoeren op gegevens
De volgende entiteitsklassen kunnen worden gebruikt om toe te wijzen aan tabellen in de Wide World Importers-voorbeelddatabase.
[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; }
}
In LINQ worden de NTS-methoden en -eigenschappen die beschikbaar zijn als databasefuncties vertaald naar SQL. De methoden Afstand en Bevat worden bijvoorbeeld vertaald in de volgende query's. Raadpleeg de documentatie van uw provider waarvoor methoden worden ondersteund.
// 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));
Reverse-engineering
Met de ruimtelijke NuGet-pakketten kunt u ook reverse-engineeringmodellen met ruimtelijke eigenschappen inschakelen, maar u moet het pakket installeren voordat u het uitvoert Scaffold-DbContext
of dotnet ef dbcontext scaffold
. Als u dit niet doet, ontvangt u waarschuwingen over het niet vinden van typetoewijzingen voor de kolommen en worden de kolommen overgeslagen.
SRID genegeerd tijdens clientbewerkingen
NTS negeert SRID-waarden tijdens bewerkingen. Er wordt uitgegaan van een planarcoördinaatsysteem. Dit betekent dat als u coördinaten opgeeft in termen van lengtegraad en breedtegraad, sommige waarden die door de client worden berekend, zoals afstand, lengte en oppervlakte, in graden, niet meters zijn. Voor zinvollere waarden moet u eerst de coördinaten projecteren naar een ander coördinatensysteem met behulp van een bibliotheek zoals ProjNet (voor GeoAPI).
Opmerking
Gebruik het nieuwere ProjNet NuGet-pakket, niet het oudere pakket met de naam ProjNet4GeoAPI.
Als een bewerking wordt geëvalueerd door EF Core via SQL, wordt de eenheid van het resultaat bepaald door de database.
Hier volgt een voorbeeld van het gebruik van ProjNet om de afstand tussen twee steden te berekenen.
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));
Opmerking
4326 verwijst naar WGS 84, een standaard die wordt gebruikt in GPS en andere geografische systemen.
Aanvullende bronnen
Databasespecifieke informatie
Lees de documentatie van uw provider voor meer informatie over het werken met ruimtelijke gegevens.
- Ruimtelijke gegevens in de SQL Server-provider
- Ruimtelijke gegevens in de SQLite-provider
- Ruimtelijke gegevens in de Npgsql-provider
Andere middelen
- NetTopologySuite Docs
- Standupsessie voor .NET Data Community, gericht op ruimtelijke gegevens en NetTopologySuite.