SQL Server Geografi-datatypen er i modsætning til andre typer, simpelthen fordi du ikke bruger den ofte. Det er ikke som varchar , int , flyde eller DatoTid findes i hver tabel, i det mindste i én type.
Har vi brug for datatypen SQL Server Geografi? For at give mening om noget nyt, skal vi besvare tre grundlæggende spørgsmål:
• Hvilke problemer løser det ? Svaret ligger i use cases.
• Hvad er det involveret i at studere det? Du vil lære et par grundlæggende definitioner og akronymer. Jeg samlede kun de vigtige ting, så det keder dig ikke.
• Er der eksempler til yderligere at forklare, hvordan det fungerer, og er det nemt at implementere? Vores slags lever med kode. Vi spiser og sover med den. Så vi kommer til at have eksempelkoder i dette indlæg.
Det er ikke et indlæg for at fylde dig med teknisk jargon og syntaks, som det er. Du er god til at gå, når du har knækket det grundlæggende i SQL Server-geografidatatypen. Lyder det godt?
Lad os dykke ned.
Brug tilfælde af geografiske data
Lad os starte med det mest oplagte og det øverste - det generelle udtryk "rumlige data."
Geografiske eller geospatiale data er data om objekter, begivenheder eller fænomener placeret på jordens overflade. Det er med andre ord information proppet på et kort. Tænk for eksempel på Google Maps eller Waze.
Men der er mere:
- Find en virksomheds varevogn via et websted eller en mobilapp.
- Find interessepunkter som nærliggende restauranter, banker eller hospitaler.
- Analyser data om jordskælv, spredning af COVID-19, oversvømmelser eller vejtrafik – geospatial analyse.
Og så videre.
Flere databaseplatforme beskæftiger sig med rumlige data, men vi vil fokusere på kun én.
Hvad er SQL Server Geography Data Type?
Microsoft tilføjede geografi- og geometridatatyper i SQL Server 2008. Geografi repræsenterer data i et koordinatsystem rundt om jorden. Den er også implementeret som en .Net CLR-datatype, som har egenskaber som breddegrad eller længdegrad.
Dette indlæg fokuserer på geografidatatypen og dens anvendelser, især i:
- Interessepunkter, som f.eks. at finde restauranter i nærheden og en prøveforespørgsel.
- Geospatial analyse.
Da dette er en datatype, opretter vi en tabel. Derefter definerer vi en eller flere kolonner som geografi. Og til sidst laver vi et rumligt indeks på disse kolonner.
Når du forespørger i en tabel med en geografikolonne, vil outputtet være binært.
Lad os prøve at udføre et elementært eksempel nedenfor:
VÆLG [CityID],[CityName],[GeoLocation]FRA [Cities]
Figur 1 nedenfor viser resultatsættet:
Når et resultatsæt indeholder geografiske data, vises et Geografiske resultater fanen vises også. Figur 2 illustrerer de rumlige resultater fra forespørgslen ovenfor:
Hvad er der lige sket?
Det ser ud til, at det langt fra er nemt og nyttigt at se resultatsættet, endsige prikkerne langs gitterlinjerne. Jeg viste dig, hvad du kan forvente ved den allerførste SELECT erklæring om geografidatatyper. Det næste afsnit vil udfolde et meget bedre perspektiv.
Oprettelse af SQL Server Geografi-instanser
Du skal bruge en instans til at operere på data med SQL Server-geografidatatypen. Der er fire måder at lave en geografiforekomst på:
- fra en anden geografiforekomst
- ved at bruge en velkendt tekst (WKT)
- ved at bruge en velkendt binær (WKB)
- fra en Geography Markup Language (GML) tekstinput
Lad os fokusere på at bruge en velkendt tekst.
Brug af velkendt tekst (WKT)
Denne repræsentation bygger på Open Geospatial Consortium (OGC). Det tillader udveksling af geografidata i tekstform.
Tag vores tidligere eksempel, men i stedet for et binært output, vil vi konvertere det til en streng:
VÆLG [CityID],[CityName],[GeoLocation].ToString() AS GeoLocationStringFROM [Cities]
Læg mærke til ToString () metode. Det vil konvertere outputtet til strengværdien. Du kan se outputtet i figur 3 nedenfor:
Bedre? Nå, det er stadig kun tal. Men hvad nu hvis jeg fortæller dig, at disse tal er bredde- og længdegrad af disse byer? Det giver mere mening, ikke?
Det er en velkendt tekst (WKT), og den er essentiel, når du lægger dataene ind i kolonnen. Mere om det senere. Nu mangler vi en ting mere at undersøge.
Spatial Reference Identifier (SRID)
Bortset fra en velkendt tekst har hver geografiforekomst en Spatial Reference Identifier (SRID). Det er nødvendigt for at måle geografiforekomster (steder eller punkter) i en kortlægning af rund jord.
Den mest udbredte måleenhed er i meter eller kvadratmeter, angivet med SRID 4326. Alle andre SRID'er kan findes i sys.spatial_reference_systems .
Dine geografikolonner kan have forskellige SRID'er. Bemærk, at når du udfører operationer på to geografiforekomster, som f.eks. at måle deres afstande. Begge forekomster skal have samme SRID, ellers vil det returnere digNULL .
STGeomFromText
Efter at have lært om WKT og SRID, kræver oprettelse af en geografiforekomst en metode kaldet STGeomFromText . Den har følgende syntaks:
geografi::STGeomFromText(
Eksempel:
INSERT INTO Cities(CityName, GeoLocation)VALUES('CITY OF MANILA',geography::STGeomFromText('POINT(14.6077 120.98202)', 4326))
Lad os se parameterværdierne:
'POINT(14.6077 120.98202)' – en velkendt tekst af et punkt på kortet med breddegraden 14.6077 og længdegraden 120.98202. Dette svarer til Manila, Filippinernes hovedstad.
4326 – den geografiske reference-id
Lad os springe direkte ind i eksempler og bruge denne nye perle, vi fandt.
SQL Server Geografi Datatype Praktiske eksempler
Vi kommer til at have to almindelige applikationer til at få dig i gang med geografidata.
Beregning af afstande (nærmeste nabo)
En almindelig applikation i geografiske geografiske data kaldes den nærmeste nabo-forespørgsel. I denne forespørgsel vil du vide, hvor langt eller tæt noget er til et andet objekt eller sted.
I mit indlæg om SQL-grafen beskrev jeg, hvordan en kunde kunne finde de nærliggende restauranter fra den aktuelle placering. Lad os henvise til det eksempel igen:
-- Forespørg efter kundens placering DECLARE @deliveryLocation GEOGRAPHYSELECT @deliveryLocation =Locations.GeoLocationFROM Customers, willReceiveIn, LocationsWHERE MATCH(Customers-(willReceiveIn)->Locations)AND Customers.CustomerID =3-- Forespørg på restauranterne inden for 1000 meter fra kundens placering.VÆLG Restaurants.Name,Restaurants.Description,Restaurants.Opening,Restaurants.Closing,Locations.Description,ROUND(Locations.GeoLocation.STDistance(@deliveryLocation),2) AS DistanceFROM Restaurants, isLocated, LocationsWHERE MATCH(Restauranter-(erLocated)->Locations)AND locations.GeoLocation.STDistance(@deliveryLocation) <=1000ORDER BY Distance
Hemmeligheden bag denne nærmeste naboforespørgsel er STDistance (). Den har brug for to geografiske placeringer:den ene til kunden og en anden til restauranterne inden for 1000 meter fra kundens placering.
Det fede er, at det samme koncept gælder for andre ideer, der involverer to eller flere steder.
Geospatial analyse ved hjælp af Power BI
En anden anvendelse af rumlige data bruger det til geospatial analyse. I dette afsnit har vi et eksempel, hvor vi bruger COVID-19-tilfælde pr. lokation og præsenterer det ved hjælp af Power BI.
(Til en sidebemærkning, her er flere oplysninger om, hvad der er Power BI, og hvordan man installerer det)
Det er gratis at installere Power BI Desktop. En af standardvisualiseringerne er kortvisualiseringen ved hjælp af Bing Maps. Vi har ikke brug for koordinater for kendte steder som lande og amerikanske stater. Se dette i eksemplet nedenfor:
Bemærk det røde felt i figur 4. Bredde- og længdegrad efterlades tomme, men boblerne er afbildet fint på kortet.
Men i det næste eksempel vil vi bruge regioner og byer i Filippinerne. Koordinater er et must for at plotte boblerne korrekt.
HVAD DU BRUGER
Før vi kommer ind på den kødfulde del af rapporten, er her de grundlæggende ting, vi har brug for:
- Power BI Desktop
- Kortvisualisering
- Tabeller og forespørgsler
- Eksempel på data
KLARGØRING AF DATA
Forberedelse af tabeller og visninger
I starten skal vi sætte containerne op til vores data. Så vi kræver følgende tabeller:
- Byer – en liste over byer i Filippinerne kategoriseret efter region.
- Regioner – en liste over områder i Filippinerne
- CityCases – en liste med antallet af sager for hver by.
Nedenfor er tabelstrukturen:
OPRET TABEL [dbo].[Cities]([CityID] [int] IDENTITY(1,1) NOT NULL,[CityName] [varchar](50) NOT NULL,[RegionID] [int] NOT NULL,[GeoLocation] [geografi] NULL, BEGRÆNSNING [PK_Cities] PRIMÆR NØGLE KLUSTERET([CityID] ASC)MED (PAD_INDEX =FRA, STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY =FRA, ALLOW_ROW_LOCKSOWZONAGE_LOCKSOWSE_MINION_LOCKSOWSE_MINION_LOCKSOWSE_MION_LOCKSOW_ [PRIMARY]) PÅ [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOCREATE TABEL [dbo].[Regioner]([RegionID] [int] IDENTITY(1,1) NOT NULL,[Region] [varchar](50) NOT NULL,[ Geografisk placering] [geografi] NULL, BEGRÆNSNING [PK_Regions] PRIMÆR NØGLE KLUNDET([RegionID] ASC) MED (PAD_INDEX =FRA, STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY =FRA, ALLOW_ROW_LOCKS_LOCKS_ON, OFF_LOCKS_ON, QUENT_ON_PAGE_ON, QUENT_ON) ) PÅ [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOCREATE TABEL [dbo].[CityCases]([CityCaseID] [int] IDENTITY(1,1) NOT NULL,[CityID] [int] NOT NULL,[DateReported] [date] NOT NULL,[TotalCases] [int] IKKE NULL,[TotalDeath s] [int] IKKE NULL, BEGRÆNSNING [PK_CityCases] PRIMÆR NØGLE KLUSTERET([CityCaseID] ASC)MED (PAD_INDEX =FRA, STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY =FRA, ALLOW_ROW_LOCKS_ON, ALLOW_ROW_LOCKS_ON, ALLOW_ROW_LOCKS_ON, ALLOW_ROW_LOCKS_ON, OFF_ ]) PÅ [PRIMÆR]GOALTERTABEL [dbo].[CityCases] MED CHECK TILFØJ BEGRÆNSNING [FK_CityCases_Cities] UDENLANDSKE NØGLE([CityID])REFERENCER [dbo].[Cities] ([CityID])GOALTERTABEL [dbos].[CityCases]. ] KONTROLLER BEGRÆNSNING [FK_CityCases_Cities]GO
Da geografidatatypen er ukendt for Power BI Map-visualisering, skal du oprette visninger. Formålet er at eksponere bredde- og længdegraden fra disse søjler. Det gør vi for byerne og regionerne – se nedenfor:
OPRET VISNING vwCityCoordinatesASSELECT CityID,CityName,GeoLocation.Lat AS Latitude,Geolocation.Long AS Longitude,RegionIDFROM ByerCREATE VIEW vwRegionCoordinatesASSELECT RegionID,Region,GeoLocation.Lat AS Latitude,GeoLocation.Long AS
Det er det. lat. og Lang er egenskaber for breddegrad og længdegrad. Det er nu muligt at bruge dem i vores Power BI-rapport.
Opbygning af data
Dernæst skal du bygge dataene til vores tre tabeller.
Mange tak til Filippinernes sundhedsministerium for at gøre datasættet tilgængeligt for offentligheden. Filen er i CSV-format. Filnavnekonventionen er DOH COVID Data Drop_ yyyymmdd – 04 Case Information.CSV.
Sådan får du filen til at blive bedre til at bruge vores eksempel:
- Klik på linket til datasættet.
- Vælg en månedsmappe. August 2020 er i DOH COVID Data (08).
- Vælg en dato. 12. august 2020 er for eksempel i DOH COVID Data Drop_20200812.
- Download DOH COVID Data Drop_ 20200812 – 04 Sagsoplysninger.CSV. Gentag trin 2-4 for at få rapporten for de andre dage.
Desuden skal du importere disse data til SQL Server. Sådan gør du det:
- Åbn CSV-filen i Excel.
- Tilføj en kolonne Datorapporteret og udfyld alle poster med den tilsvarende dato. I dette tilfælde 08/10/2020.
- Gem den som en Excel-fil (.xlsx).
- Eksporter Excel-filen til SQL Server til en tabel kaldet covid_ph .
Nu hvor dataene er klar i SQL Server, er den næste opgave at køre følgende i SSMS-forespørgselseditor:
INSERT INTO CityCases(CityID, DateReported, TotalCases, TotalDeaths)SELECT DISTINCT c.CityID,cp.DateReported,(SELECT COUNT(*) FROM covid_ph cp1 WHERE cp1.CityMunRes =cp.CityMunReported =.CityMunReported AND cp.CityMunReported cp.DateReported) AS TotalCases,(SELECT COUNT(*) FROM covid_ph cp1 WHERE cp1.CityMunRes =cp.CityMunRes AND cp1.DateReported =cp.DateReported AND cp1.RemovalType='DIED') AS Total_OphON cpFINs covid_OphON cpFIN .CityMunRes =c.CityNameORDER BY cp.DateReported
I mellemtiden er der ingen koordinater i det datasæt, vi brugte. Så jeg har manuelt tilføjet bredde- og længdegraden for regioner og byer fra latlongdata.com.
Her er dataene for Regioner :
INSERT INTO Regions(Region, GeoLocation)VALUES('BARMM',geography::STGeomFromText('POINT(121.987 6.42964)', 4326)),('CAR',geography::STGeomFromText('POINT( 121.466 17.4737)', 4326)),('CARAGA',geography::STGeomFromText('POINT(125.492 9.78604)', 4326)),('NCR',geography::STGeomFromText('0.59'POINT(125.492 9.78604)" )),('Region I:Ilocos Region',geography::STGeomFromText('POINT(120.381 17.5553)', 4326)),('Region II:Cagayan Valley',geografi::STGeomFromText('POINT(121.874) , 4326)),('Region III:Central Luzon',geography::STGeomFromText('POINT(120.712 15.4828)', 4326)),('Region IV-A:CALABARZON',geografi::STGeomFromText('POINT('POINT('POINT('POINT(' 14.1008)', 4326)),('Region IV-B:MIMAROPA',geography::STGeomFromText('POINT(118.736 9.84321)', 4326)),('Region IX:Zamboanga Peninsula',geografi::STGeografi::ST POINT(123.259 8.15408)', 4326)),('Region V:Bicol Region',geography::STGeomFromText('POINT(123.414 13.421)', 4326)),('Region VI:Western Visayas',geromTextGeomography:TextGeomography:('PUNKT(12 2.537 11.005)', 4326)),('Region VII:Central Visayas',geography::STGeomFromText('POINT(124.064 9.81687)', 4326)),('Region VIII:Eastern Visayas',geomTexSTGeomTexSTGeomTexSTGeomt:POINT(125.039 12.2446)', 4326)),('Region X:Northern Mindanao',geography::STGeomFromText('POINT(124.686 8.02016)', 4326)),('Region XI:DavaoText',Geografi::FSTt Region ('POINT(126.089 7.30416)', 4326)),('Region XII:SOCCSKSARGEN',geography::STGeomFromText('POINT(124.686 6.27069)', 4326))
Her er dataene fra en delvis liste over byer for Byer tabel:
INSERT INTO Cities(CityName, RegionID, GeoLocation)VALUES('CALOOCAN CITY',4,geography::STGeomFromText('POINT(120.967 14.6488)', 4326)),('CITY OF LAS PIÃ'AS ',4,geografi::STGeomFromText('POINT(120.999 14.4325)', 4326)),('CITY OF MAKATI',4,geografi::STGeomFromText('POINT(121.033 14.5502)6)',(3'2CITY)',(3'2CITY AF MALABON',4,geografi::STGeomFromText('POINT(120.957 14.6633)', 4326)),('CITY OF MANDALUYONG',4,geografi::STGeomFromText('POINT(121.039 12)',5),(7) 'CITY OF MANILA',4,geografi::STGeomFromText('POINT(120.982 14.6077)', 4326)),('CITY OF MARIKINA',4,geografi::STGeomFromText('POINT(121.097 32)6)')40.097 14.6) ,('MUNTINLUPABY',4,geografi::STGeomFromText('POINT(121.05 14.4209)', 4326)),('NAVOTASBY',4,geografi::STGeomFromText('POINT(120.956',673 120.933) )),('CITY OF PARAÃ'AQUE',4,geography::STGeomFromText('POINT(121.017 14.4664)', 4326)),('CITY OF PASIG',4,geography::STGeomFromText('POINT(121.0617) )', 4326)),('CITY OF SAN JUAN',4,geography::STGeomFromTe xt('POINT(121.037 14.6001)', 4326)),('CITY OF VALENZUELA',4,geography::STGeomFromText('POINT(120.967 14.6823)', 4326)),('PASAY CITY:' :STGeomFromText('POINT(121 14.5505)', 4326)),('PATEROS',4,geography::STGeomFromText('POINT(121.071 14.5487)', 4326)),('QUEZON CITY:',4 STGeomFromText('POINT(121.033 14.633)', 4326)),('TAGUIG CITY',4,geografi::STGeomFromText('POINT(121.062 14.5216)', 4326)),('ALFONSO:geomFtography:ext,8ALFONSO:T, ('POINT(120.861 14.1214)', 4326)),('AMADEO',8,geography::STGeomFromText('POINT(120.922 14.1693)', 4326)),('BACOOR CITY',8,geografi::STtGeografi::ST 'POINT(120.974 14.413)', 4326)),('CARMONA',8,geography::STGeomFromText('POINT(121.041 14.3108)', 4326)),('CAVITE CITY',8,geography::STGeom('geografi::STGeom POINT(120.897 14.4791)', 4326)),('CITY OF DASMARIÃ'AS',8,geography::STGeomFromText('POINT(120.959 14.299)', 4326)),('CITY OF GENERAL TRIAS',8,geography ::STGeomFromText('POINT(120.907 14.3214)', 4326)),('GEN. MARIANO ALVAREZ',8,geografi::STGeomFromText('POINT(121.013 14.3051)', 4326)),('GENERAL EMILIO AGUINALDO',8,geografi::STGeomFromText('POINT(120.792 414)),(120.792 414)),(192 314) 'IMUS CITY',8,geografi::STGeomFromText('POINT(120.941 14.4064)', 4326)),('INDANG',8,geography::STGeomFromText('POINT(120.873 14.192))',('4326) KAWIT',8,geography::STGeomFromText('POINT(120.904 14.441)', 4326)),('MAGALLANES',8,geography::STGeomFromText('POINT(120.746 14.1583)6)',(3'2MARAGA ,8,geografi::STGeomFromText('POINT(120.735 14.253)', 4326)),('MENDEZ (MENDEZ-NUÃ'EZ)',8,geografi::STGeomFromText('POINT(120.902 14.1326')) 4312) ,('NAIC',8,geography::STGeomFromText('POINT(120.792 14.2965)', 4326)),('NOVELETA',8,geography::STGeomFromText('POINT(120.88 14.4272)6)',(' 'ROSARIO',8,geography::STGeomFromText('POINT(120.857 14.414)', 4326)),('SILANG',8,geography::STGeomFromText('POINT(120.969 14.2142AYTA6)',(43' BY',8,geografi::STGeomFromText('POINT(120.962 14.1153)', 4326)),('TANZA',8,geografi::S TGeomFromText('POINT(120.85 14.3429)', 4326)),('TERNATE',8,geography::STGeomFromText('POINT(120.678 14.2714)', 4326)),('TRECA, MARTIRES CITY)', (8. geography::STGeomFromText('POINT(120.868 14.2822)', 4326))
Nu hvor dataene er klar, er vi klar til at udarbejde rapporten.
UDARBEJDELSE AF RAPPORTEN
Før vi begynder, har vi brug for to sider med rapporter. Den ene side er for data pr. region, og den anden side er pr. by.
COVID-19-rapport pr. region
Her er enkle trin til oprettelse af rapporten pr. region:
- Opret forbindelse til SQL Server fra Power BI. Angiv serveren og databasen.
- Vælg de tabeller og visninger, du har brug for til rapporten.
3. Definer relationerne – se figur 6 nedenfor. Besøg denne side for at få flere detaljer om definition af relationer i Power BI.
4. Klik på kortvisualiseringen, og udfyld egenskaberne. Bind egenskaberne for breddegrad og længdegrad fra vwRegionCoordinates . Derefter værktøjstip fra vwRegionCoordinates's Region kolonne. Og endelig, størrelsen fra CityCases ‘ TotalCases kolonne. Se figur 7 nedenfor:
- Tilføj en Slicer, og bind den til DateReported fra CityCases tabel.
- Indsæt et kort, og bind det til TotalCases fra CityCases tabel
- Tilføj et klynget søjlediagram. Bind egenskaben Axis til Region kolonne fra vwRegionCoordinates . Bind derefter værdierne til TotalCases kolonne fra CityCases . Se figur 8 nedenfor:
Efter ovenstående trin vil du se det endelige udseende. Det skal ligne figur 9 nedenfor:
COVID-19-rapport pr. by
Første side er klar. Det burde ikke være svært at tilføje den næste side for rapporten pr. by.
Her er trinene:
- Tilføj en ny side ved at klikke på + i den nederste del af vinduet og omdøb den pr. by (Filippinerne).
- Inkluder en udsnitsmaskine, og bind den til regionen fra vwRegionCoordinates .
- Indsæt en anden udskærer, og bind den til Datorapporteret fra CityCases .
- Tilføj et kort, og bind det til TotalCases fra CityCases .
- Indsæt en kortvisualisering. Du definerer egenskaberne for breddegrad og længdegrad fra vwCityCoordinates . Værktøjstip er fra vwCityCoordinates's Bynavn kolonne, og størrelsen er fra CityCases ‘ TotalCases kolonne.
- Tilføj et klynget søjlediagram, og bind aksen til Bynavn kolonne fra vwCityCoordinates og værdier til TotalCases fra CityCases .
Det endelige udseende af rapporten pr. by skal svare til figur 10 nedenfor:
Hvad er nu det store ved at bruge kort til analyse sammenlignet med at se på søjle- eller linjediagrammer?
Først og fremmest er det ikke kun for æstetik og for at imponere dit publikum med iøjnefaldende rapporter. Endnu vigtigere, det giver dem en klarere forståelse af dataene i forhold til en placering.
I vores eksempel kan du se, hvor pandemiproblemet er mere udbredt baseret på hvor store boblerne er. Desuden kan vi på et øjeblik se og sammenligne antallet af sager forskellige steder i forhold til hinanden. Dette vil også hjælpe embedsmænd til at træffe bedre beslutninger.
Vores rapporteksempel er for simpel, men den viser, hvordan SQL Server-geografidatatyper kan hjælpe dig med geospatial analyse.
Konklusion
Har du forstået, hvad der er i det for dig, når du bruger geografiske datatyper?
- Spatiale eller geospatiale data står for dataene om punkter, der er placeret på jordens overflade.
- Det kan bruges til "nærmeste nabo"-forespørgsel, der søger efter de nærliggende biografer, restauranter, klubber osv.
- Det er også praktisk til geospatial dataanalyse, som den rapport, vi oprettede i Power BI.
- De grundlæggende elementer i at skabe en geografiforekomst er ting som velkendt tekst (WKT), spatial reference identifier (SRID) og metoden STGeomFromText .
I dette indlæg berørte vi blot en del af, hvad rumlige data i SQL Server kan gøre for dig. Du bruger muligvis ikke dem alle på én gang, men de mest almindelige use cases er her for at komme i gang. Hvorfor ikke udforske mere fra referencerne fra Microsoft nedenfor?
- Oversigt over geografiske data
- Geografiske datatyper
- Indeksering af geografiske data
Hvis du kan lide dette opslag, bedes du dele det med dine foretrukne sociale medieplatforme.