是否可以获得当前位置与街道、大道或区域之间的距离?
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【讨论】:
以上是关于是否可以获得当前位置与街道、大道或区域之间的距离?的主要内容,如果未能解决你的问题,请参考以下文章