我将如何将地址或城市转换为纬度/经度?有没有我可以“租用”这项服务的商业机构?这将用于具有全时 Internet 访问权限的 Windows PC 上的商业桌面应用程序。
18 回答
谷歌有一个地理编码 API,对于他们拥有谷歌地图数据的大多数位置来说,它似乎工作得很好。
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
这些数据通常与谷歌地图本身使用的数据相同。(请注意,有一些例外情况,例如英国或以色列,其数据来自不同来源且质量略有下降)
没有什么可添加的新内容,但我在以前的工作中积累了丰富的 GIS 和地理编码方面的实际经验。这是我记得的:
如果您的应用程序需要“每隔一段时间”,我肯定会推荐 Google 或 Yahoo Geocoding API,但请仔细阅读它们的许可条款。
我知道 Google Maps API 通常很容易获得商业网页的许可,但不能在付费访问的情况下使用。换句话说,您可以使用它来做广告或提供增加广告收入的服务,但您不能向访问您的网站的人收费,甚至不能将其置于密码系统后面。
尽管有这些限制,但它们都是很好的选择,因为它们经常更新街道数据库。大多数免费的后端工具和库使用不经常更新的 Census 和 TIGER 道路数据,因此您不太可能成功地对快速增长的区域或新细分中的地址进行地理编码。
大多数服务还限制您每天可以进行的地理编码查询的数量,因此可以查找添加到数据库中的新客户的地址,但如果您运行批处理作业来提供数千个地址您的数据库进入地理编码器,您将被关闭。
我认为这个还没有被提及,但是 ESRI 有包含地理编码的ArcWeb Web 服务,虽然它们不是很便宜。上次我使用它们时,每次查找的成本约为 1.5 美分,但您必须预付一定的金额才能开始使用。同样,主要优势是他们使用的道路数据会及时更新,您可以在谷歌不允许的商业情况下使用这些数据。ArcWeb 服务还将像谷歌地图一样提供高分辨率卫星和航拍照片,再次按请求定价。
如果您想自己动手或访问更准确的数据,您可以从TeleAtlas等公司购买 GIS 数据订阅,但这并不便宜。如果您的需求非常本地化,您只能购买一个州或县的数据。有几层数据——仅 GIS 功能、GIS 加上详细的街道、所有这些加上地理编码数据,所有这些加上交通流量/方向/速度限制。当然,随着等级的增加,价格也会上涨。
最后,关于地理编码的维基百科文章有一些关于算法和技术的好信息。即使您没有在自己的代码中执行此操作,了解您可以从各种数据源中获得什么样的错误和准确性也很有用。
雅虎!地图网络服务 - 地理编码 API准确地对英国邮政编码进行地理编码,这与 Google 的 API 不同。
不幸的是,雅虎已弃用此服务,您可以访问http://developer.yahoo.com/geo/placefinder/获取雅虎的服务
当您将地址或对象转换为纬度/经度时,它称为地理编码。
周围有很多地理编码解决方案。适合您项目的解决方案取决于每个地理编码解决方案的许可条款的可接受性。Microsoft Virtual Earth 和 Google Maps 都提供在非常严格的许可下免费使用的解决方案......
https://developers.google.com/maps/documentation/javascript/tutorial
之前为此推出了我自己的解决方案,我可以全心全意地为此推荐Geo::Coder::US Perl 模块。只需下载所有人口普查数据并使用包含的导入器为您的国家创建伯克利数据库并将 Perl 脚本指向它。使用模块的内置地址解析,您就拥有了:离线地理编码系统!
尝试使用此代码,我使用地址这样工作:
它是使用 GET 方法发送请求并获取 lat 和 lng 的链接。 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。
如果您对代码有疑问,请询问。
You could also try the OpenStreetMap NameFinder (or the current Nominatim), which contains open source, wiki-like street data for (potentially) the entire world.
Maptsraction ( http://www.mapstraction.com ) 允许您在任意数量的地理编码服务之间进行选择。如果您需要做大量工作,这可能会有所帮助,因为我知道 Google 对您一天可以做的数量有限制。
虚拟地球做到了。geocoder.us上还有一个网络服务
您可以使用 bing maps 肥皂服务,您可以在其中参考反向地理编码服务以从地址查找 lat/long 是链接 http://msdn.microsoft.com/en-us/library/cc980922.aspx
您可以使用 Microsoft 的 MapPoint Web 服务。
我创建了一篇关于如何将地址转换为地理代码(纬度/经度)的博客文章。
你在问地理编码器。谷歌为此提供了一个 API。另一个提供者也是如此。
您可以在My Current Location .net中查看实现演示
以为我会在列表中再添加一个。德州农工大学在这里提供价格合理的服务:http: //geoservices.tamu.edu/Services/Geocode/
如果您有大量地址要进行地理编码并且不想向 Google 或 Microsoft 支付 10k 的费用,这是一个不错的选择。我们最终还是在谷歌地图中使用了返回的数据。
USC WebGIS Geocoder是免费的,并提供多个 API,或者您可以上传数据库以进行在线批处理。
如果您需要一次性解决方案,可以尝试:https ://addresstolatlong.com/
我已经使用了很长时间,它对我来说效果很好。