Overzicht van ruimtelijke gegevenstypen
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Analytics-eindpunt in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL-database in Microsoft Fabric
Er zijn twee soorten ruimtelijke gegevens. De geometrie gegevenstype ondersteunt planaire of Euclidische gegevens (platte aarde). De geometrie gegevenstype voldoet zowel aan de Open Geospatial Consortium (OGC) Simple Features for SQL Specification versie 1.1.0 als aan de SQL MM (ISO-standaard).
SQL Server biedt ook ondersteuning voor de geografie gegevenstype, waarin ellipsoidele gegevens (round-earth) worden opgeslagen, zoals GPS-breedte- en lengtegraadcoördinaten.
Tip
Ruimtelijke SQL Server-hulpprogramma's is een door Microsoft gesponsorde opensource-verzameling hulpprogramma's voor gebruik met de ruimtelijke typen in SQL Server. Dit project biedt een set herbruikbare functies waarvan toepassingen gebruik kunnen maken. Deze functies kunnen routines voor gegevensconversie, nieuwe transformaties, aggregaties, enzovoort omvatten. Zie Microsoft/SQLServerSpatialTools in GitHub voor meer informatie.
Ruimtelijke gegevensobjecten
De geometrie en geografie gegevenstypen ondersteunen 16 typen ruimtelijke gegevensobjecten of instantietypen. Slechts 11 van deze instantietypen zijn echter exemplaarbare; u kunt deze exemplaren maken en ermee werken (of deze instantiëren) in een database. Deze instanties leiden bepaalde eigenschappen ervan af van hun bovenliggende gegevenstypen.
In de volgende afbeelding ziet u de geometriehiërarchie waarop de geometrie en geografie gegevenstypen zijn gebaseerd. De instantieerbare typen van geometrie en geografie worden in blauw aangegeven.
Voor de geografie gegevenstypen is er een extra instantiebaar type: FullGlobe. De geometrie en geografie typen kunnen een specifiek exemplaar herkennen zolang het een goed gevormd exemplaar is, zelfs als het exemplaar niet expliciet is gedefinieerd. Als u bijvoorbeeld expliciet een exemplaar van Punt definieert met behulp van de methode STPointFromText()
, herkennen geometrie en geografie het exemplaar als een Punt, zolang de invoer van de methode correct is. Als u hetzelfde exemplaar definieert met behulp van de methode STGeomFromText()
, herkennen zowel de geometrie als geografie gegevenstypen het exemplaar als een Punt.
De subtypen voor geometrie- en geografietypen zijn onderverdeeld in eenvoudige en verzamelingstypen. Sommige methoden, zoals STNumCurves()
werken alleen met eenvoudige typen.
Eenvoudige typen zijn:
Verzamelingstypen zijn:
Verschillen tussen geometrie- en geografiegegevenstypen
De twee typen ruimtelijke gegevens gedragen zich vaak op dezelfde manier. Er zijn enkele belangrijke verschillen in hoe de gegevens worden opgeslagen en gemanipuleerd.
Hoe verbindingsranden worden gedefinieerd
De definiërende gegevens voor LineString en Polygon typen zijn alleen hoekpunten. De verbindingsrand tussen twee hoekpunten in een geometrietype is een rechte lijn. De verbindingsrand tussen twee hoekpunten in een geografietype is echter een korte grote elliptische boog tussen de twee hoekpunten. Een grote ellips is het snijpunt van de ellipsoïde met een vlak door het centrum. Een grote elliptische boog is een boogsegment op de grote ellips.
Hoe cirkelvormige boogsegmenten worden gedefinieerd
Cirkelvormige boogsegmenten voor geometrietypen worden gedefinieerd op het coördinaatvlak XY Cartesisch (Z-waarden worden genegeerd). Cirkelvormige boogsegmenten voor geografietypen worden gedefinieerd door curvesegmenten op een referentiebol. Elke parallel op de referentiebol kan worden gedefinieerd door twee complementaire cirkelbogen waarbij de punten voor beide bogen een constante breedtegraad hebben.
Metingen in ruimtelijke gegevenstypen
In het planaire systeem (flat-earth) worden metingen van afstanden en gebieden gegeven in dezelfde maateenheid als coördinaten. Met behulp van de geometrie gegevenstype is de afstand tussen (2, 2) en (5, 6) vijf eenheden, ongeacht de gebruikte eenheden.
In een ellipsoïdaal of rond-aardesysteem worden coördinaten gegeven in graden van breedtegraad en lengtegraad. Lengten en gebieden worden echter meestal gemeten in meters en vierkante meters, hoewel de meting afhankelijk kan zijn van de ruimtelijke referentie-id van de geografie instantie. De meest voorkomende maateenheid voor de geografie gegevenstype is meters.
Oriëntatie van ruimtelijke gegevens
De ringstand van een veelhoek is geen belangrijke factor in het planaire systeem. De OGC Simple Features for SQL Specification bepaalt geen ringvolgorde en SQL Server dwingt geen ringvolgorde af.
In een ellipsoïdaal systeem heeft een veelhoek zonder oriëntatie geen betekenis of is dubbelzinnig. Beschrijft een ring rond de evenaar bijvoorbeeld het noordelijke of zuidelijke halfrond? Als we de geografie gegevenstype gebruiken om het ruimtelijke exemplaar op te slaan, moeten we de richting van de ring opgeven en de locatie van het exemplaar nauwkeurig beschrijven.
Het interieur van de veelhoek in een ellipsoïdaal systeem wordt gedefinieerd door de "linkerregel": als u zich voorstelt dat u langs de ring van een geografische veelhoek loopt, de punten volgend in de volgorde waarin ze worden vermeld, wordt het gebied aan de linkerkant behandeld als het interieur van de polygoon en het gebied aan de rechterkant als het exterieur van de veelhoek.
Wanneer het compatibiliteitsniveau 100 of lager is in SQL Server, heeft het geografie gegevenstype de volgende beperkingen:
Elke geografie instantie moet binnen één halfrond passen. Er kunnen geen ruimtelijke objecten worden opgeslagen die groter zijn dan een halfrond.
Elke geografie exemplaar van een Open Geospatial Consortium (OGC) Well-Known Text (WKT) of Well-Known Binaire weergave (WKB) die een object produceert dat groter is dan een halfrond, werpt een ArgumentException.
De geografie gegevenstypemethoden die de invoer van twee geografie-instanties vereisen, zoals
STIntersection()
,STUnion()
,STDifference()
enSTSymDifference()
, zullen null retourneren als de resultaten van de methoden niet binnen één halfrond passen.STBuffer()
retourneert ook null als de uitvoer een enkel halfrond overschrijdt.
In SQL Server is FullGlobe een speciaal type vlak dat de hele wereld bedekt. Het heeft een gebied, maar geen randen of hoekpunten.
Buitenste en binnenste ringen in geography
gegevenstype
In de OGC Simple Features for SQL Specification worden buitenste ringen en binnenste ringen besproken, maar dit onderscheid is weinig zinvol voor het geografie van SQL Server gegevenstype; elke ring van een veelhoek kan worden genomen als de buitenste ring.
Zie de volgende documenten voor meer informatie over OGC-specificaties:
- OGC-specificaties, Simple Feature Access Deel 1 - gemeenschappelijke architectuur
- OGC-specificaties, Eenvoudige Functie-toegang Deel 2 - SQL-opties
Cirkelvormige boogsegmenten
Drie instantieerbare typen kunnen cirkelvormige boogsegmenten aannemen: CircularString, CompoundCurveen CurvePolygon. Een cirkelvormig boogsegment wordt gedefinieerd door drie punten in een tweedimensionaal vlak en het derde punt mag niet hetzelfde zijn als het eerste punt. Enkele voorbeelden van cirkelvormige boogsegmenten:
In de eerste twee voorbeelden ziet u typische cirkelvormige boogsegmenten. Let op hoe elk van de drie punten zich op de omtrek van een cirkel bevindt.
Andere twee voorbeelden laten zien hoe een lijnsegment kan worden gedefinieerd als een cirkelvormig boogsegment. Er zijn nog steeds drie punten nodig om het cirkelvormige boogsegment te definiëren in tegenstelling tot een normaal lijnsegment, dat kan worden gedefinieerd door slechts twee punten.
Methoden die worden uitgevoerd op segmenttypen voor cirkelvormige boog, gebruiken rechte lijnsegmenten om de cirkelvormige boog bij benadering te benaderen. Het aantal lijnsegmenten dat wordt gebruikt om de boog bij benadering te bepalen, is afhankelijk van de lengte en kromming van de boog. Z-waarden kunnen worden opgeslagen voor elk van de segmenttypen cirkelvormige boog, maar worden niet gebruikt in de berekeningen.
Notitie
Als Z-waarden worden opgegeven voor cirkelvormige boogsegmenten, moeten ze hetzelfde zijn voor alle punten in het segment van de cirkelvormige boog, zodat ze voor invoer kunnen worden geaccepteerd. Bijvoorbeeld: CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1)
wordt geaccepteerd, maar CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1)
niet wordt geaccepteerd.
Vergelijking van LineStr en CircularString
In dit voorbeeld ziet u hoe u identieke driehoeken met behulp van zowel een LineString-exemplaar als CircularString-exemplaar opslaat:
DECLARE @g1 geometry;
DECLARE @g2 geometry;
SET @g1 = geometry::STGeomFromText('LINESTRING(1 1, 5 1, 3 5, 1 1)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(1 1, 3 1, 5 1, 4 3, 3 5, 2 3, 1 1)', 0);
IF @g1.STIsValid() = 1 AND @g2.STIsValid() = 1
BEGIN
SELECT @g1.ToString(), @g2.ToString()
SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]
END
Voor een CircularString--exemplaar zijn zeven punten vereist om de driehoek te definiëren. LineString-exemplaar vereist slechts vier punten om de driehoek te definiëren. De reden hiervoor is dat een CircularString exemplaar cirkelvormige boogsegmenten en niet lijnsegmenten opslaat. De zijden van de driehoek die zijn opgeslagen in de CircularString-instantie zijn ABC, CDE en EFA. De zijden van de driehoek die zijn opgeslagen in de LineString-instantie zijn AC, CE en EA.
Bekijk het volgende voorbeeld:
SET @g1 = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 4 0)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(0 0, 2 2, 4 0)', 0);
SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length];
Dit is de resultaatset.
LS Length CS Length
5.65685... 6.28318...
CircularString exemplaren gebruiken minder punten om curvegrenzen met een grotere precisie op te slaan dan LineString exemplaren. CircularString exemplaren zijn handig voor het opslaan van kringgrenzen, zoals een zoekstraal van 20 mijl vanaf een bepaald punt. LineString exemplaren zijn geschikt voor het opslaan van grenzen die lineair zijn, zoals een vierkant stadsblok.
Vergelijking van LineStr en CompoundCurve
In de volgende codevoorbeelden ziet u hoe u dezelfde afbeelding opslaat met behulp van LineString en CompoundCurve-exemplaren:
SET @g = geometry::Parse('LINESTRING(2 2, 4 2, 4 4, 2 4, 2 2)');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2), (4 2, 4 4), (4 4, 2 4), (2 4, 2 2))');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2, 4 4, 2 4, 2 2))');
In de vorige voorbeelden konden een LineString-exemplaar of een CompoundCurve-exemplaar de figuur opslaan. In dit volgende voorbeeld wordt een CompoundCurve- gebruikt om een cirkelsegment op te slaan:
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(2 2, 1 3, 0 2),(0 2, 1 0, 2 2))');
Een CompoundCurve exemplaar kan het cirkelvormige boogsegment (2 2, 1 3, 0 2) rechtstreeks opslaan, maar een LineString exemplaar moet de curve omzetten in verschillende kleinere lijnsegmenten.
Vergelijking van CircularStr en CompoundCurve
In het volgende codevoorbeeld wordt getoond hoe het cirkelsegment kan worden opgeslagen in een instantie van CircularString.
DECLARE @g geometry;
SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0)');
SELECT @g.ToString(), @g.STLength();
Als u het cirkelsegment opslaat met behulp van een CircularString exemplaar, moet u drie punten gebruiken voor elk lijnsegment. Als een tussenliggend punt niet bekend is, moet dit worden berekend of moet het eindpunt van het lijnsegment worden verdubbeld, zoals in het volgende fragment wordt weergegeven:
SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 3 6.3246, 3 6.3246, 0 7, -3 6.3246, 0 0, 0 0)');
CompoundCurve-exemplaren staan zowel LineString als CircularString componenten toe, zodat er slechts twee punten bekend hoeven zijn voor de lijnsegmenten van de taartpunt. In dit codevoorbeeld ziet u hoe u een CompoundCurve gebruikt om dezelfde afbeelding op te slaan:
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING( 3 6.3246, 0 7, -3 6.3246), (-3 6.3246, 0 0, 3 6.3246))');
SELECT @g.ToString(), @g.STLength();
Vergelijking van Polygon en CurvePolygon
CurvePolygon instanties kunnen CircularString en CompoundCurve instanties gebruiken bij het definiëren van de buiten- en binnenringen. Veelhoek instanties kunnen niet.
Beperkingen
In de SQL-database in Microsoft Fabric worden de gegevenstypen geografie en geometrie ondersteund, maar kunnen niet worden gespiegeld naar de Fabric OneLake.