Типът данни на SQL Server Geography е за разлика от други типове, просто защото не го използвате често. Не е като varchar ,вх ,плуване или DateTime присъства във всяка таблица, поне в един тип.
Нуждаем ли се от типа данни на SQL Server Geography? За да разберем нещо ново, трябва да отговорим на три основни въпроса:
• Какви проблеми решава ? Отговорът се крие в случаите на употреба.
• Какви неща са включени в изучаването му? Ще научите няколко основни определения и акроними. Събрах само важните неща, така че няма да ви отегчава.
• Има ли примери за допълнително обяснение как работи и лесно ли е за прилагане? Нашият вид живее с код. Ядем и спим с него. И така, в тази публикация ще имаме примерни кодове.
Това не е публикация, за да ви тъпчем с технически жаргон и синтаксис, каквито са. Готово е да тръгнете, след като разбиете основите на типа данни за география на SQL Server. Звучи добре?
Нека се потопим.
Случаи на използване на пространствени данни
Нека започнем с най-очевидното и най-горното – общия термин „пространствени данни“.
Пространствени или геопространствени данни са данните за обекти, събития или явления, разположени на земната повърхност. С други думи, това е информация, натъпкана на карта. Помислете за Google Maps или Waze, например.
Но има още:
- Намерете фирмен камион за доставка чрез уебсайт или мобилно приложение.
- Намерете интересни места като близки ресторанти, банки или болници.
- Анализирайте данни за земетресение, разпространение на COVID-19, наводнения или пътен трафик – геопространствен анализ.
И така нататък.
Няколко платформи за бази данни се занимават с пространствени данни, но ние ще се съсредоточим само върху една.
Какво е тип географски данни на SQL Server?
Microsoft добави типове данни за география и геометрия в SQL Server 2008. Географията представлява данни в кръгла земна координатна система. Той също така е реализиран като тип данни .Net CLR, който има свойства като географска ширина или дължина.
Тази публикация се фокусира върху типа данни по география и техните приложения, особено в:
- Точки на интерес, като намиране на близки ресторанти и примерна заявка.
- Геопространствен анализ.
Тъй като това е тип данни, създаваме таблица. След това дефинираме колона или колони като география. И накрая, ние правим пространствен индекс на тези колони.
Когато правите заявка към таблица с географска колона, изходът ще бъде в двоичен вид.
Нека се опитаме да изпълним елементарен пример по-долу:
SELECT
[CityID]
,[CityName]
,[GeoLocation]
FROM [Cities]
Фигура 1 по-долу показва набора от резултати:
Когато набор от резултати включва пространствени данни, Пространствени резултати ще се появи и раздел. Фигура 2 илюстрира пространствените резултати от заявката по-горе:
Сега, какво се случи току-що?
Изглежда, че гледането на набора от резултати далеч не е лесно и полезно, да не говорим за точките по линиите на мрежата. Показах ви какво да очаквате още при първия SELECT изявление за типовете данни за география. Следващият раздел ще разкрие много по-добра перспектива.
Създаване на географски екземпляри на SQL Server
Имате нужда от екземпляр, за да работите с данни с типа данни за география на SQL Server. Има четири начина за създаване на географски екземпляр:
- от друг географски екземпляр
- използвайки добре познат текст (WKT)
- използвайки добре познат двоичен файл (WKB)
- от въведен текст от език за маркиране на географски език (GML)
Нека се съсредоточим върху използването на добре познат текст.
Използване на добре познат текст (WKT)
Това представителство се основава на Отворения геопространствен консорциум (OGC). Позволява обмен на географски данни в текстова форма.
Вземете предишния ни пример, но вместо двоичен изход, ние ще го преобразуваме в низ:
SELECT
[CityID]
,[CityName]
,[GeoLocation].ToString() AS GeoLocationString
FROM [Cities]
Обърнете внимание на ToString () метод. Той ще преобразува изхода в стойността на низа. Можете да видите изхода на фигура 3 по-долу:
По-добре? Е, все още са само цифри. Но какво ще стане, ако ви кажа, че тези числа са географска ширина и дължина на тези градове? Има повече смисъл, нали?
Това е добре познат текст (WKT) и е от съществено значение, когато поставите данните в колоната. Повече за това по-късно. Сега трябва да разгледаме още нещо.
Пространствен референтен идентификатор (SRID)
Освен добре познат текст, всеки географски екземпляр има пространствен референтен идентификатор (SRID). Необходим е за измерване на географски екземпляри (места или точки) в карта на кръгла земя.
Най-разпространената мерна единица е в метри или квадратни метри, обозначени с SRID 4326. Всички други SRID могат да бъдат намерени в sys.spatial_reference_systems .
Вашите географски колони могат да имат различни SRID. Имайте предвид, че когато извършвате операции върху два географски екземпляра, като измерване на техните разстояния. И двата екземпляра трябва да имат един и същ SRID или ще ви върне NULL .
STGeomFromText
След като научите за WKT и SRID, създаването на географски екземпляр изисква метод, наречен STGeomFromText . Той има следния синтаксис:
geography::STGeomFromText(
Пример:
INSERT INTO Cities
(CityName, GeoLocation)
VALUES
('CITY OF MANILA',geography::STGeomFromText('POINT(14.6077 120.98202)', 4326))
Нека да проверим стойностите на параметрите:
„ТОЧКА(14.6077 120.98202)“ – добре познат текст на точка в картата с географска ширина 14.6077 и дължина 120.98202. Това съответства на Манила, столицата на Филипините.
4326 – идентификаторът на пространствената препратка
Нека да преминем директно към примерите и да използваме този нов скъпоценен камък, който открихме.
Практически примери за тип данни за географски данни на SQL сървър
Ще имаме две общи приложения, които да ви накарат да работите с географски данни.
Изчисляване на разстояния (най-близкия съсед)
Често срещано приложение в географските пространствени данни се нарича заявка за най-близкия съсед. В тази заявка искате да знаете колко далеч или близо е нещо до друг обект или място.
В моя публикация за SQL графиката описах как клиент може да намери близките ресторанти от текущото местоположение. Нека се обърнем отново към този пример:
-- Query the location of the customer
DECLARE @deliveryLocation GEOGRAPHY
SELECT @deliveryLocation = Locations.GeoLocation
FROM Customers, willReceiveIn, Locations
WHERE MATCH(Customers-(willReceiveIn)->Locations)
AND Customers.CustomerID = 3
-- Query the restaurants within 1000 meters from the location of the customer
SELECT
Restaurants.Name
,Restaurants.Description
,Restaurants.Opening
,Restaurants.Closing
,Locations.Description
,ROUND(Locations.GeoLocation.STDistance(@deliveryLocation),2) AS Distance
FROM Restaurants, isLocated, Locations
WHERE MATCH(Restaurants-(isLocated)->Locations)
AND locations.GeoLocation.STDistance(@deliveryLocation) <= 1000
ORDER BY Distance
Тайната на тази заявка за най-близкия съсед е STDistance (). Необходими са му две географски местоположения:едното за клиента и другото за ресторантите в рамките на 1000 метра от местоположението на клиента.
Страхотното е, че същата концепция важи и за други идеи, включващи две или повече места.
Геопространствен анализ с помощта на Power BI
Друго приложение на пространствените данни е използването им за геопространствен анализ. В този раздел имаме пример за използване на случаи на COVID-19 за местоположение и представяне с помощта на Power BI.
(От една страна, ето още информация за това какво е Power BI и как да го инсталирате)
Инсталирането на Power BI Desktop е безплатно. Една от визуализациите по подразбиране е визуализацията на картата с помощта на Bing Maps. Не се нуждаем от координати за известни местоположения като държави и щати на САЩ. Вижте това в примера по-долу:
Обърнете внимание на червеното поле на фигура 4. Географската ширина и дължина са оставени празни, но мехурчетата са начертани на картата добре.
В следващия пример обаче ще използваме региони и градове във Филипините. Координатите са задължителни за правилното начертаване на мехурчетата.
КАКВО ВИ ТРЯБВА
Преди да преминем към месестата част на отчета, ето основните неща, от които се нуждаем:
- Power BI Desktop
- Визуализация на картата
- Таблици и заявки
- Примерни данни
ПОДГОТОВКА НА ДАННИТЕ
Подготовка на таблиците и изгледите
В началото трябва да настроим контейнерите за нашите данни. И така, ние се нуждаем от следните таблици:
- Градове – списък на градовете във Филипините, категоризирани по региони.
- Региони – списък на областите във Филипините
- CityCase – списък, съдържащ броя на делата за всеки град.
По-долу е структурата на таблицата:
CREATE TABLE [dbo].[Cities](
[CityID] [int] IDENTITY(1,1) NOT NULL,
[CityName] [varchar](50) NOT NULL,
[RegionID] [int] NOT NULL,
[GeoLocation] [geography] NULL,
CONSTRAINT [PK_Cities] PRIMARY KEY CLUSTERED
(
[CityID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE TABLE [dbo].[Regions](
[RegionID] [int] IDENTITY(1,1) NOT NULL,
[Region] [varchar](50) NOT NULL,
[GeoLocation] [geography] NULL,
CONSTRAINT [PK_Regions] PRIMARY KEY CLUSTERED
(
[RegionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE TABLE [dbo].[CityCases](
[CityCaseID] [int] IDENTITY(1,1) NOT NULL,
[CityID] [int] NOT NULL,
[DateReported] [date] NOT NULL,
[TotalCases] [int] NOT NULL,
[TotalDeaths] [int] NOT NULL,
CONSTRAINT [PK_CityCases] PRIMARY KEY CLUSTERED
(
[CityCaseID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[CityCases] WITH CHECK ADD CONSTRAINT [FK_CityCases_Cities] FOREIGN KEY([CityID])
REFERENCES [dbo].[Cities] ([CityID])
GO
ALTER TABLE [dbo].[CityCases] CHECK CONSTRAINT [FK_CityCases_Cities]
GO
Тъй като типът на географските данни е непознат за визуализацията на Power BI Map, трябва да създадете изгледи. Целта е да се разкрият географската ширина и дължина от тези колони. Правим това за градовете и регионите – вижте по-долу:
CREATE VIEW vwCityCoordinates
AS
SELECT
CityID
,CityName
,GeoLocation.Lat AS Latitude
,Geolocation.Long AS Longitude
,RegionID
FROM Cities
CREATE VIEW vwRegionCoordinates
AS
SELECT
RegionID
,Region
,GeoLocation.Lat AS Latitude
,GeoLocation.Long AS Longitude
FROM Regions
Това е. Lat и Дълги са свойства за географска ширина и дължина. Вече е възможно да ги използвате в нашия отчет за Power BI.
Изграждане на данните
След това трябва да изградите данните за нашите три таблици.
Много благодаря на Министерството на здравеопазването на Филипините за предоставянето на набора от данни за обществеността. Файлът е във формат CSV. Конвенцията за именуване на файлове е DOH COVID Data Drop_ yyyymmdd – 04 Case Information.CSV.
Ето как да получите файла, за да получите по-добър практически опит с нашия пример:
- Щракнете върху връзката към набора от данни.
- Изберете папка за месец. Август 2020 г. е в DOH COVID Data (08).
- Изберете дата. 12 август 2020 г. например е в DOH COVID Data Drop_20200812.
- Изтеглете DOH COVID Data Drop_ 20200812 – 04 Case Information.CSV. Повторете стъпки 2-4, за да получите отчета за другите дни.
Освен това трябва да импортирате тези данни в SQL Server. Ето как да го направите:
- Отворете CSV файла в Excel.
- Добавете колона DateReported и попълнете всички записи със съответната дата. В този случай 08.10.2020 г.
- Запазете го като файл на Excel (.xlsx).
- Експортирайте файла на Excel в SQL Server в таблица, наречена covid_ph .
Сега, когато данните са готови в SQL Server, следващата задача е да изпълните следното в редактора на SSMS заявки:
INSERT INTO CityCases
(CityID, DateReported, TotalCases, TotalDeaths)
SELECT DISTINCT
c.CityID
,cp.DateReported
,(SELECT COUNT(*) FROM covid_ph cp1 WHERE cp1.CityMunRes = cp.CityMunRes AND
cp1.DateReported = 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 TotalDeaths
FROM covid_ph cp
INNER JOIN Cities c ON cp.CityMunRes = c.CityName
ORDER BY cp.DateReported
Междувременно в набора от данни, който използвахме, няма координати. И така, добавих ръчно географската ширина и дължина на регионите и градовете от latlongdata.com.
Ето данните за Региони :
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('POINT(120.984 14.5995)', 4326)),
('Region I: Ilocos Region',geography::STGeomFromText('POINT(120.381 17.5553)', 4326)),
('Region II: Cagayan Valley',geography::STGeomFromText('POINT(121.811 16.9754)', 4326)),
('Region III: Central Luzon',geography::STGeomFromText('POINT(120.712 15.4828)', 4326)),
('Region IV-A: CALABARZON',geography::STGeomFromText('POINT(121.079 14.1008)', 4326)),
('Region IV-B: MIMAROPA',geography::STGeomFromText('POINT(118.736 9.84321)', 4326)),
('Region IX: Zamboanga Peninsula',geography::STGeomFromText('POINT(123.259 8.15408)', 4326)),
('Region V: Bicol Region',geography::STGeomFromText('POINT(123.414 13.421)', 4326)),
('Region VI: Western Visayas',geography::STGeomFromText('POINT(122.537 11.005)', 4326)),
('Region VII: Central Visayas',geography::STGeomFromText('POINT(124.064 9.81687)', 4326)),
('Region VIII: Eastern Visayas',geography::STGeomFromText('POINT(125.039 12.2446)', 4326)),
('Region X: Northern Mindanao',geography::STGeomFromText('POINT(124.686 8.02016)', 4326)),
('Region XI: Davao Region',geography::STGeomFromText('POINT(126.089 7.30416)', 4326)),
('Region XII: SOCCSKSARGEN',geography::STGeomFromText('POINT(124.686 6.27069)', 4326))
Ето данните от частичен списък с градове за Градове таблица:
INSERT INTO Cities
(CityName, RegionID, GeoLocation)
VALUES
('CALOOCAN CITY',4,geography::STGeomFromText('POINT(120.967 14.6488)', 4326)),
('CITY OF LAS PIÑAS',4,geography::STGeomFromText('POINT(120.999 14.4325)', 4326)),
('CITY OF MAKATI',4,geography::STGeomFromText('POINT(121.033 14.5502)', 4326)),
('CITY OF MALABON',4,geography::STGeomFromText('POINT(120.957 14.6633)', 4326)),
('CITY OF MANDALUYONG',4,geography::STGeomFromText('POINT(121.039 14.5771)', 4326)),
('CITY OF MANILA',4,geography::STGeomFromText('POINT(120.982 14.6077)', 4326)),
('CITY OF MARIKINA',4,geography::STGeomFromText('POINT(121.097 14.6409)', 4326)),
('CITY OF MUNTINLUPA',4,geography::STGeomFromText('POINT(121.05 14.4209)', 4326)),
('CITY OF NAVOTAS',4,geography::STGeomFromText('POINT(120.933 14.6775)', 4326)),
('CITY OF PARAÑAQUE',4,geography::STGeomFromText('POINT(121.017 14.4664)', 4326)),
('CITY OF PASIG',4,geography::STGeomFromText('POINT(121.061 14.5876)', 4326)),
('CITY OF SAN JUAN',4,geography::STGeomFromText('POINT(121.037 14.6001)', 4326)),
('CITY OF VALENZUELA',4,geography::STGeomFromText('POINT(120.967 14.6823)', 4326)),
('PASAY CITY',4,geography::STGeomFromText('POINT(121 14.5505)', 4326)),
('PATEROS',4,geography::STGeomFromText('POINT(121.071 14.5487)', 4326)),
('QUEZON CITY',4,geography::STGeomFromText('POINT(121.033 14.633)', 4326)),
('TAGUIG CITY',4,geography::STGeomFromText('POINT(121.062 14.5216)', 4326)),
('ALFONSO',8,geography::STGeomFromText('POINT(120.861 14.1214)', 4326)),
('AMADEO',8,geography::STGeomFromText('POINT(120.922 14.1693)', 4326)),
('BACOOR CITY',8,geography::STGeomFromText('POINT(120.974 14.413)', 4326)),
('CARMONA',8,geography::STGeomFromText('POINT(121.041 14.3108)', 4326)),
('CAVITE CITY',8,geography::STGeomFromText('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,geography::STGeomFromText('POINT(121.013 14.3051)', 4326)),
('GENERAL EMILIO AGUINALDO',8,geography::STGeomFromText('POINT(120.792 14.1931)', 4326)),
('IMUS CITY',8,geography::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)', 4326)),
('MARAGONDON',8,geography::STGeomFromText('POINT(120.735 14.253)', 4326)),
('MENDEZ (MENDEZ-NUÑEZ)',8,geography::STGeomFromText('POINT(120.902 14.1312)', 4326)),
('NAIC',8,geography::STGeomFromText('POINT(120.792 14.2965)', 4326)),
('NOVELETA',8,geography::STGeomFromText('POINT(120.88 14.4279)', 4326)),
('ROSARIO',8,geography::STGeomFromText('POINT(120.857 14.414)', 4326)),
('SILANG',8,geography::STGeomFromText('POINT(120.969 14.2142)', 4326)),
('TAGAYTAY CITY',8,geography::STGeomFromText('POINT(120.962 14.1153)', 4326)),
('TANZA',8,geography::STGeomFromText('POINT(120.85 14.3429)', 4326)),
('TERNATE',8,geography::STGeomFromText('POINT(120.678 14.2714)', 4326)),
('TRECE MARTIRES CITY (CAPITAL)',8,geography::STGeomFromText('POINT(120.868 14.2822)', 4326))
След като всички данни са готови, ние сме готови да подготвим отчета.
ПОДГОТОВКА НА ДОКЛАДА
Преди да започнем, имаме нужда от две страници отчети. Една страница е за данните за регион, а другата е за град.
Отчет за COVID-19 по регион
Ето лесни стъпки за създаване на отчет по регион:
- Свържете се със SQL Server от Power BI. Посочете сървъра и базата данни.
- Изберете таблиците и изгледите, от които се нуждаете за отчета.
3. Дефинирайте връзките – вижте фигура 6 по-долу. За повече подробности относно дефинирането на връзки в Power BI посетете тази страница.
4. Щракнете върху визуализацията на картата и попълнете свойствата. Свържете свойствата за географска ширина и дължина от vwRegionCoordinates . След това подсказката от vwRegionCoordinates Регион колона. И накрая, Размерът от CityCases „TotalCases колона. Вижте Фигура 7 по-долу:
- Добавете Slicer и го свържете с DateReported отCityCases маса.
- Поставете карта и я свържете с TotalCases отCityCases таблица
- Добавяне на клъстерна лентова диаграма. Свържете свойството Axis към Region колона от vwRegionCoordinates . След това свържете стойностите с TotalCases колона от CityCases . Вижте фигура 8 по-долу:
След горните стъпки ще видите окончателния вид. Трябва да е подобно на фигура 9 по-долу:
Отчет за COVID-19 по град
Първата страница е готова. Добавянето на следващата страница за отчета по град не би трябвало да е трудно.
Ето стъпките:
- Добавете нова страница, като щракнете върху + в долната част на прозореца и я преименувате на град (Филипини).
- Включете разделител и го свържете към региона от vwRegionCoordinates .
- Вмъкнете друг разделител и го свържете с DateReported отCityCases .
- Добавете карта и я свържете с TotalCases от CityCases .
- Вмъкнете визуализация на карта. Вие дефинирате свойствата за географска ширина и дължина от vwCityCoordinates . Подсказката е от vwCityCoordinates Име на град колона, а размерът е от CityCases „TotalCases колона.
- Добавете клъстерирана лентова диаграма и свържете оста с Име на град колона от vwCityCoordinates и стойности към TotalCases отCityCases .
Крайният вид на отчета по град трябва да бъде подобен на фигура 10 по-долу:
Сега, каква е голямата работа в използването на карти за анализ в сравнение с разглеждането на лентови или линейни диаграми?
На първо място, не е само за естетика и да впечатлите аудиторията си с привличащи вниманието доклади. По-важното е, че им дава по-ясно разбиране на данните по отношение на местоположение.
В нашия пример можете да видите къде проблемът с пандемията е по-широко разпространен въз основа на това колко големи са мехурчетата. Освен това можем да видим и сравним с един поглед броя на случаите на различни места един спрямо друг. Това също ще помогне на държавните служители да вземат по-добри решения.
Извадката на нашия отчет е твърде проста, но демонстрира как типовете географски данни на SQL Server могат да ви помогнат при геопространствен анализ.
Заключение
Разбрахте ли какво има за вас, когато използвате тип пространствени данни по география?
- Пространствени или геопространствени данни означават данните за точки, разположени на повърхността на Земята.
- Може да се използва за заявка „най-близкият съсед“ за търсене на близките кина, ресторанти, клубове и др.
- Той е удобен и за анализ на геопространствени данни, като отчета, който създадохме в Power BI.
- Основните елементи при създаването на географски екземпляр са неща като добре познат текст (WKT), пространствен референтен идентификатор (SRID) и методът STGeomFromText .
В тази публикация докоснахме само част от това, което пространствените данни в SQL Server могат да направят за вас. Може да не ги използвате всички наведнъж, но най-често срещаните случаи на употреба са тук, за да започнете. Защо не разгледате повече от препратките от Microsoft по-долу?
- Общ преглед на пространствените данни
- Типове пространствени данни
- Индексиране на пространствени данни
Ако ви харесва тази публикация, моля, споделете я с любимите си социални медийни платформи.