2012-12-05 101 views

回答

7

您需要使用城市位置加載一些數據 - 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是基本經度/緯度的座標系代碼。

然後找最近的城市你想要像查詢一個給定的位置:在SQL Server文檔

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); 

更多的例子:

+0

是反向地理編碼只是最近的鄰居搜索?我可以靠近一個城市,但通過(另類)定義在另一個城市嗎?這有多可能是真的?編輯:http://stackoverflow.com/a/13832418/1464716答案。考慮城市邊界的任何實現? – fionbio

+0

@如果你在B,你不可能最接近A ......儘管有時候河流和港口可能會搞砸了。上面的例子將城市視爲點。如果你想使用邊界,上面應該仍然有效(使用(多邊形)多邊形幾何體) - 如果查詢點位於特定的城市多邊形內,則'STDistance()'將返回0,因此它將首先排序。 – rcoup

+0

使用城市15000.zip將只獲得正常的位置地址我能做些什麼來獲得當前地址(確切地址)? – Shridhar

4

您所描述的功能稱爲「反向地理編碼」 - 取經緯度座標,並將最近地點的名稱返回到該地點。 (地理編碼是相反的 - 提供一個地名來檢索關聯的緯度/經度座標)。

您當然可以構建一個使用SQL Server作爲後端數據庫的反向地理編碼服務,但沒有內置任何東西來提供此類功能。

如果您只是想對一組現有數據進行反向地理編碼,而不是在SQL Server中創建此功能,則可能會發現使用現有Web服務更容易。例如,GEONAMES findNearbyPlaceName具有您通過以下網址範本訪問REST接口:

http://api.geonames.org/findNearbyPlaceName?lat=52.62&lng=1.28&username=demo

此示例返回最近的已知的實體信息的請求,從緯度/經度座標(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> 
2

對於空間的功能,你需要SQL 2008或更高版本。

要做的第一件事就是獲得書/電子書:Alastair Aitchison用SQL Server開始Spatial。他擁有SQL 2008和2012版本。他是那裏的頂級專家之一。另一個是'空間戴夫'。披露:不,我沒有收到推薦Alistair書籍的一角錢。我爲GreatData.com工作,並且使用了2008年的書籍,因爲我對SQL很少了解,而且對映射也一無所知,並且由於本書非常好,所以在短時間內能夠非常熟練。

接下來,您需要加載城市邊界。這些是ESRI Shapefile格式,你可以在NationalAtlas.gov免費找到它們(免費的映射文件的一個很好的來源)。

你需要明白只有大城市有地圖邊界文件。使用邊界,您可以使用STIntersects()或其他方法來確定您擁有的緯度/經度座標是否在城市範圍內。

對於規模較小的城市和鄉鎮,你只能得到一個緯度/長點。您可以使用「最近鄰居」邏輯(也可以在書中)確定最近的城市或城鎮,但無法確定它是否在城鎮範圍內。

相關問題