2012-06-26 83 views
9

我有一個地址名稱,我想獲得一個精確的緯度&經度。我知道我們可以使用Geocoder的getFromLocationName(address,maxresult)從給定的地址名稱獲取緯度和經度。 NOT Geocoder

問題是,我得到的結果總是空 - 不像我們用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/得到什麼?

附加:其中是API文檔有關使用 「http://maps.google.com/maps/api/geocode/json?address=」 +地址+ 「&傳感器=假」

+0

GeoCoder不是完美的科學。請記住。例如,我想要「Wadgaon sheri」,它向我展示了靠近EON IT公園的Kharadi主路。所以我在地址上加了「郵局」。而不是「wadgaon sheri」我使用PIN碼。長話短說,不要指望Geocodeing爲你做魔術。機會是你使用的任何API最終都會得到相同的結果,因爲他們也會使用地理編碼。 – Siddharth

回答

16

阿爾伯特,我覺得你的問題是,你的代碼無法正常工作。在這裏,下面的代碼非常適合我。我想你錯過了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(); 
    } 

地址解析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" 
} 

結果編輯

在「答案不包含足夠detail`

從所有的研究你期待谷歌地圖有一個地方,地區,城市的每一個組合的參考。但事實仍然是,Google地圖在其自身的環境中包含地理位置和反向地理位置。你不能指望它有像Sayaji Hotel, Near balewadi stadium, pune這樣的組合。網絡谷歌地圖將爲您找到它,因爲它使用更廣泛的Search富谷歌後端。 google api的唯一反向地址從他們自己的api收到。對我來說,這似乎是一個合理的工作方式,考慮到我們的印度廣播系統是多麼複雜,第二個十字路口可以從第1跨路:)

+0

偉大的工作siddharth,但如果你檢查這個地方在http://ctrlq.org/maps/address/ 它不給我確切的位置, 我們從上面的代碼可以說我們得到的latLag爲18.52043030 73.85674370,如果我們把這個作爲地理編碼的輸入,它會指向Kasaba Peth附近的某個地方,那是不正確的Pune。本網站也使用Geocoder。 我在我的代碼中使用了latLag,但它給出了相同的錯誤結果。 – KAsh

+0

好的,所以我認爲我們可以有把握地得出結論,谷歌地圖沒有對地方,地區,城市的每個組合的參考。事實上,如果您從Google本身獲取地址,您可以獲得適當的地址的唯一方法。所以在你的情況下,你需要從谷歌採取自動完成地址,保存它使用它,並扭轉地理上。你**不能**只取一個實際的地址並轉換它(就像你可能爲美國地址做的那樣)。對我來說,這似乎是一個合理的工作方式,考慮到我們的印度地址系統有多複雜,第二條交叉路可以距離1st Cross公路數英里:) – Siddharth

+0

我同意。自動更正不會爲我們的印度地址工作,我也嘗試過,但有時如果客戶端要求它找到這樣的腳本變得非常imp。 :(讓我們看看,如果任何解決方案是存在的,它會爲我好。 – KAsh

0

我用相隔千里,依次是:
- 谷歌地理編碼API第3版(在少數情況下有描述here問題)
- 地理編碼(在某些情況下,有一個問題描述here)。

如果我沒有收到來自谷歌地理編碼API的結果我用的是地理編碼。

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; 
    }