【问题标题】:Android: Reverse geocoding - getFromLocationAndroid:反向地理编码 - getFromLocation
【发布时间】:2010-10-03 02:33:24
【问题描述】:

我正在尝试根据 long/lat 获取地址。似乎这样的事情应该有效?

Geocoder myLocation = Geocoder(Locale.getDefault());
    List myList = myLocation.getFromLocation(latPoint,lngPoint,1);

问题是我不断收到:方法 Geocoder(Locale) 未定义类型 savemaplocation

任何帮助都会有所帮助。谢谢。


谢谢,我首先尝试了上下文,语言环境,但失败了,正在查看其他一些构造函数(我见过一个只提到语言环境的构造函数)。无论如何,

它不起作用,因为我仍然得到:方法 Geocoder(Context, Locale) 未定义类型 savemaplocation

我有:导入 android.location.Geocoder;

【问题讨论】:

    标签: android reverse-geocoding street-address


    【解决方案1】:

    以下代码 sn-p 正在为我做这件事(lat 和 lng 是在此位上方声明的双精度):

    Geocoder geocoder = new Geocoder(this, Locale.getDefault());
    List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
    

    【讨论】:

    • 我也试过这个,每次尝试查看地址列表时,它都炸了。不知道发生了什么。我会在一两天后在这里尝试一个新应用程序,看看我能找到什么。
    • 我发现这对定位东西很有帮助:blogoscoped.com/archive/2008-12-15-n14.html
    • ...我的清单中还有以下两个权限: 当我错过其中一个(不记得是哪一个)时,应用程序抛出了一个非常无用的错误。
    • 如何给这个类添加一个 api 密钥?所以我可以得到更多的请求?
    • 我们在 2019 年 (api>= 26 SDK) 是否有某种方法可以在不通过 Context 的情况下获取地址?
    【解决方案2】:

    这是一个完整的示例代码,它使用 Thread 和 Handler 在不阻塞 UI 的情况下获取 Geocoder 答案。

    Geocoder调用过程,可以位于Helper类中

    public static void getAddressFromLocation(
            final Location location, final Context context, final Handler handler) {
        Thread thread = new Thread() {
            @Override public void run() {
                Geocoder geocoder = new Geocoder(context, Locale.getDefault());   
                String result = null;
                try {
                    List<Address> list = geocoder.getFromLocation(
                            location.getLatitude(), location.getLongitude(), 1);
                    if (list != null && list.size() > 0) {
                        Address address = list.get(0);
                        // sending back first address line and locality
                        result = address.getAddressLine(0) + ", " + address.getLocality();
                    }
                } catch (IOException e) {
                    Log.e(TAG, "Impossible to connect to Geocoder", e);
                } finally {
                    Message msg = Message.obtain();
                    msg.setTarget(handler);
                    if (result != null) {
                        msg.what = 1;
                        Bundle bundle = new Bundle();
                        bundle.putString("address", result);
                        msg.setData(bundle);
                    } else 
                        msg.what = 0;
                    msg.sendToTarget();
                }
            }
        };
        thread.start();
    }
    

    这是在您的 UI Activity 中对该 Geocoder 过程的调用:

    getAddressFromLocation(mLastKownLocation, this, new GeocoderHandler());
    

    以及在 UI 中显示结果的处理程序:

    private class GeocoderHandler extends Handler {
        @Override
        public void handleMessage(Message message) {
            String result;
            switch (message.what) {
            case 1:
                Bundle bundle = message.getData();
                result = bundle.getString("address");
                break;
            default:
                result = null;
            }
            // replace by what you need to do
            myLabel.setText(result);
        }   
    }
    

    别忘了把以下权限放在你的Manifest.xml

    <uses-permission android:name="android.permission.INTERNET" />
    

    【讨论】:

    • 代码完美无瑕,为进一步定制提供了良好的基础
    • 这是正确的,否则android将通过NetworkOnMainThreadException。或者,甚至可以使用更简单的AsyncTask来做到这一点
    • 反向地理编码地址出现多次。不知道为什么?
    • @VineethKuttipurathkottayodan 如果同一个地址出现多次,那是因为你把函数 getAddressFromLocation 放在了 onLocationChanged 函数中
    【解决方案3】:

    这里似乎发生了两件事。

    1) 您在调用构造函数之前错过了 new 关键字。

    2) 您传递给 Geocoder 构造函数的参数不正确。您正在传递一个 Locale ,它期待一个 Context

    有两个Geocoder 构造函数,它们都需要Context,还有一个也需要Locale

    Geocoder(Context context, Locale locale)
    Geocoder(Context context)
    

    解决方案

    修改您的代码以传入有效的上下文并包含new,您应该一切顺利。

    Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());   
    List<Address> myList = myLocation.getFromLocation(latPoint, lngPoint, 1);
    

    注意

    如果您仍然遇到问题,则可能是权限问题。地理编码隐式使用 Internet 来执行查找,因此您的应用程序将需要在清单中使用 INTERNET uses-permission 标记。

    在清单的 manifest 节点中添加以下使用权限节点。

    <uses-permission android:name="android.permission.INTERNET" />
    

    【讨论】:

    • 谢谢,我想我昨晚工作太晚了,不知道我的新人发生了什么。我想我最初忘记了它,当我只有我的语言环境时将其重新打开,然后当我回去时,再次忘记它..我很感激..
    • 别担心,我也不是第一次发现它:)
    【解决方案4】:

    原因是后端服务不存在:

    Geocoder 类需要一个不包含在核心 android 框架中的后端服务。如果平台中没有后端服务,Geocoder 查询方法将返回一个空列表。

    【讨论】:

    • 这是正确答案。没有后端,其他答案将不起作用。
    • 只要 Google Play 服务正在运行,它就可以在模拟器之外运行
    【解决方案5】:

    首先使用 Location 和 LocationManager 类获取纬度和经度。现在试试下面的代码获取城市,地址信息

    double latitude = location.getLatitude();
    double longitude = location.getLongitude();
    Geocoder gc = new Geocoder(this, Locale.getDefault());
    try {
        List<Address> addresses = gc.getFromLocation(lat, lng, 1);
        StringBuilder sb = new StringBuilder();
        if (addresses.size() > 0) {
            Address address = addresses.get(0);
            for (int i = 0; i < address.getMaxAddressLineIndex(); i++)
                sb.append(address.getAddressLine(i)).append("\n");
                sb.append(address.getLocality()).append("\n");
                sb.append(address.getPostalCode()).append("\n");
                sb.append(address.getCountryName());
        }
    

    城市信息现在是 sb。现在将 sb 转换为 String(使用 sb.toString() )。

    【讨论】:

      【解决方案6】:

      好吧,我还是很难过。所以这里有更多代码。

      在我离开我的地图之前,我会打电话给SaveLocation(myMapView,myMapController); 这最终会调用我的地理编码信息。

      但由于getFromLocation 可以抛出IOException,我必须执行以下操作才能调用SaveLocation

      try
      {
          SaveLocation(myMapView,myMapController);
      }
      catch (IOException e) 
      {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
      

      然后我必须通过说它抛出 IOExceptions 来更改 SaveLocation:

       public void SaveLocation(MapView mv, MapController mc) throws IOException{
          //I do this : 
          Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());   
          List myList = myLocation.getFromLocation(latPoint, lngPoint, 1);
      //...
          }
      

      而且每次都会崩溃。

      【讨论】:

      • 可能是权限问题。地理编码器使用互联网进行查找,因此您需要互联网使用许可。用详细信息更新了答案。
      • 我拥有映射的互联网权限。很奇怪为什么它总是失败。让我得到一个 logcat。
      • 这是我得到的异常:java.lang.IllegalArgumentException: latitude == 3.2945512E7
      • 我想我明白了,它需要纬度/经度而不是 E7(即 32.945512)
      • @Chrispix 什么是 E7?我想弄清楚我的问题是什么?
      【解决方案7】:

      使用这个

      Geocoder geocoder = new Geocoder(this, Locale.getDefault());
      List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        相关资源
        最近更新 更多