是否可以获得当前位置与街道、大道或区域之间的距离?

Posted

技术标签:

【中文标题】是否可以获得当前位置与街道、大道或区域之间的距离?【英文标题】:is it possible to get distance between current location and a street, avenue or area? 【发布时间】:2017-02-03 18:35:08 【问题描述】:

所有关于计算距离的解决方案都是在两点之间。 我的问题是: 有什么方法可以计算到某条街道的距离吗?

假设我想计算从我的位置到特定区域或大道的距离,那里有很多街道可以到达那里,在这种情况下如何知道离我最近的街道可以到达那里?

这里我只有一个点(我的位置),而目标点是不同的,取决于我当前的位置。我所知道的目的地是在某个街道或区域,那么如何计算呢?

此问题的另一种情况,假设我距离某条 1 公里长的街道 10 米。 我应该能够计算出我的距离是从那条街道的起点开始的 10 米,在进入街道的这段距离之后,我每醒来 1 公里,从我所在的位置到这条街道的距离应该是 0 米,并且当我从另一边退出时,距离应该从那条街道的终点而不是起点再次计算,所以当我离开它大约 5 米时,它应该计算为 5 米而不是 1005 米。


这是谷歌地图上的示例要求:

首先让我们在地图上看到Wall Street in NY city。

所以目标目的地是华尔街。 现在如果你现在的位置在约翰街和水街的交叉口,我的任务是带你到华尔街最近的点,路径将是this one(步行模式)。

但是,如果您在 Broad Street 与 Beaver Street 的交叉口,那么到华尔街最近点的目的地将是 like this one(步行模式):

这是我的问题


有可能吗?新的 API 是否为此提供了解决方案?

有什么解决方案或想法吗?

【问题讨论】:

一个“距离”根据定义需要两个点。一些geocoding services 将帮助您获得(至少是粗略的)街道、大道或区域的坐标。 “让您到达那里的最近的街道”更为复杂,因为实际上您是在询问导航说明。为了计算到街道的确切距离,您需要知道它的坐标点并且可以获得它们,例如来自 Mapzen 作为矢量地图数据。那么实际的计算是一个几何问题:如果可能的话,到一条线的垂直距离,否则到最近点的距离。 @MarkusKauppinen 感谢您的回复,正如您所说,如何使用谷歌地图从我的位置获取最近的点属于特定街道?我有两个信息,1.我的位置坐标。 2.目的地街道名称。现在我想作为到那条街道上最近点的最短路径到达那里,如果我确定最近点,那么我将能够通过使用最近的街道通往那里并获得其他导航说明。但是如何获得最近的点属于一条街道作为目标目的地点?这就是问题所在。 否决票...不是问题,但请给我一个理由。我正在寻找这个问题的解决方案,如果有人想投票并知道解决方案,请继续,但请给我一个解决方案。 我认为您最终真正想要的是什么并不清楚。假设您在法国的南特市,想参观巴黎的埃菲尔铁塔:您想知道埃菲尔铁塔与您在南特的当前位置有多远,或者您想获得驾驶/旅行说明埃菲尔铁塔是租车还是 TGV 火车?投反对票可能是因为这似乎是一个相当广泛且不那么具体的问题,从您这边看不到太多背景工作。 是的,你可以,但你需要纬度和经度 【参考方案1】:

嘿,是的,您在这里获得搜索位置的纬度和经度,我将举例说明如何获得。

您可以使用 google autocomplete 搜索任何地点。然后从 autocomplete api 获取 placeid,然后将其传递给 details api。

https://maps.googleapis.com/maps/api/place/autocomplete/json

https://maps.googleapis.com/maps/api/place/details/json

查看传递参数

//Google Autocomplete
@GET(ApiConstants.GET_AUTOCOMPLETE)
Observable<GoogleAutocompleteSearchResponse> getAutoCompleteSearch(@Query("input") String input, @Query("key") String key, @Query("components") String components);

// Google Autocomplete places
@GET(ApiConstants.GET_AUTOCOMPLETE_PLACE)
Observable<GoogleAutoCompletePlacesResponse> getAutoCompletePlaces(@Query("placeid") String input, @Query("key") String key);

您可以在第二个api中获取纬度经度。

希望这会对你有所帮助。

【讨论】:

【参考方案2】:

先获取目的地位置的经度、纬度

public Location getCoordinatesFromAddress(Context context,String strAddress) 

    Geocoder coder = new Geocoder(context);
    List<Address> address;
    Location destinationLoc = null;

    try 
        address = coder.getFromLocationName(strAddress, 5);
        if (address == null) 
            return null;
        
        Address location = address.get(0);
        destinationLoc = new Location("Destination");

        destinationLoc.setLatitude(location.getLatitude());
        destinationLoc.setLongitude(location.getLongitude());

     catch (Exception ex) 

        ex.printStackTrace();
    

    return destinationLoc;
   

正如您提到的,您有当前位置的纬度和经度。使用它来创建您的当前位置。

Location locationA = new Location("Present location ");

locationA.setLatitude(latA);
locationA.setLongitude(lngA);

接下来在获得目的地和源(当前)位置的纬度和经度后,您可以轻松计算它们之间的距离 例如

float distance = locationA.distanceTo(locationB);

它将以米为单位为您提供两个地理位置的黑白距离。

【讨论】:

【参考方案3】:

看看this response。还可以查看来自 google 的 this API。

我猜你想要的是这样的: - 获取目标街道坐标 [lat, long] - 从谷歌获取附近的地方, - 搜索最近的地方。

【讨论】:

【参考方案4】:

在这种情况下,如果您可以同时获得目的地和起点的地址,那么通过以下方法您可以获得地址之间的距离。

您需要传递地址(起点/终点)或纬度/经度(起点/终点)

1) 这里的origin参数可以如下,如果提供地址的话

origins=Bobcaygeon+ON|24+Sussex+Drive+Ottawa+ON

2) 其中,如果提供了纬度/经度,则格式如下。

origins=41.43206,-81.38992

3) 如果你能得到地点 ID ,那么这就是格式

origins=place_id:ChIJ3S-JXmauEmsRUcIaWtf4MzE

以下示例使用纬度/经度坐标来指定目的地坐标

https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=40.6655101,-73.89188969999998&destinations=40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.659569%2C-73.933783%7C40.729029%2C-73.851524%7C40.6860072%2C-73.6334271%7C40.598566%2C-73.7527626%7C40.659569%2C-73.933783%7C40.729029%2C-73.851524%7C40.6860072%2C-73.6334271%7C40.598566%2C-73.7527626&key=YOUR_API_KEY

编码折线的相同请求将是

https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=40.6655101,-73.89188969999998&destinations=enc:_kjwFjtsbMt%60EgnKcqLcaOzkGari%40naPxhVg%7CJjjb%40cqLcaOzkGari%40naPxhV:&key=YOUR_API_KEY

正如其他人所解释的,使用 API 查找最短距离的一般方法是

float distance = firstLocation.distanceTo(secondLocation);

更多信息请通过this link

【讨论】:

【参考方案5】:

如果您知道两点的纬度和经度,只需使用Haversine 公式计算两点之间的距离。

节点包:Haversine Node 分级:Gradle Haversine

【讨论】:

以上是关于是否可以获得当前位置与街道、大道或区域之间的距离?的主要内容,如果未能解决你的问题,请参考以下文章

在Objective C中使用iBeacon查找距离

如何连续计算位置更新之间的距离以获得总距离

计算当前位置和点之间的距离[重复]

将字符串转换为核心位置

“我当前的地理位置”和其他坐标之间的计算

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