如何区分我正在走的街道和我周围的其他街道?

问题描述

我以前从同一个应用程序中收集了一些来自全市各地的位置,但情况是当我从后端收到这些位置时,我只需要绘制位置在我的街道上,(我只需要查看仅属于我的街道或仅位于我现在正在步行的街道的位置)

无论如何要区分街道 Im walking in and the other streets round me,by get the street name more accurately or getting something like streetId`?

我在 onLocationChanged 方法调用方法

private String getStreetName(Location location) {
    Geocoder geocoder;
    List<Address> addresses;
    String sTradd="";
    geocoder = new Geocoder(this,Locale.getDefault());

    try {
        addresses = geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);
        if (!addresses.isEmpty()) {
            Address returnedAddress = addresses.get(0);
            StringBuilder strReturnedAddress = new StringBuilder("");
            int i = 0;
            do{
                strReturnedAddress.append(returnedAddress.getAddressLine(i)).append(" ");
                i++;
            }while (i < returnedAddress.getMaxAddressLineIndex());
            sTradd = strReturnedAddress.toString();
        } else {
            Log.e("MyCurrentLoctionAddress","No Address returned!");
        }

    } catch (Exception e) {
        e.printstacktrace();
    }
    return sTradd;
}

问题是我从地理编码中得到的这个地址根本不准确。

在这条街100米内的同一条街上得到了这三个地址,我得到了3个不同的地址

*Mashyakhet Al Azhar Al Sharif,El-Gamaleya,Monsha'et Nasser,Cairo Governorate,Egypt

*Salah Salem St,Egypt 

*139 Salah Salem St,El Gamaliya,Egypt

解决方法

由于 GPS(以及其他位置确定服务)errors,您没有获得“地面实况”位置坐标。因此,恕我直言,当您存储位置时,您需要将用户当前位置映射到道路,Google 知道(例如在 this answer 中使用 Snap to Road part of Roads API)并且不仅存储道路上的位置,还存储与当前用户的距离位置,因为您不仅需要通过坐标本身来检查位置坐标的等价性,还需要考虑到它们周围的一些区域。然后,当您需要检查用户位置时,再次将用户路径捕捉到道路并将用户位置映射到“捕捉到道路”路径上。

或者您可以使用 Nearest Roads part of Roads API 并从 Nearest Roads API 调用中选择

https://roads.googleapis.com/v1/nearestRoads?points=60.170880,24.942795|60.170879,24.942796|60.170877,24.942796&key=YOUR_API_KEY

回复:

{
  "snappedPoints": [
    {
      "location": {
        "latitude": 60.170877918672588,"longitude": 24.942699821922421
      },"originalIndex": 0,"placeId": "ChIJNX9BrM0LkkYRIM-cQg265e8"
    },{
      "location": {
        "latitude": 60.170876898776406,"longitude": 24.942699912064771
      },"originalIndex": 1,{
      "location": {
        "latitude": 60.170874902634374,"longitude": 24.942700088491474
      },"originalIndex": 2,"placeId": "ChIJNX9BrM0LkkYRIM-cQg265e8"
    }
  ]
}

街道,与用户当前位置的距离最小。要确定距离,您可以使用 SphericalUtilMaps SDK for Android Utility Library 部分:

LatLng  userLocation = getUserLocation();
LatLng nearestStreet = null;
double minDist = 100000;
for (LatLng streetCoord: streetCoords) {
    double dist = SphericalUtil.computeDistanceBetween(userLocation,streetCoord);
    if (dist < minDist) {
        nearestStreet = streetCoord;
        dist = minDist;
    }
}

// here nearestStreet should contains location of nearest street (but may be null).

注意!上面的代码仅用于说明:您需要使用地理编码来获取 nearestStreet LatLng 对象的街道名称或将响应解析为 Place 对象并从中获取 PlaceID 以获取街道名称等