我有一个地址名称,我希望得到一个准确的纬度&经度。我知道我们可以使用Geocoder的 getFromLocationName(地址,maxresult)来获得这个。
问题是,我得到的结果总是为null - 与https://maps.google.com/得到的结果不同。与Geocoder不同,这总是让我得到一些结果。
我还尝试了另一种方式:"http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false"
(这里是a link!)它比地理编码器提供更好的结果,但通常会返回错误(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文档 在哪里
答案 0 :(得分:19)
艾伯特,我认为你担心的是你的代码不起作用。在这里,下面的代码非常适合我。我认为您缺少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"
}
修改强>
On'答案中没有足够的细节
从所有研究中,您期望谷歌地图可以参考地区,地区,城市的每个组合。但事实仍然是谷歌地图在其自己的背景下包含地理和反向地理。你不能指望它有像Sayaji Hotel, Near balewadi stadium, pune
这样的组合。网络谷歌地图将为您找到它,因为它使用更广泛的Search
丰富的谷歌后端。谷歌api唯一的反向地理地址是从他们自己的api收到的。对我而言,这似乎是一种合理的工作方式,考虑到我们的印度地址系统有多复杂,第二条十字路可以远离第一条十字路:)
答案 1 :(得分:2)
Here是提供此功能的Web服务列表。
我最喜欢的一个是This
为什么不尝试击球。
http://api.geonames.org/findNearbyPlaceName?lat=18.975&lng=72.825833&username=demo
返回以下输出。(确保将你的lat&amp; lon放在URL中)
答案 2 :(得分: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;
}
答案 3 :(得分:0)
我按顺序使用:
- Google Geocoding API v3(在极少数情况下会出现问题here)
- Geocoder(在某些情况下会出现问题here)。
如果我没有收到Google Geocoding API的结果,我会使用Geocoder。
答案 4 :(得分:0)
据我所知,谷歌地图使用Google Places API自动完成,然后获取位置的详细信息,您可以从中获取坐标。
https://developers.google.com/places/documentation/ https://developers.google.com/places/training/
此方法应该会给你预期的结果。
答案 5 :(得分:-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();
}
}