4

緯度/経度を正常に取得し、それをジオコーダーに渡して住所を取得できます。ただし、常にアドレスが返されるとは限りません。数回の試行が必要なようですか?理由はわかりません。

この時点でアドレスを取得するためのより良い方法はありますか?

public List<Address> getAddresses(){
          Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
          List<Address> addresses = new ArrayList();
             try {
       addresses = geocoder.getFromLocation(latitude, longitude, 1);
      } catch (IOException e) {
       e.printStackTrace();
      }

      return addresses;
        }

ここでこのメソッドを呼び出しています:

LocationListener onLocationChange=new LocationListener() {
        public void onLocationChanged(Location loc) {
            //sets and displays the lat/long when a location is provided
            String latlong = "Lat: " + loc.getLatitude() + " Long: " + loc.getLongitude();   
            latitude = loc.getLatitude();
            longitude = loc.getLongitude();

            List<Address> addresses = getAddresses();

            if(addresses.size() > 0 && addresses != null)
             zipcode = addresses.get(0).getPostalCode();

            Toast.makeText(getApplicationContext(), zipcode,Toast.LENGTH_SHORT).show();
        }
4

5 に答える 5

4

私の経験では、Google の Geocoder は常に機能するとは限りません。マップ上に固定ポイントがいくつかあります。オーバーレイをクリックすると、その緯度/経度の住所が記載されたトーストが表示されます。これらのポイントは変更されません。同じポイントを 10 回クリックしますが、そのうち 7 回しかアドレスが表示されません。

奇妙ですが、その通りです。問題を回避するためにアプリを修正しました。

于 2010-11-12T22:33:36.223 に答える
2

上記のアプローチの問題は、インターネット上の他の多くの例と同様に、最初に返されたプロバイダーからのみデータを取得しようとすることですaddresses.get(0).getPostalCode()。コードを実行するとList<Address> addresses = getAddresses()、プロバイダーのリストが取得され、それぞれが独自のデータを提供します。すべてのプロバイダーに同じデータが含まれるわけではありません。

郵便番号を受け取る際にも同じ問題がありました。最初のテスト中に、6 つのプロバイダーからデータを受け取っていることがわかりました。これら 6 つのプロバイダーのうち、郵便番号を返したのは 2 つだけでした。でアクセスしようとした最初のプロバイダーは、それらのプロバイダーのaddress.get(0).getPostalCode()1 つではありませんでした。より適切なアプローチは、返されたすべてのプロバイダーをループして、探していたデータを誰が返したかを確認することです。

次のようなものが機能するはずです。おそらく、プロバイダーの 1 つが郵便番号を返します。これは、プロバイダーから返される必要がある任意のジオコーディング データに対して実行できます。

List<Address> address = gc.getFromLocation(myLatitude, myLongitude, 10);

if (address.size() > 0) {
   strZipcode = address.get(0).getPostalCode();

   //if 1st provider does not have data, loop through other providers to find it.
   count = 0;
   while (strZipcode == null && count < address.size()) {
      strZipcode = address.get(count).getPostalCode();
      count++;
   }
}
于 2012-08-11T16:17:03.023 に答える
0

オートコンプリートを使用している場合は、Place オブジェクトから場所の場所を取得できます。

private ResultCallback<PlaceBuffer> mUpdatePlaceDetailsCallback
        = new ResultCallback<PlaceBuffer>() {
    @Override
    public void onResult(PlaceBuffer places) {
        if (!places.getStatus().isSuccess()) {
            // Request did not complete successfully
            AALog.e("Geocoder Place query did not complete. Error: " + places.getStatus().toString());
            return;
        }
        // Get the Place object from the buffer.
        final Place place = places.get(0);
        //--------------here you can recover the place location---------------------
        ((DrawerActivity)getActivity()).lastPlace = place.getLatLng();
        //----------------------------------------------------------------------           
        places.release();
        getActivity().getFragmentManager().beginTransaction().remove(AutocompleteFragment.this).commit();
    }
};

このコールバックは、AdapterView.OnItemClickListener 内で次のように登録する必要があります。

        PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi
                .getPlaceById(mGoogleApiClient, placeId);
        placeResult.setResultCallback(mUpdatePlaceDetailsCallback);
于 2016-08-23T09:08:26.440 に答える
0

ジオコーダが機能しない地域があります。Geocoder を使用する代わりに、Geocoding Api を使用できます。リンクに従って、API の詳細を取得します。

https://developers.google.com/s/results/?q=geocoding+api

于 2016-02-08T15:14:48.363 に答える
0

誰かがまだ修正を探している場合に備えて、ここで私がしたことは次のとおりです。最初に、すべてのポイントが正常であることを確認しました(ロードされる)が、ジオコーディングによって常に取得されるとは限りません(データの取得はヒットまたはミスです)コードにやりたいことを強制します。つまり、緯度と経度を検出できることがわかっている場合は、検出されるまで試行を続けます。これはロード時間にも影響していないようです!コードは次のとおりです。

do {
$geocode=file_get_contents('https://maps.google.com/maps/api/geocode/json?address='.$prepAddr.'&key='.$key.'sensor=false');

$output= json_decode($geocode);
$lat = $output->results[0]->geometry->location->lat;
$long = $output->results[0]->geometry->location->lng;
} while($lat == '' and $long == '');

これは、緯度と経度の両方が空の文字列でなくなるまでループし続けます!

ハッピーコーディング!:P

于 2015-04-08T22:49:25.357 に答える