如何将地址转换为纬度/经度?


70

如何将地址或城市转换为纬度/经度?我可以从中“租用”这项服务的商业机构吗?这将用于具有全时Internet访问的Windows PC上的商业桌面应用程序中。



5
克里斯蒂安:“谷歌纵横”标签的拼写正确。参见:en.wikipedia.org/wiki/Latitude
Paul McMillan

Answers:


49

Google有一个地理编码API,对于他们拥有Google Maps数据的大多数位置来说,它似乎都可以很好地工作。

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 Maps本身使用的数据相同。(请注意,有一些例外情况,例如英国或以色列,这些数据来自不同的来源并且质量略有下降)


24
请注意Google Maps常见问题解答中的以下内容:“ ...并注意,将地理编码器用于除获得将要使用Google Maps API进行显示的位置以外的任何其他用途均违反了服务条款。”
Dewayne Christensen

25

没什么新添加的,但是我在以前的工作中在GIS和地理编码方面有很多实际经验。这是我记得的内容:

如果您的应用程序中“偶尔需要”,我绝对会推荐Google或Yahoo Geocoding API,但请务必仔细阅读其许可条款。

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

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

大多数服务还限制了您每天可以进行的地理编码查询的数量,因此可以查找例如添加到数据库中的新客户的地址,但是如果您运行批处理作业以从中获取数千个地址将数据库插入地址解析器,您将被关闭。

我认为还没有提到这一点,但是ESRI拥有包括地理编码的ArcWeb Web服务,尽管它们并不便宜。上次我使用它们时,每次查找的费用约为1.5美分,但您必须预先支付一定的费用才能开始使用。再次,主要优点是可以及时更新他们使用的道路数据,并且您可以在Google不允许的商业情况下使用这些数据。ArcWeb服务还将Google地图中提供高分辨率的卫星和航拍照片,并根据请求再次定价。

如果您想自己动手或访问更准确的数据,则可以从TeleAtlas等公司购买GIS数据的订阅,但这并不便宜。如果您的需求非常本地化,则只能购买州或县的数据。数据分为几层-仅GIS功能,GIS和详细的街道,所有这些加上地理编码数据,所有这些加上交通流量/方向/速度限制。当然,价格随着等级的增加而上涨。

最后,有关地理编码的Wikipedia文章对算法和技术提供了一些很好的信息。即使您不是在自己的代码中执行此操作,了解各种数据源可能会出现的错误和准确性也很有用。




5

之前针对此问题推出了自己的解决方案,我可以为此全心全意地推荐Geo :: Coder :: US Perl模块。只需下载所有人口普查数据,然后使用随附的导入程序为您所在的国家/地区创建Berkeley数据库,然后将Perl脚本指向该数据库即可。使用模块的内置地址解析,即可轻松使用:离线地理编码系统!



4

尝试使用此代码,我这样处理地址:

在该链接中,您将使用GET方法发送请求并获取经纬度。 http://maps.google.com/maps/api/geocode/json?address=您的地址&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

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

如果您对代码有疑问,请询问。


1
这似乎可行,查询限制有什么作用sensor=false
破事2015年

传感器参数指示呼叫设备是否具有GPS传感器。developers.google.com/maps/documentation/geocoding/intro#Sensor
Rich C

是否有查询限制?
Priyansh Agrawal


2

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







0

以为我会再增加一个。德克萨斯州A&M在这里提供价格合理的服务:http : //geoservices.tamu.edu/Services/Geocode/

如果您有大量地址要进行地理编码并且不想将10k拍给Google或Microsoft,则是一个不错的选择。我们仍然最终在Google Map中使用了返回的数据。




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.