Mapbox地理编码服务只在Android平台上提供美国地区的服务吗?

4

我最近尝试了Mapbox在Android上提供的地理编码示例。它运行良好,但是即使使用反向地理编码,它仅显示我的研究中的美国城市。例如,当我在地图上点击法国时,结果显示为“未找到”。它仅适用于美国。那么有没有办法获取其他国家(例如法国)的地理编码服务呢?


正如你在我的回答中所读到的那样,Android Geocoder现在并不是最佳选择。我将再次尝试使用Mapbox Rest Api进行地理编码。如果我成功了,我会扩展我的回答。 - Zarathes
2个回答

2

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

如果您真的想使用MapBox的地理编码器,您可以随时联系他们并提出技术问题。根据您所在的时区,他们通常会在一两个工作日内或更快地做出回应。

否则,您可能需要考虑使用Android的地理编码器。

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

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

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 很可能会有一天被修复。而且现在它确实允许您搜索美国以外的地址。


0

Mapbox最近已经弃用了您正在使用的库,转而推荐使用Mapbox Android Services。它包括您试图实现的地理编码器,并且随着新功能的添加,将来会得到更新。

您能否发布一下您客户端的设置方式?这是我使用过的代码片段:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接