2008-09-19 244 views
66

我会如何将地址或城市转换为纬度/经度?有商业装备可以“租赁”这项服务吗?这将用于具有全时互联网访问的Windows PC上的商用桌面应用程序。如何将地址转换为经度/纬度?

+1

似乎是一个副本http://stackoverflow.com/questions/158474/how-to-obtain-longitude-and-latitude-for-a-street-address-programmatically-and-l – Guillaume 2009-01-15 09:41:45

+5

Christian:The * Latitude *标签拼写正确。见:http://en.wikipedia.org/wiki/Latitude – 2011-07-09 18:30:23

回答

44

Google有一个地理编码API,对于大多数具有Google地图数据的地点来说,它似乎都工作得很好。

http://googlemapsapi.blogspot.com/2006/06/geocoding-at-last.html

他们提供在线的地理编码(通过JavaScript):

http://code.google.com/apis/maps/documentation/services.html#Geocoding

或后端地理编码(通过HTTP请求):

http://code.google.com/apis/maps/documentation/services.html#Geocoding_Direct

的数据通常是Google地图本身也使用了相同的功能。 (请注意,这里有一些例外情况,例如英国或以色列,其中数据来自不同来源且质量略有下降)

+0

嘿,这很酷。感谢您指出。 – 2008-09-19 00:58:36

+21

请注意Google地图常见问题中的以下内容:“...并注意,除了获取将使用Google Maps API显示的位置之外,将地理编码器用于任何目的都违反了服务条款。” – 2011-08-09 15:31:18

2

您想要一个地理编码应用程序。这些可以在线或作为应用程序后端提供。

2

Maptsraction(http://www.mapstraction.com)允许您在任意数量的地理编码服务之间进行选择。如果您需要大量制作,这可能会有所帮助,因为我知道Google每天可以做多少次限制。

5

前滚行我自己的解决方案,这一点,我可以全心全意建议Geo::Coder::US Perl模块,为此。只需下载所有人口普查数据,并使用包含的导入程序为您的国家创建伯克利数据库,并将Perl脚本指向它。使用模块的内置地址解析功能,您可以拥有它:一种离线地理编码系统!

24

没有太多新增功能,但我从以前的工作中获得了很多GIS和地理编码方面的实际经验。下面是我记得的:

如果在应用程序中每隔一段时间需要一次,我肯定会推荐Google或Yahoo Geocoding API,但要小心阅读其许可条款。

我知道Google Maps API即使是商业网页也很容易获得许可,但不能用于付费访问的情况。换句话说,您可以使用它来宣传或提供推动广告收入的服务,但您无法向人们收取访问您的网站或甚至将其置于密码系统之后的费用。

尽管有这些限制,但它们都是很好的选择,因为它们经常更新街道数据库。大多数免费的后端工具和库都使用不经常更新的人口普查和TIGER道路数据,因此您不太可能在快速增长的地区或新的细分中成功地理地址代码。

大多数服务还会限制您每天可以进行的地理编码查询的次数,因此可以查找已添加到数据库的新客户的地址,但如果您运行的批量作业成千上万的地址从你的数据库到地理编码器,你将会关闭。

我不认为这一个已被提及,但ESRI有ArcWeb web services,包括地理编码,虽然他们不是很便宜。上次我使用它们时,每次查找的成本大约为1.5cents,但您必须预付一定数量才能开始。其主要优点是他们使用的道路数据能够及时更新,并且您可以在Google不允许的商业情况下使用这些数据。 ArcWeb服务还将提供高分辨率卫星和航拍照片a la谷歌地图,每个请求再次定价。

如果你想推出自己的或有更准确的数据访问,你可以购买像TeleAtlas这样的公司的GIS数据订阅,但这并不便宜。如果您的需求非常地方化,您只能购买州或县的数据。有几层数据 - 只有GIS功能,地理信息系统和详细的街道,所有这些以及地理编码数据,所有这些数据加上路线的交通流量/方向/速度限制。当然,价格会随着上涨而上涨。

最后,关于Geocoding的维基百科文章有关于算法和技术的一些很好的信息。即使您没有在自己的代码中执行此操作,了解各种数据源可能会出现的错误和准确性也很有用。

0

USC WebGIS Geocoder是免费的,并提供了几个API,或者您可以上传数据库进行在线批处理。

0

您可以使用Microsoft的MapPoint Web服务。

我创建了一个blog entry关于如何将地址转换为GeoCode(lat/long)。

0

以为我会再添加一个到列表中。德克萨斯A & M有一个在这里的价格相当体面的服务:http://geoservices.tamu.edu/Services/Geocode/

,如果你有一个相当大的组地址进行地理编码,不想拍10K到谷歌或微软一个很好的选择。我们仍然使用Google Map中的返回数据。

4

尝试用这个代码,我这样的工作与地址:

它是链接与GET方法,你会发送请求并得到纬度和经度。http://maps.google.com/maps/api/geocode/json?address=YOUR ADDRES&sensor=false

对于为例:http://maps.google.com/maps/api/geocode/json?address=W Main St, Bergenfield, NJ 07621&sensor=false

1.创建GET方法。

public static String GET(String url) throws Exception {//GET Method 
     String result = null; 
     InputStream inputStream = null; 
     try { 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 

     Log.v("ExecuteGET: ", httpGet.getRequestLine().toString()); 

     HttpResponse httpResponse = httpclient.execute(httpGet); 
     inputStream = httpResponse.getEntity().getContent(); 
     if (inputStream != null) { 
      result = convertInputStreamToString(inputStream); 
      Log.v("Result: ", "result\n" + result); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return result; 
} 

2.发送请求创建方法

@SuppressWarnings("deprecation") 
    public static String getLatLng(String accessToken) throws Exception{ 
     String query=StaticString.gLobalGoogleUrl+"json?address="+URLEncoder.encode(accessToken)+"&sensor=false"; 
     Log.v("GETGoogleGeocoder", query+""); 
     return GET(query); 
    } 

gLobalGoogleUrl = “http://maps.google.com/maps/api/geocode/”

3.调用方法getLatLng

String result=getLatLng("W Main St, Bergenfield, NJ 07621"); 

4.解析的JSONObject

现在结果JSONObject的有关地址和LAN,LNG信息。 用gson()解析JSONObject(结果)。 之后,使用lat,lng。

如果您有关于代码的问题,请询问。

0

您在询问Geocoder。 Google为此提供了一个API。 也是这样的另一个提供者。

你可以看到实施的My Current Location .NET演示

0

如果你需要一个一次性的解决方案,你可以尝试:https://addresstolatlong.com/

我已经使用了很长一段时间,它有为我工作得很好。