sql >> データベース >  >> RDS >> Sqlserver

SQLServerの地理データ型を理解する方法

    SQL Server Geographyデータ型は、頻繁に使用しないという理由だけで他の型とは異なります。 varcharとは異なります 、 int フロート 、または DateTime すべてのテーブルに、少なくとも1つのタイプで存在します。

    SQL Server Geographyデータ型が必要ですか?何か新しいことを理解するには、3つの基本的な質問に答える必要があります。

    どのような問題を解決しますか ?答えはユースケースにあります。
    それを研究するために関係することは何ですか? いくつかの基本的な定義と頭字語を学びます。重要なものだけを集めたので、飽きることはありません。
    それがどのように機能し、実装が簡単かをさらに説明する例はありますか? 私たちの種類はコードとともに生きています。一緒に食べて寝ます。そのため、この投稿にはサンプルコードが含まれています。

    技術用語と構文をそのまま詰め込むための投稿ではありません。 SQL Serverの地理データ型の基本を理解したら、準備は完了です。いいですね

    飛び込みましょう。

    空間データのユースケース

    最も明白でトップの「空間データ」という一般的な用語から始めましょう。

    空間データまたは地理空間データは、地球の表面にあるオブジェクト、イベント、または現象に関するデータです。つまり、地図に詰め込まれた情報です。たとえば、GoogleマップやWazeについて考えてみてください。

    しかし、それだけではありません:

    • ウェブサイトまたはモバイルアプリから会社の配達用トラックを探します。
    • 近くのレストラン、銀行、病院などの名所を見つけましょう。
    • 地震、COVID-19の蔓延、洪水、または道路交通に関するデータを分析します–地理空間分析。

    など。

    いくつかのデータベースプラットフォームが空間データを処理していますが、ここでは1つだけに焦点を当てます。

    SQL Serverの地理データ型とは何ですか?

    Microsoftは、SQL Server 2008に地理およびジオメトリデータ型を追加しました。地理は、丸い地球の座標系でデータを表します。また、緯度や経度などのプロパティを持つ.NetCLRデータ型として実装されています。

    この投稿では、地理データタイプとそのアプリケーション、特に次の分野に焦点を当てています。

    • 近くのレストランの検索やサンプルクエリなどの関心のあるポイント。
    • 地理空間分析。

    これはデータ型なので、テーブルを作成します。次に、1つまたは複数の列を地理として定義します。そして最後に、これらの列に空間インデックスを作成します。

    地理列を含むテーブルをクエリすると、出力はバイナリになります。

    以下の基本的な例を実行してみましょう:

      SELECT [CityID]、[CityName]、[GeoLocation] FROM [Cities]  

    下の図1は、結果セットを示しています。

    結果セットに空間データが含まれている場合、空間結果 タブも表示されます。図2は、上記のクエリの空間結果を示しています。

    さて、何が起こったのですか?

    グリッド線に沿った点は言うまでもなく、結果セットを表示することは簡単で便利とはほど遠いようです。最初のSELECTで何を期待するかを示しました 地理データ型に関するステートメント。次のセクションでは、はるかに優れた視点を展開します。

    SQLServer地理インスタンスの作成

    SQLServerの地理データ型のデータを操作するにはインスタンスが必要です。地理インスタンスを作成するには、次の4つの方法があります。

    1. 別の地理インスタンスから
    2. Well-Known Text(WKT)を使用する
    3. 既知のバイナリ(WKB)を使用する
    4. Geography Markup Language(GML)テキスト入力から

    よく知られているテキストの使用に焦点を当てましょう。

    Well-Known Text(WKT)の使用

    この表現は、Open Geospatial Consortium(OGC)に基づいています。地理データをテキスト形式で交換できます。

    前の例を見てください。ただし、バイナリ出力の代わりに、文字列に変換します。

      SELECT [CityID]、[CityName]、[GeoLocation] .ToString()AS GeoLocationStringFROM [Cities]  

    ToStringに注意してください () 方法。出力を文字列値に変換します。以下の図3の出力を見ることができます:

    より良い?まあ、それはまだ数字だけです。しかし、これらの数値がこれらの都市の緯度と経度であると言ったらどうなるでしょうか。もっと理にかなっていますよね?

    これはWell-KnownText(WKT)であり、データを列に配置するときに不可欠です。これについては後で詳しく説明します。ここで、もう1つ調べる必要があります。

    空間参照識別子(SRID)

    よく知られているテキストとは別に、各地理インスタンスには空間参照識別子(SRID)があります。地球球体説で地理インスタンス(場所またはポイント)を測定するために必要です。

    最も普及している測定単位はメートルまたは平方メートルで、SRID 4326で示されます。他のすべてのSRIDは、 sys.spatial_reference_systemsにあります。 。

    地理列には異なるSRIDを含めることができます。距離の測定など、2つの地理インスタンスで操作を実行する場合は注意してください。両方のインスタンスのSRIDが同じである必要があります。そうでない場合、 NULLが返されます。 。

    STGeomFromText

    WKTとSRIDについて学習した後、地理インスタンスを作成するには、 STGeomFromTextというメソッドが必要です。 。構文は次のとおりです。

    geography ::STGeomFromText( <幾何学的な点のWKT> SRID

    例:

      INSERT INTO Cities(CityName、GeoLocation)VALUES('CITY OF MANILA'、geography ::STGeomFromText('POINT(14.6077 120.98202)'、4326)) 

    パラメータ値を確認しましょう:

    「POINT(14.6077120.98202)」 –緯度14.6077、経度120.98202のマップ内のポイントのWell-Knownテキスト。これは、フィリピンの首都マニラに相当します。

    4326 –空間参照識別子

    例に飛び込んで、見つけたこの新しい宝石を使用してみましょう。

    SQLServer地理データ型の実際の例

    地理データを使用できるようにするための2つの一般的なアプリケーションを用意します。

    距離の計算(最も近い隣人)

    地理空間データの一般的なアプリケーションは、最近傍クエリと呼ばれます。このクエリでは、何かが別のオブジェクトまたは場所からどれだけ離れているか、または近いかを知りたいと考えています。

    SQLグラフに関する私の投稿では、顧客が現在の場所から近くのレストランを見つける方法について説明しました。その例をもう一度参照してみましょう:

     -customerDECLARE @deliveryLocation GEOGRAPHYSELECT @deliveryLocation =Locations.GeoLocationFROM Customers、willReceiveIn、LocationsWHERE MATCH(Customers-(willReceiveIn)-> Locations)AND Customers.CustomerID=3--レストランのクエリ顧客の場所から1000メートル以内SELECTRestaurants.Name、Restaurants.Description、Restaurants.Opening、Restaurants.Closing、Locations.Description、ROUND(Locations.GeoLocation.STDistance(@deliveryLocation)、2)AS DistanceFROM Restaurants、isLocated、LocationsWHERE MATCH(Restaurants-(isLocated)-> Locations)AND location.GeoLocation.STDistance(@deliveryLocation)<=1000ORDER BY Distance  

    この最近傍クエリの秘密はSTDistanceです ()。 2つの地理的な場所が必要です。1つは顧客用で、もう1つは顧客の場所から1000メートル以内のレストラン用です。

    すばらしいのは、同じ概念が2つ以上の場所を含む他のアイデアにも当てはまるということです。

    PowerBIを使用した地理空間分析

    空間データの別のアプリケーションは、地理空間分析にそれを使用することです。このセクションでは、場所ごとにCOVID-19ケースを使用し、PowerBIを使用して提示する例を示します。

    (補足として、Power BIとは何か、およびそのインストール方法について詳しくは、こちらをご覧ください)

    PowerBIDesktopのインストールは無料です。デフォルトの視覚化の1つは、BingMapsを使用したマップの視覚化です。国や米国の州などの既知の場所の調整は必要ありません。以下の例でこれを参照してください:

    図4の赤いボックスに注意してください。緯度と経度は空白のままですが、バブルはマップ上にうまくプロットされています。

    ただし、次の例では、フィリピンの地域と都市を使用します。バブルを正しくプロットするには、座標が必須です。

    必要なもの

    レポートの重要な部分に入る前に、必要な基本事項は次のとおりです。

    • PowerBIデスクトップ
    • 地図の視覚化
    • テーブルとクエリ
    • サンプルデータ

    データの準備

    テーブルとビューの準備

    最初に、データのコンテナを設定する必要があります。したがって、次のテーブルが必要です。

    1. 都市 –地域別に分類されたフィリピンの都市のリスト。
    2. 地域 –フィリピンの地域のリスト
    3. CityCases –各都市の症例数を含むリスト。

    以下はテーブル構造です:

      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_ OPTIM [PRIMARY])ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GOCREATE 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 )ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GOCREATE TABLE [dbo]。[CityCases]([CityCaseID] [int] IDENTITY(1,1)NOT NULL、[CityID] [int] NOT NULL、[DateReported] [date] NOT NULL、[TotalCases] [int] NOT NULL、[TotalDeath s] [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_ OPT ])ON [PRIMARY] GOALTERTABLE[dbo]。[CityCases]WITHCHECK ADD CONSTRAINT [FK_CityCases_Cities] FOREIGN KEY([CityID])REFERENCES [dbo]。[Cities]([CityID])GOALTERTABLE[dbo]。[CityCases。 ] CHECK CONSTRAINT [FK_CityCases_Cities] GO  

    Power BI Mapの視覚化では地理データ型が不明であるため、ビューを作成する必要があります。目的は、これらの列から緯度と経度を公開することです。これは、都市と地域に対して行います–以下を参照してください:

      CREATE VIEW vwCityCoordinatesASSELECT CityID、CityName、GeoLocation.Lat AS Latitude、Geolocation.Long AS Longitude、RegionIDFROM CitiesCREATE VIEW vwRegionCoordinatesASSELECT RegionID、Region、GeoLocation.Lat AS Latitude、GeoLocation.Long AS LongitudeFROM Regions  

    それでおしまい。 ラット および長い 緯度と経度のプロパティです。 PowerBIレポートでそれらを使用できるようになりました。

    データの構築

    次に、3つのテーブルのデータを作成する必要があります。

    データセットを一般に公開してくれたフィリピンの保健省に感謝します。ファイルはCSV形式です。ファイルの命名規則は、DOH COVID Data Drop_ yyyymmdd – 04CaseInformation.CSVです。

    この例を使用して、ファイルを取得して実践的に理解する方法は次のとおりです。

    1. データセットへのリンクをクリックします。
    2. 月のフォルダを選択します。 2020年8月はDOHCOVIDデータ(08)にあります。
    3. 日付を選択します。たとえば、2020年8月12日は、DOH COVIDDataDrop_20200812にあります。
    4. DOH COVID Data Drop_ 20200812 – 04CaseInformation.CSVをダウンロードします。手順2〜4を繰り返して、他の日のレポートを取得します。

    さらに、そのデータをSQLServerにインポートする必要があります。方法は次のとおりです。

    1. ExcelでCSVファイルを開きます。
    2. 列を追加するDateReported すべてのレコードに対応する日付を入力します。この場合、2020年8月10日。
    3. Excelファイル(.xlsx)として保存します。
    4. ExcelファイルをSQLServerの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 TotalDeathsFROM covid_ph cpINNER JOIN .CityMunRes =c.CityNameORDER 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))、('地域V:Bicol地域'、geography ::STGeomFromText(' POINT(123.414 13.421)'、4326))、('地域VI:Western Visayas'、geography ::STGeomFromText ('POINT(12 2.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))、('CITYOFLASPIÃ'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 ))、('CITYOFPARAÃ'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 ::STGeomFromTe xt('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))、('CITYOFDASMARIÃ'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 ::S TGeomFromText('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)) 

    データがすべて設定されたので、レポートを作成する準備が整いました。

    レポートの準備

    始める前に、2ページのレポートが必要です。 1ページは地域ごとのデータ用で、もう1ページは都市ごとのデータ用です。

    地域ごとのCOVID-19レポート

    地域ごとにレポートを作成するための簡単な手順は次のとおりです。

    1. PowerBIからSQLServerに接続します。サーバーとデータベースを示します。
    2. レポートに必要なテーブルとビューを選択します。

    3.関係を定義します–以下の図6を参照してください。 Power BIでの関係の定義の詳細については、このページにアクセスしてください。

    4.マップの視覚化をクリックして、プロパティを入力します。 vwRegionCoordinatesから緯度と経度のプロパティをバインドします 。次に、 vwRegionCoordinatesのツールチップ 地域 桁。そして最後に、 CityCasesのサイズ TotalCases 桁。以下の図7を参照してください:

    1. スライサーを追加し、 DateReportedにバインドします CityCasesから テーブル。
    2. カードを挿入してTotalCasesにバインドします CityCasesから テーブル
    3. クラスター化された棒グラフを追加します。 AxisプロパティをRegion にバインドします vwRegionCoordinatesの列 。次に、値を TotalCasesにバインドします CityCasesの列 。以下の図8を参照してください:

    上記の手順を実行すると、最終的な外観が表示されます。以下の図9のようになります。

    都市ごとのCOVID-19レポート

    最初のページの準備ができました。都市ごとのレポートの次のページを追加するのは難しいことではありません。

    手順は次のとおりです。

    1. ウィンドウの下部にある[+]をクリックして新しいページを追加し、名前をPer City(Philippines)に変更します。
    2. スライサーを含め、 vwRegionCoordinatesからリージョンにバインドします
    3. 別のスライサーを挿入し、それを DateReportedにバインドします CityCasesから
    4. カードを追加してTotalCasesにバインドします CityCasesから 。
    5. マップの視覚化を挿入します。 vwCityCoordinatesから緯度と経度のプロパティを定義します 。ツールチップはvwCityCoordinatesのからのものです CityName 列であり、サイズは CityCasesからのものです。 TotalCases 列。
    6. クラスター化された棒グラフを追加し、軸を CityNameにバインドします vwCityCoordinatesの列 および値をTotalCases CityCasesから

    都市ごとのレポートの最終的な外観は、以下の図10のようになります。

    さて、棒グラフや折れ線グラフを見るのと比較して、分析に地図を使用することの重要な点は何ですか?

    まず第一に、それは美学のためだけではなく、目を引くレポートで視聴者を感動させるためのものです。さらに重要なことは、場所に関連するデータをより明確に理解できるようにすることです。

    この例では、泡の大きさに基づいて、パンデミックの問題がどこに広がっているかを確認できます。また、場所の違いによる症例数を一目で確認・比較することができます。これは、政府関係者がより良い決定を下すのにも役立ちます。

    レポートサンプルは単純すぎますが、SQLServerの地理データ型が地理空間分析にどのように役立つかを示しています。

    結論

    地理空間データ型を使用するときに、その内容を理解しましたか?

    • 空間データまたは地理空間データは、地球の表面にあるポイントのデータを表します。
    • 近くの映画館、レストラン、クラブなどを検索する「最も近い隣人」のクエリに使用できます。
    • Power BIで作成したレポートのように、地理空間データ分析にも便利です。
    • 地理インスタンスを作成する際の基本的な要素は、Well-Known Text(WKT)、空間参照識別子(SRID)、メソッド STGeomFromTextなどです。 。

    この投稿では、SQLServerの空間データでできることのほんの一部に触れました。一度にすべてを使用することはできませんが、最も一般的な使用例はここにあります。以下のMicrosoftの参考資料からさらに詳しく調べてみませんか?

    • 空間データの概要
    • 空間データ型
    • 空間データのインデックス作成

    この投稿が気に入ったら、お気に入りのソーシャルメディアプラットフォームと共有してください。


    1. SQLデータベースが破損しているかどうかを確認する方法–MDFファイルを修復するソリューション

    2. 警告:mysql_fetch_array():指定された引数は有効なMySQLの結果ではありません

    3. MySQL-挿入後に同じテーブルを更新するためのトリガー

    4. Linuxプラットフォーム用のOracleDatabase21c