如何从地方选择者的地址获取国家,城市?

时间:2016-06-17 04:56:16

标签: android reverse-geocoding gmsplacepicker

我正在使用地方选择器的意图获得这个地方。现在我想以分开的形式保存地址,如国家,城市,密码,州。我如何从地方选择器的地址获得所有这些?

代码:

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的方法。我可以使用反向地理编码或其他东西吗?有人可以帮我解决这个问题吗?谢谢。

3 个答案:

答案 0 :(得分:2)

我认为直接使用Place类是不可能的,但你可以从纬度和经度开始要求它谷歌。下面是onActivityResult方法的示例:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == PLACE_PICKER_REQUEST) {
        if (resultCode == RESULT_OK) {
            // get place data
            Place place = PlacePicker.getPlace(data, getActivity());

            // ask for geolocation data
            Geocoder gcd = new Geocoder(this, Locale.getDefault());
            List<Address> addresses = null;
            try {
                addresses = gcd.getFromLocation(place.getLatLng().latitude, place.getLatLng().longitude, 1);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (addresses.size() > 0) {
                String toastMsg = String.format("Place: %s", addresses.get(0).getLocality() + " - " + addresses.get(0).getCountryName() + " - " + addresses.get(0).getCountryCode());
                Toast.makeText(getActivity(), toastMsg, Toast.LENGTH_LONG).show();


                // NOW SET HERE CORRECT DATA
                //location.setText(place.getName());

            }
        }
    }
}

答案 1 :(得分:2)

解决问题的最佳方法是使用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;
        }
    }

答案 2 :(得分:0)

如果您想将Place对象地址(街道,城市,国家等)的组件分开,您有两种选择。

  1. 使用Place.getLatLng()。然后,反向对经度和经度进行地理编码。
  2. 解析地址。
  3. 现在,解析地址并不容易。但是,对纬度和经度进行反向地理编码并不精确。我建议解析地址。那里有很好的地址解析服务,有些甚至可以根据地址数据库验证地址。 (我建议SmartyStreets。如果您转到SmartyStreets demo页面,请从下拉列表中选择&#34;自由格式地址&#34;然后查看搜索地址时返回的信息类型。)

    这就是为什么反向地理编码可能是一个糟糕的解决方案。反向地理编码时,您将获取经度和纬度,并在算法上将其与地址匹配。一些算法将纬度和经度与最接近的实际地址相匹配。在这种情况下,地址可能不是您所在位置的地址。另一方面,一些算法近似于合理地适合纬度和经度的地址。在这种情况下,地址可能不是真实地址。 getLatLng() Place place = PlacePicker.getPlace(data, getActivity()); 中提到了另一个复杂问题:

      

    该地点不一定是地方的中心,或任何特定的进入或退出点,而是地方地理范围内的一些任意选择的点。

    由于纬度和经度是地理范围内的任意点,因此很难制作值得信赖的反向地理编码算法。

    但是,你可能不在乎准确性。如果是这种情况&amp; emdash;你想要一个足够接近的地址,&#34;反向地理编码可能是一个不错的选择。

    需要注意的另一件事是:

      

    static Place getPlace(Intent intent,Context context)   此方法已弃用。请改用getPlace(Context,Intent)。

    我认为你应该替换你的行:

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

    用这个:

    {{1}}

    完全披露:我为SmartyStreets工作。