我以前从同一个应用程序收集了来自城市各地的一些位置,但情况是,当我从后端收到这些位置时,我只需要绘制位置在我的街道上,(我只需要查看只属于我的街道或只位于我现在行走的街道上的位置(
是否要区分街道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米以内的同一条街上有这三个地址,我有三个不同的地址
*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
由于GPS(以及其他位置确定服务(错误,您没有获得"地面真相";位置坐标。因此,IMHO,当您存储位置时,您需要将用户当前位置映射到道路,Google知道这一点(例如,在这个答案中,使用roads API的Snap to Road部分(,并不仅存储道路上的位置,还存储与当前用户位置的距离,因为您不仅需要通过坐标本身,还需要考虑周围的一些区域来检查位置坐标的等效性。然后,当你需要检查用户位置时,再次将用户路径捕捉到道路上,并在"地图"上绘制用户位置;"突然上路";路径
或者,您可以使用道路API的最近道路部分,并从最近道路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, "placeId": "ChIJNX9BrM0LkkYRIM-cQg265e8" }, { "location": { "latitude": 60.170874902634374, "longitude": 24.942700088491474 }, "originalIndex": 2, "placeId": "ChIJNX9BrM0LkkYRIM-cQg265e8" } ] }
街道,与用户当前位置的距离最小。要确定距离,您可以使用Android实用程序库地图SDK的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).
NB!上面的代码只是为了说明:您需要使用地理编码来获取nearestStreet
LatLng
对象的街道名称,或者将响应解析为Place
对象并从中获取PlaceID
来获取街道名称等。