Как я нахожу lat/long, который является x км к северу от данного lat/long?

Зависит от Вашей версии крона. Используя крон Vixie на FreeBSD, я могу сделать что-то вроде этого:

(cd /var/cron/tabs && grep -vH ^# *) 

, если я хочу его больше вкладки deliminated, я мог бы сделать что-то вроде этого:

(cd /var/cron/tabs && grep -vH ^# * | sed "s/:/      /")

, Где это - литеральная вкладка в sed заменяющей части.

Это может быть более системно-независимо, чтобы циклично выполниться через пользователей в /etc/passwd и сделать crontab -l -u $user для каждого из них.

27
задан Pang 5 March 2018 в 04:52
поделиться

4 ответа

Если у вас есть заданная широта и долгота, вы можете рассчитать правильную широту и долготу изменения широты на x км следующим образом:

new-lat = ((old-km-north + x-km-change)/40,075) * 360)
           ^ is the ratio of the                  ^ times the ratio of the circle
           of the earth the change                by 360 to get the total ratio 
           covers.                                covered in degrees.

То же самое можно применить и к долготе. Если у вас есть общее расстояние плюс изменение, вы можете рассчитать общее количество градусов аналогичным образом.

new-long = ((old-km-east + x-km-change)/40,075) * 360)
           ^ is the ratio of the                  ^ times the ratio of the circle
           of the earth the change                by 360 to get the total ratio 
           covers.                                covered in degrees.

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

Изменить: Как указал Скиз 40,

5
ответ дан 28 November 2019 в 05:08
поделиться

У меня очень похожий фрагмент кода. По сравнению с другой реализацией он дал мне очень близкие результаты.

Я думаю, что проблема с вашей в том, что вы используете «расстояние» как линейное расстояние в метрах вместо углового расстояния в радианах.

/// <summary>
/// Calculates the end-point from a given source at a given range (meters) and bearing (degrees).
/// This methods uses simple geometry equations to calculate the end-point.
/// </summary>
/// <param name="source">Point of origin</param>
/// <param name="range">Range in meters</param>
/// <param name="bearing">Bearing in degrees</param>
/// <returns>End-point from the source given the desired range and bearing.</returns>
public static LatLonAlt CalculateDerivedPosition(LatLonAlt source, double range, double bearing)
{
    double latA = source.Latitude * UnitConstants.DegreesToRadians;
    double lonA = source.Longitude * UnitConstants.DegreesToRadians;
    double angularDistance = range / GeospatialConstants.EarthRadius;
    double trueCourse = bearing * UnitConstants.DegreesToRadians;

    double lat = Math.Asin(
        Math.Sin(latA) * Math.Cos(angularDistance) + 
        Math.Cos(latA) * Math.Sin(angularDistance) * Math.Cos(trueCourse));

    double dlon = Math.Atan2(
        Math.Sin(trueCourse) * Math.Sin(angularDistance) * Math.Cos(latA), 
        Math.Cos(angularDistance) - Math.Sin(latA) * Math.Sin(lat));

    double lon = ((lonA + dlon + Math.PI) % UnitConstants.TwoPi) - Math.PI;

    return new LatLonAlt(
        lat * UnitConstants.RadiansToDegrees, 
        lon * UnitConstants.RadiansToDegrees, 
        source.Altitude);
}

Где

public const double EarthRadius = 6378137.0;   //  WGS-84 ellipsoid parameters

и LatLonAlt в градусах / метрах (преобразование происходит внутренне). При необходимости отрегулируйте.

Я полагаю, вы можете выяснить, какое значение для UnitConstants.DegreesToRadians равно:)

23
ответ дан 28 November 2019 в 05:08
поделиться

Я не уверен, что мне здесь что-то не хватает, но я думаю, что вопрос можно перефразировать как , «У меня есть точка широты / долготы, и я хочу найти точку на x метров к северу и на x метров к югу от этой точки».

Если это вопрос, то вам не нужно находить новую долготу (что делает все попроще), вам просто нужна новая широта. Градус широты составляет примерно 60 морских миль в любой точке Земли, а морская миля составляет 1852 метра. Итак, для новых широт x метров на север и юг:

north_lat = lat + x / (1852 * 60)
north_lat = min(north_lat, 90)

south_lat = lat - x / (1852 * 60)
south_lat = max(south_lat, -90)

Это не совсем точно, потому что Земля не является идеальной сферой с точно 60 морскими милями между каждым градусом широты. Однако другие ответы предполагают, что линии широты равноудалены, поэтому я предполагаю, что вы этого не сделаете. Меня это не волнует. Если вас интересует, сколько ошибок это может привести, по этой ссылке есть хорошая таблица в Википедии, которая показывает «Расстояние от поверхности на 1 ° изменения широты» для разных широт:

http: //en.wikipedia. org / wiki / Latitude # Degree_length

7
ответ дан 28 November 2019 в 05:08
поделиться

Будет более точным, если вы сначала перепроецируете его на UTM , а затем проверите расстояние.

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

0
ответ дан 28 November 2019 в 05:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: