8

場所を取得するために場所ピッカーの意図を使用しています。ここで、住所を国、都市、ピンコード、州として別々の形式で保存したいと考えています。プレースピッカーのアドレスからこれらすべてを取得するにはどうすればよいですか?

コード:

public class NameOfBusinessFragment extends Fragment {

    int PLACE_PICKER_REQUEST = 1;
    int RESULT_OK = -1;
    PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
    EditText category,location;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_name_of_business,
                    container, false);

            location = (EditText)view.findViewById(R.id.location);

            location.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    try {

                        startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);
                    }
                    catch (GooglePlayServicesRepairableException e)
                    {
                        Toast.makeText(getActivity(),"ServiceRepaire Exception",Toast.LENGTH_SHORT).show();
                    }
                    catch (GooglePlayServicesNotAvailableException  e)
                    {
                        Toast.makeText(getActivity(),"SeerviceNotAvailable Exception",Toast.LENGTH_SHORT).show();
                    }
                }
            });

            return view;
        }
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {
                Place place = PlacePicker.getPlace(data, getActivity());
                String toastMsg = String.format("Place: %s", place.getName());


                Toast.makeText(getActivity(), toastMsg, Toast.LENGTH_LONG).show();
                location.setText(place.getName());
            }
        }
    }
}

これは、プレース ピッカーを実装し、onActivityResult のプレース名を取得する方法です。逆ジオコードなどを使用してこれを取得できますか? 誰でもこれで私を助けてくれますか? ありがとうございました。

4

3 に答える 3

3

問題を解決する最善の方法はGeocoder、緯度と経度から住所を取得することですが、何らかの理由でそれを使用したくない場合は、次の回避策が役立つ場合があります。

100% 信頼できるわけではありませんが、Google が詳細な情報を提供するまでは使用できます。一部のランダムなケースでは完全な結果が得られない場合がありますが、ほとんどの場合は機能します。

 public void getAddressDetails(Place place) {
        if (place.getAddress() != null) {
            String[] addressSlice = place.getAddress().toString().split(", ");
            country = addressSlice[addressSlice.length - 1];
            if (addressSlice.length > 1) {
                String[] stateAndPostalCode = addressSlice[addressSlice.length - 2].split(" ");
                if (stateAndPostalCode.length > 1) {
                    postalCode = stateAndPostalCode[stateAndPostalCode.length - 1];
                    state = "";
                    for (int i = 0; i < stateAndPostalCode.length - 1; i++) {
                        state += (i == 0 ? "" : " ") + stateAndPostalCode[i];
                    }
                } else {
                    state = stateAndPostalCode[stateAndPostalCode.length - 1];
                }
            }
            if (addressSlice.length > 2)
                city = addressSlice[addressSlice.length - 3];
            if (addressSlice.length == 4)
                stAddress1 = addressSlice[0];
            else if (addressSlice.length > 3) {
                stAddress2 = addressSlice[addressSlice.length - 4];
                stAddress1 = "";
                for (int i = 0; i < addressSlice.length - 4; i++) {
                    stAddress1 += (i == 0 ? "" : ", ") + addressSlice[i];
                }
            }
        }
        if(place.getLatLng()!=null)
        {
            latitude = "" + place.getLatLng().latitude;
            longitude = "" + place.getLatLng().longitude;
        }
    }
于 2016-08-24T15:03:03.930 に答える
1

Place オブジェクトの住所のコンポーネント (通り、都市、国など) を分離したい場合は、2 つのオプションがあります。

  1. を使用しPlace.getLatLng()ます。次に、緯度と経度を逆ジオコーディングします。
  2. アドレスを解析します。

さて、住所を解析するのは簡単ではありません。ただし、緯度と経度のリバース ジオコーディングは正確ではありません。アドレスを解析することをお勧めします。優れた住所解析サービスがあり、住所データベースに対して住所を検証するものもあります。( SmartyStreetsをお勧めします。SmartyStreets のデモページに移動した場合は、ドロップ ダウンから [自由形式の住所] を選択し、住所を検索したときにどのような情報が返されるかを確認してください。)


リバース ジオコーディングが不十分なソリューションである理由は次のとおりです。リバース ジオコーディングでは、緯度と経度を取得し、アルゴリズムで住所に一致させます。一部のアルゴリズムは、緯度と経度を最も近い実際の住所に一致させます。この場合、住所はあなたの所在地の住所ではない可能性があります。一方、一部のアルゴリズムは、緯度と経度に合理的に適合する住所を概算します。この場合、アドレスは実際のアドレスではない可能性があります。のドキュメントには、別の問題が記載されていgetLatLng()ます。

場所は、必ずしもプレイスの中心、または特定の入口または出口ポイントではなく、プレイスの地理的範囲内で任意に選択されたポイントです。

緯度と経度はその場所の地理的範囲内の任意のポイントであるため、信頼できるリバース ジオコーディング アルゴリズムを作成するのは困難です。

しかし、あなたは正確さを気にしないかもしれません。その場合、「十分に近い」住所が必要な場合は、リバース ジオコーディングが適している可能性があります。


注意すべきもう1つのこと:

static Place getPlace(インテント インテント, コンテキスト コンテキスト) このメソッドは廃止されました。代わりに getPlace(Context, Intent) を使用してください。

行を置き換える必要があると思います:

Place place = PlacePicker.getPlace(data, getActivity());

これとともに:

Place place = PlacePicker.getPlace(getActivity(), data);

完全な開示: 私は SmartyStreets で働いています。

于 2017-01-05T17:33:31.400 に答える