11

我有一个地址名称,我想为它获取准确的纬度和经度。我知道我们可以使用 Geocoder 的getFromLocationName(address,maxresult)得到这个。

问题是,我得到的结果总是空的——不像我们用https://maps.google.com/得到的结果。与 Geocoder 不同,这总能让我得到一些结果。

我还尝试了另一种方法:( "http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false"这是一个链接!)它比地理编码器提供更好的结果,但经常返回错误(java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)。这很无聊。

我的问题是:我们如何通过在 java 代码中搜索https://maps.google.com/获得相同的 latlong 结果?

附加:关于使用“ http://maps.google.com/maps/api/geocode/json?address=”+地址+“&sensor=false”的api文档在哪里

4

6 回答 6

20

阿尔伯特,我认为您担心的是您的代码无法正常工作。在这里,下面的代码非常适合我。我认为您缺少URIUtil.encodeQuery将字符串转换为 URI。

我正在使用 gson 库,下载它并将其添加到您的路径中。

要获取用于 gson 解析的类,您需要转到jsonschema2pojo。只需在浏览器上触发http://maps.googleapis.com/maps/api/geocode/json?address=Sayaji+Hotel+Near+balewadi+stadium+pune&sensor=true ,获取结果并将其粘贴到此站点上。它会为你生成你的 pojo。您可能还需要添加一个 annotation.jar。

相信我,工作很容易。不要沮丧。

try {
        URL url = new URL(
                "http://maps.googleapis.com/maps/api/geocode/json?address="
                        + URIUtil.encodeQuery("Sayaji Hotel, Near balewadi stadium, pune") + "&sensor=true");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Accept", "application/json");

        if (conn.getResponseCode() != 200) {
            throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
        }
        BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));

        String output = "", full = "";
        while ((output = br.readLine()) != null) {
            System.out.println(output);
            full += output;
        }

        PincodeVerify gson = new Gson().fromJson(full, PincodeVerify.class); 
        response = new IsPincodeSupportedResponse(new PincodeVerifyConcrete(
                gson.getResults().get(0).getFormatted_address(), 
                gson.getResults().get(0).getGeometry().getLocation().getLat(),
                gson.getResults().get(0).getGeometry().getLocation().getLng())) ;
        try {
            String address = response.getAddress();
            Double latitude = response.getLatitude(), longitude = response.getLongitude();
            if (address == null || address.length() <= 0) {
                log.error("Address is null");
            }
        } catch (NullPointerException e) {
            log.error("Address, latitude on longitude is null");
        }
        conn.disconnect();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

Geocode http 有效,我刚刚解雇了它,结果如下

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "Pune",
               "short_name" : "Pune",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Pune",
               "short_name" : "Pune",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Maharashtra",
               "short_name" : "MH",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Pune, Maharashtra, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 18.63469650,
                  "lng" : 73.98948670
               },
               "southwest" : {
                  "lat" : 18.41367390,
                  "lng" : 73.73989109999999
               }
            },
            "location" : {
               "lat" : 18.52043030,
               "lng" : 73.85674370
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 18.63469650,
                  "lng" : 73.98948670
               },
               "southwest" : {
                  "lat" : 18.41367390,
                  "lng" : 73.73989109999999
               }
            }
         },
         "types" : [ "locality", "political" ]
      }
   ],
   "status" : "OK"
}

编辑

关于“答案不包含足够的细节”

从所有研究中,您期望谷歌地图可以参考位置、区域、城市的每一种组合。但事实仍然是谷歌地图在其自身的上下文中包含地理和反向地理。你不能指望它有一个像Sayaji Hotel, Near balewadi stadium, pune. Web google maps 会为您找到它,因为它使用更广泛的Search丰富的 google 后端。google api 的唯一反向地理地址是从他们自己的 api 接收的。对我来说,这似乎是一种合理的工作方式,考虑到我们的印度地址系统有多复杂,第二个十字路口可能离第一个十字路口很远:)

于 2013-06-21T07:44:28.870 回答
2

以下是提供此功能的 Web 服务列表。

我最喜欢的一个是这个

你为什么不试试打。

http://api.geonames.org/findNearbyPlaceName?lat=18.975&lng=72.825833&username=demo

它返回以下输出。(确保你把你的纬度和经度放在 URL 中)

在此处输入图像描述

于 2012-06-26T08:00:53.170 回答
2

希望这可以帮助你:

public static GeoPoint getGeoPointFromAddress(String locationAddress) {
        GeoPoint locationPoint = null;
        String locationAddres = locationAddress.replaceAll(" ", "%20");
        String str = "http://maps.googleapis.com/maps/api/geocode/json?address="
                + locationAddres + "&sensor=true";

        String ss = readWebService(str);
        JSONObject json;
        try {

            String lat, lon;
            json = new JSONObject(ss);
            JSONObject geoMetryObject = new JSONObject();
            JSONObject locations = new JSONObject();
            JSONArray jarr = json.getJSONArray("results");
            int i;
            for (i = 0; i < jarr.length(); i++) {
                json = jarr.getJSONObject(i);
                geoMetryObject = json.getJSONObject("geometry");
                locations = geoMetryObject.getJSONObject("location");
                lat = locations.getString("lat");
                lon = locations.getString("lng");

                locationPoint = Utils.getGeoPoint(Double.parseDouble(lat),
                        Double.parseDouble(lon));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return locationPoint;
    }
于 2013-06-25T06:42:34.823 回答
0

我按顺序使用:
- Google Geocoding API v3(在少数情况下会出现此处描述的问题)
- Geocoder(在某些情况下会出现此处描述的问题)。

如果我没有收到来自 Google Geocoding API 的结果,我会使用 Geocoder。

于 2013-06-21T07:53:50.583 回答
0

据我所知,Google Maps 正在使用 Google Places API 进行自动完成,然后获取可以从中获取坐标的位置的详细信息。

https://developers.google.com/places/documentation/ https://developers.google.com/places/training/

这种方法应该会给你预期的结果。

于 2013-06-26T09:52:56.733 回答
-1
String locationAddres = anyLocationSpec.replaceAll(" ", "%20");
URL url = new URL("https://maps.googleapis.com/maps/api/geocode/json?sensor=false&address="+locationAddres+"&language=en&key="YourKey");
try(InputStream is = url.openStream(); JsonReader rdr = Json.createReader(is)) {
    JsonObject obj = rdr.readObject();
    JsonArray results = obj.getJsonArray("results");
    JsonObject geoMetryObject, locations;

    for (JsonObject result : results.getValuesAs(JsonObject.class)) {
        geoMetryObject=result.getJsonObject("geometry");
        locations=geoMetryObject.getJsonObject("location");
        log.info("Using Gerocode call - lat : lng value for "+ anyLocationSpec +" is - "+locations.get("lat")+" : "+locations.get("lng"));
        latLng = locations.get("lat").toString() + "," +locations.get("lng").toString();
    }
}
于 2018-10-23T15:31:57.953 回答