适用于Android的Mapbox地理编码服务仅适用于美国?

时间:2016-04-23 14:03:00

标签: java android geocoding mapbox

我最近尝试过Mapbox here为Android提供的地理编码器示例。它工作得很好,但即使使用反向地理编码,它也只是我研究中的美国城市。例如,当我在地图中单击“法国”时,结果为“#34;未找到"”。它仅适用于美国。那么有一种方法可以在美国以外的其他国家获得地理编码服务吗?比如法国?

2 个答案:

答案 0 :(得分:1)

您是否有特殊原因要使用MapBox提供的地理编码器而不是Android提供的地理编码器?

如果您真的想使用MapBox中的Geocoder,您可以随时contact他们并提出技术问题。他们通常会在一到两个工作日内或更快地做出回应,具体取决于您所在的时区。

如果不是,你可能想考虑使用android。

  

Geocode
  用于处理地理编码和反向地理编码的类。地理编码是将街道地址或位置的其他描述转换为(纬度,经度)坐标的过程。反向地理编码是将(纬度,经度)坐标转换为(部分)地址的过程。

这是我用来将字符串转换为地址列表的代码片段:

public class Foo extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState){
        if(Geocoder.isPresent()){
            Geocoder gc = new Geocoder(this);
            List<Address> list = gc.getFromLocationName("Amsterdam", 10);
        }
    }
}

有一点需要注意

在编写测试代码时,我注意到maxResults参数现在无法正常运行。在大多数情况下,函数的响应只会返回一个结果。我仍然决定发布这个作为答案,因为这个bug很可能有一天会被修复。目前,它允许您搜索美国以外的地址。

答案 1 :(得分:0)

Mapbox最近弃用了您正在使用的库,转而支持Mapbox Android服务。它包括您尝试实施的地理编码器,并且在添加新功能时将来会更新。

您可以发布设置客户端的方式吗?这是我用过的一段代码:

private void executeSearch(String query){

    MapboxGeocoder client = new MapboxGeocoder.Builder()
            .setAccessToken(getString(R.string.accessToken))
            .setLocation(query)
            .build();

    client.enqueue(new Callback<GeocoderResponse>() {
        @Override
        public void onResponse(Response<GeocoderResponse> response, Retrofit retrofit) {
            List<GeocoderFeature> results = response.body().getFeatures();

            if (results.size() > 0) {
                String placeName = results.get(0).getPlaceName();
                Double placeLat = results.get(0).getLatitude();
                Double placeLon = results.get(0).getLongitude();

                Intent returnIntent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putDouble("placeLat", placeLat);
                bundle.putDouble("placeLon", placeLon);
                bundle.putString("placeName", placeName);
                returnIntent.putExtra("result", bundle);
                setResult(Activity.RESULT_OK, returnIntent);
                finish();

            } else {
                Toast.makeText(SearchActivity.this, "No Results", Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onFailure(Throwable t) {
            Log.e(LOG_TAG, "Error: ", t);
        }
    });

}// End executeSearch