Android反向地理编码getLocality通常返回null

时间:2011-12-28 22:09:17

标签: android reverse-geocoding

我正在使用Android Geocoding通过Address.getLocality()方法获取当前城市。它运行良好,直到最近它似乎经常为本地返回null。这是一个例子:

    try {
        Geocoder c = new Geocoder(this, Locale.getDefault());
        double lat = 51.481;
        double lon = 0.0;
        List<Address> l = c.getFromLocation(lat, lon, 5);
        for (Address a: l) {
            Log.i("GeocoderTest", "Locality " + a.getLocality() + " (" + a + ")");
        }
    } catch (IOException e) {
        Log.e("GeocoderTest", "", e);
    }

现在,它会为第一个返回的地址记录以下消息:

  

Locality null(地址[addressLines = [0:“14-18 Park Vista”,1:“London   伦敦格林威治自治市镇   SE10" ,2: “UK”] =功能,管理员= NULL,子管理= NULL,局部性= NULL,通途=公园   Vista中,POSTALCODE = NULL,COUNTRYCODE = GB,国家名称=美国   英国,hasLatitude =真,纬度= 51.4819069,hasLongitude =真,经度= -6.327E-4,电话= NULL,URL =无效,额外=空])

某些地区确实会返回该地区的城市,而旁边的地点却没有。

所以之前它确实工作得很好,实际上我以前没有看到过null的局部性。所以我想Google的地理编码服务肯定会发生一些变化。知道发生了什么,这种情况是永久性的吗?如果是,那么从一个地方确定城市的最佳方式是什么?

4 个答案:

答案 0 :(得分:8)

我注意到,通常getLocality()为Geocoder返回的列表中的第一个地址返回null。 另一方面,正确的城市名称保留在下一个地址的位置 所以我使用这种解决方法,它适用于大城市:

 private String getCityNameByCoordinates(double lat, double lon) throws IOException {
    List<Address> addresses = mGeocoder.getFromLocation(lat, lon, 10);
    if (addresses != null && addresses.size() > 0) {
        for (Address adr : addresses) {
            if (adr.getLocality() != null && adr.getLocality().length() > 0) {
                return adr.getLocality();
            }
        }
    }
    return null;
}

答案 1 :(得分:6)

现在我住在加拿大,安大略省,汉密尔顿(汉密尔顿是我的城市,安大略省是省)

我注意到getLocality()返回null,getAdminArea()返回Ontario,getSubLocality()返回Hamilton。 CH

答案 2 :(得分:1)

在 Kotlin 中我做了类似的事情,给定地址 a

var place = a.locality
if (place == null) place = a.subLocality
if (place == null) place = a.subAdminArea
if (place == null) place = a.adminArea

它甚至适用于偏远的地方

答案 3 :(得分:0)

使用// C++/CLI IntPtr MyHost::WndProc (IntPtr hWndPtr, int uMsg, IntPtr wParamPtr, IntPtr lParamPtr, bool % handled) { auto hWnd = (HWND) hWndPtr.ToPointer (); auto wParam = (WPARAM) wParamPtr.ToPointer (); auto lParam = (LPARAM) lParamPtr.ToPointer (); switch (uMsg) { case WM_LBUTTONDOWN: // This doesn't get called. break; ... default: handled = false; return IntPtr (DefWindowProc (hWnd, uMsg, wParam, lParam)); } ... handled = true; return IntPtr (0); } 对我来说很好。