SQLServerがGeographyのようなものをサポートするようになったと聞きました。経度/緯度から都市を取得することは可能ですか?たくさん検索しましたが見つかりませんでしたか?
3 に答える
都市の場所を含むいくつかのデータをロードする必要があります-Geonames(必要な場合がありますcities15000.zip
)またはNatural Earth(人口の多い場所)が開始するのに適した場所である可能性があります。
CREATE TABLE cities (
name VARCHAR(200) PRIMARY KEY,
location GEOGRAPHY,
);
CREATE SPATIAL INDEX idx_cities_location ON cities(location);
INSERT INTO cities (name, location) VALUES
('Auckland', geography::STGeomFromText('POINT(174.7833 -36.85)', 4326)),
('London', geography::STGeomFromText('POINT(-0.1062 51.5171)', 4326))
;
- すべての座標の順序は次のとおりです。
(Longitude Latitude)
- 空間インデックスはそれを高速にします。
- 4326は、基本的な経度/緯度の座標系コードです。
次に、特定の場所に最も近い都市を見つけるには、次のようなクエリが必要です。
DECLARE @g geography = 'POINT(103.75 1.3667)';
SELECT TOP(1) name FROM cities
WHERE location.STDistance(@g) IS NOT NULL
ORDER BY location.STDistance(@g);
SQL Serverドキュメントのその他の例:
あなたが説明している機能は「逆ジオコーディング」と呼ばれます-緯度/経度の座標を取り、その場所に最も近い場所の名前を返します。(ジオコーディングは反対です-関連する緯度/経度座標を取得するために地名を提供します)。
SQL Serverをバックエンドデータベースとして使用する逆ジオコーディングサービスを構築することは確かに可能ですが、そのような機能を提供する組み込みのものはありません。
SQL Serverでこの機能を作成するのではなく、単に既存のデータのセットを逆ジオコーディングしたい場合は、既存のWebサービスを使用する方が簡単な場合があります。たとえば、geonames findNearbyPlaceNameには、次のURLテンプレートを介してアクセスするRESTインターフェースがあります。
http://api.geonames.org/findNearbyPlaceName?lat=52.62&lng=1.28&username=demo
この例では、次のように、geonamesデータベースから要求された緯度/経度座標(52.62,1.28)に最も近い既知のエンティティに関する情報を返します。
<geonames>
<geoname>
<toponymName>Norwich</toponymName>
<name>Norwich</name>
<lat>52.62783</lat>
<lng>1.29834</lng>
<geonameId>2641181</geonameId>
<countryCode>GB</countryCode>
<countryName>United Kingdom</countryName>
<fcl>P</fcl>
<fcode>PPLA2</fcode>
<distance>1.51318</distance>
</geoname>
</geonames>
空間関数の場合、SQL2008以降が必要です。
一番やるべきことは、本/電子ブックを入手することです。AlastairAitchisonによるSQLServerでの空間の開始。彼はSQL2008と2012のバージョンを持っています。彼は世の中でトップの達人の一人です。もう1つは「SpatialDave」です。開示:いいえ、アリステアの本を推薦するダイムはありません。私はGreatData.comで働いており、SQLについてほとんど知らず、マッピングについても何も知らなかったときに2008年の本を使用しました。この本は非常に優れているため、短時間でかなり習熟することができました。
次に、都市の境界にロードする必要があります。これらはESRIシェープファイル形式であり、NationalAtlas.gov(無料のマッピングファイルの優れたソース)で無料で見つけることができます。
大都市だけがマップ境界ファイルを持っていることを理解する必要があります。境界がある場合は、STIntersects()またはその他のメソッドを使用して、現在の緯度/経度の座標が市の境界内にあるかどうかを判断できます。
小さな都市や町の場合は、緯度/経度のポイントしか得られません。「最近傍」ロジック(本にもあります)を使用して、最も近い都市または町を判別できますが、それが町の範囲内にあるかどうかを判別することはできません。