2012-12-05 96 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()或其他方法来确定您拥有的纬度/经度坐标是否在城市范围内。

对于规模较小的城市和乡镇,你只能得到一个纬度/长点。您可以使用“最近邻居”逻辑(也可以在书中)确定最近的城市或城镇,但无法确定它是否在城镇范围内。

相关问题