я получил широту и долготу точки. мне нужны все показания широты и долготы в радиусе 500 м относительно этой точки. есть ли способ для этого? Является ли это возможным? есть ли у них какой-либо алгоритм для этого?
Алгоритм создания пользовательских геозон
Ответы (2)
Существует множество формул для расчета расстояния между двумя точками широты/долготы (оно не будет точным из-за изменения высоты, но очень близко) и фильтрации точек выборки на основе расстояния от заданной точки. точка.
Хороший обзор того, что доступно (с математикой и исходным кодом), доступен здесь: http://www.movable-type.co.uk/scripts/latlong.html
Просмотрите там и выберите формулу расстояния, которая лучше всего соответствует вашим потребностям.
Вот решение на StackOverflow для определения расстояния между двумя точками от Усмана Курда.
https://stackoverflow.com/a/14394403/2128327
Итак, немного подправив, мы можем использовать его функцию:
public double getKmDistance(GeoPoint StartP, GeoPoint EndP) {
int Radius=6371;//radius of earth in Km
double lat1 = StartP.getLatitudeE6()/1E6;
double lat2 = EndP.getLatitudeE6()/1E6;
double lon1 = StartP.getLongitudeE6()/1E6;
double lon2 = EndP.getLongitudeE6()/1E6;
double dLat = Math.toRadians(lat2-lat1);
double dLon = Math.toRadians(lon2-lon1);
double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2);
double c = 2 * Math.asin(Math.sqrt(a));
double valueResult= Radius*c;
double km=valueResult/1;
DecimalFormat newFormat = new DecimalFormat("####");
kmInDec = Integer.valueOf(newFormat.format(km));
meter=valueResult%1000;
meterInDec= Integer.valueOf(newFormat.format(meter));
Log.i("Radius Value",""+valueResult+" KM "+kmInDec+" Meter "+meterInDec);
return kmInDec;
}
тогда скажем, что у вас есть список местоположений:
ArrayList<GeoPoint> geoPoints = new ArrayList<GeoPoint>();
И у нас есть наше текущее местоположение:
GeoPoint currentLocation = new GeoPoint(..);
то вы можете сделать это:
ArrayList<GeoPoint> within500Km = new ArrayList<GeoPoint>();
for (GeoPoint g : geoPoints)
if (getKmDistance(currentLocation, g) <= 500.0)
within500Km.add(g);
for(GeoPoint g : within500Km)
System.out.println("> "+g.getLatitudeE6()+" : "+g.getLongitudeE6()+" ");