2

私のアプリでは、Google マップではなく osm を使用しています。緯度と経度があります。ここから、osm データベースから都市名を取得するためにクエリを実行する方法を教えてください。このためにダウンロードする必要がある追加のライブラリはありますか?

4

2 に答える 2

14

これは、緯度/経度ポイントを人間が判読できる住所に変換するリバース ジオコーディングによって実行できます。通常、リバース ジオコーディングは Web リクエストとして実行されます。

あなたの場合、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

これにはnomintim リバース ジオコーディング 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 に答える