2

在我的应用程序中,我使用的是 osm 而不是谷歌地图。我有纬度和经度。所以从这里我将如何查询以从 osm 数据库中获取城市名称。请帮助我。我正在使用 osmdroid-android-3.0.8。我需要为此下载任何额外的库吗?

4

2 回答 2

14

这可以通过反向地理编码来完成,您可以将纬度/经度点转换为人类可读的地址。通常,反向地理编码是作为网络请求完成的。

在您的情况下,Open Street Maps 有一个反向地理编码 API,您可以在其中向他们的 Web 服务发出请求,然后使用 xml/json 响应来获取城市名称。

向 osm Web 服务发出反向地理编码请求如下所示:

http://nominatim.openstreetmap.org/reverse?format=xml&lat=[LATITUDE]&lon=[LONGITUDE]&zoom=18&addressdetails=1

在哪里:

  • [LATITUDE] 是要进行反向地理编码的纬度点。
  • [LONGITUDE] 是要进行反向地理编码的经度点。

这会给你一个看起来像这样的结果:

<reversegeocode timestamp="Fri, 06 Nov 09 16:33:54 +0000" querystring="...">
   <result place_id="1620612" osm_type="node" osm_id="452010817">
     135, Pilkington Avenue, Wylde Green, City of Birmingham, West Midlands (county), B72, United Kingdom
   </result>
   <addressparts>
     <house>135</house>
     <road>Pilkington Avenue</road>
     <village>Wylde Green</village>
     <town>Sutton Coldfield</town>
     <city>City of Birmingham</city>
     <county>West Midlands (county)</county>
     <postcode>B72</postcode>
     <country>United Kingdom</country>
     <country_code>gb</country_code>
   </addressparts>   
 </reversegeocode>

然后,您可以将结果处理为 xml 文档以查找城市名称节点。

另一种方法是使用Google 的 Geolocation API

于 2013-08-28T12:54:48.130 回答
8

您可以为此使用nominatim 反向地理编码 API

这是一个如何获取城市名称的示例(为简洁起见,省略了一些代码):

final String requestString = "http://nominatim.openstreetmap.org/reverse?format=json&lat=" +
            Double.toString(lat) + "&lon=" + Double.toString(lon) + "&zoom=18&addressdetails=1";        

RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(requestString));
try {
    @SuppressWarnings("unused")
    Request request = builder.sendRequest(null, new RequestCallback() {
        @Override
        public void onResponseReceived(Request request, Response response) {
            if (response.getStatusCode() == 200) {
                String city = "";
                try {
                    JSONValue json = JSONParser.parseStrict(response);
                    JSONObject address = json.isObject().get("address").isObject();
                    final String quotes = "^\"|\"$";

                    if (address.get("city") != null) {
                        city = address.get("city").toString().replaceAll(quotes, "");
                    } else if (address.get("village") != null) {
                        city = address.get("village").toString().replaceAll(quotes, "");
                    }
                } catch (Exception e) {
                }            
            }
        }
    });
} catch (Exception e) {
}
于 2013-08-28T12:44:14.593 回答