Получите точную широту / долготу с учетом текущей точки, расстояния и пеленга - PullRequest
0 голосов
/ 10 января 2020

Учитывая существующую точку в широте / длине, расстоянии (в дюймах) и азимуте (в градусах, преобразованных в радианы), я пытаюсь вычислить новую широту / длину. Но полученное в некоторых случаях неточное, потому что я пытаюсь измерить небольшую область для нового широты / долготы. В настоящее время я пытаюсь получить следующий фут в длину, но иногда он имеет ошибку в 1 дюйм. Я использовал следующий алгоритм для этой реализации. Направил этот поток для алгоритма Получить широту / долготу с учетом текущей точки, расстояния и азимута .

public LatLng calculateLatLangFromDistance(double brng, double distance, LatLng latLng){

    double lat1 = Math.toRadians(latLng.getLatitude());
    double long1 = Math.toRadians(latLng.getLongitude());
    double br = Math.toRadians(brng);


   double lat2 = Math.asin(Math.sin(lat1)*Math.cos(distance/r) +
           Math.cos(lat1)* Math.sin(distance/r)* Math.cos(br));

   double long2 = long1 + Math.atan2(Math.sin(br)*Math.sin(distance/r)*Math.cos(lat1),
           Math.cos(distance/r)-Math.sin(lat1)*Math.sin(lat2));

    lat2 = Math.toDegrees(lat2);
    long2 = Math.toDegrees(long2);

   LatLng latLng1 = new LatLng();
   latLng1.setLongitude(long2);
   latLng1.setLatitude(lat2);

   return latLng1;
}

r определяется как 250826771.6535433 // // Радиус Земли от дюймов

Я использую вышеприведенную реализацию для создания 1-футовой сетки для слоя карты mapbox, но некоторые линии результирующей сетки имеют неточность в 1 дюйм. Есть ли способ улучшить эту реализацию для достижения лучших результатов или есть другой способ получить точные значения широты и долготы для этого? enter image description here

это сгенерированная сетка, и я сделал строку рисунок, чтобы получить представление о длине линии некоторых линий в сетке.

1 Ответ

2 голосов
/ 14 января 2020

Вы можете использовать служебные программы сферической геометрии из служебной библиотеки Google Maps SDK для Android.

Указанный метод c, который вы можете использовать, будет метод computeOffset . Вы можете увидеть это при поиске SphericalUtil по этой ссылке .

ComputeOffset возвращает значение LatLng, возникающее в результате перемещения расстояния от начала координат в указанном заголовке (в градусах по часовой стрелке от севера). Вот параметры, которые вам нужно указать:

от - LatLng, с которого следует начать. расстояние - расстояние, на которое нужно проехать. heading - Заголовок в градусах по часовой стрелке от севера.

Чтобы использовать это, добавьте служебную библиотеку к вашим зависимостям:

implementation 'com.google.maps.android:android-maps-utils:0.5'

Это пример строки кода, который я использую:

LatLng newCoordinates = SphericalUtil.computeOffset(new LatLng(-25.363, 131.044),30000, 90);

Надеюсь, это поможет!

...