Определить Geopoint от другого, расстояние и полярный угол
Я работаю над приложением для Android, которое использует Geopoints, и я хочу определить Geopoint от другого Geopoint, расстояния (в любом формате) и полярного угла. Например, я хочу получить координаты места в 100 метрах на северо-северо-востоке (22,5 градуса) моего местоположения, полученного с помощью GPS в моем телефоне.
Единственный метод, который я нашел, это Location.distanceBetween(...)
,
2 ответа
Взгляните на формулы большого круга: http://en.wikipedia.org/wiki/Great-circle_distance
Это должно дать вам несколько советов о том, как рассчитать расстояния.
Для точки на заданном расстоянии и в заголовке, проверьте http://williams.best.vwh.net/avform.htm Эти формулы выглядят довольно сложными, но их легко реализовать;)
Реализация для Android. Этот код отлично подходит для модульного тестирования в вашем приложении:
public double radiansFromDegrees(double degrees)
{
return degrees * (Math.PI/180.0);
}
public double degreesFromRadians(double radians)
{
return radians * (180.0/Math.PI);
}
public Location locationFromLocation(Location fromLocation, double distance, double bearingDegrees)
{
double distanceKm = distance / 1000.0;
double distanceRadians = distanceKm / 6371.0;
//6,371 = Earth's radius in km
double bearingRadians = this.radiansFromDegrees(bearingDegrees);
double fromLatRadians = this.radiansFromDegrees(fromLocation.getLatitude());
double fromLonRadians = this.radiansFromDegrees(fromLocation.getLongitude());
double toLatRadians = Math.asin( Math.sin(fromLatRadians) * Math.cos(distanceRadians)
+ Math.cos(fromLatRadians) * Math.sin(distanceRadians) * Math.cos(bearingRadians) );
double toLonRadians = fromLonRadians + Math.atan2(Math.sin(bearingRadians)
* Math.sin(distanceRadians) * Math.cos(fromLatRadians), Math.cos(distanceRadians)
- Math.sin(fromLatRadians) * Math.sin(toLatRadians));
// adjust toLonRadians to be in the range -180 to +180...
toLonRadians = ((toLonRadians + 3*Math.PI) % (2*Math.PI) ) - Math.PI;
Location result = new Location(LocationManager.GPS_PROVIDER);
result.setLatitude(this.degreesFromRadians(toLatRadians));
result.setLongitude(this.degreesFromRadians(toLonRadians));
return result;
}