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

Posted

技术标签:

【中文标题】如何区分我正在走的街道和我周围的其他街道?【英文标题】:How to differentiate between the street I'm walking in, and other streets around me? 【发布时间】:2021-07-28 23:42:00 【问题描述】:

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

有没有办法区分街道 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, Monsha'et Nasser, Cairo Governorate, Egypt 

*139 Salah Salem St, El-Gamaleya, El Gamaliya, Cairo Governorate, Egypt

【问题讨论】:

【参考方案1】:

由于 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&amp;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,
      "placeId": "ChIJNX9BrM0LkkYRIM-cQg265e8"
    ,
    
      "location": 
        "latitude": 60.170874902634374,
        "longitude": 24.942700088491474
      ,
      "originalIndex": 2,
      "placeId": "ChIJNX9BrM0LkkYRIM-cQg265e8"
    
  ]

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

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).

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

【讨论】:

以上是关于如何区分我正在走的街道和我周围的其他街道?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OSM 判断某个坐标是不是在街道上?

你如何处理重复的街道后缀?

text 街道标志的关键字+其他

如何绘制围绕中心坐标相对于设备旋转的真实世界坐标?

查找文本中的美国街道地址(最好使用 Python 正则表达式)

找到最大权重的子图