Вычислить координаты квадрата х миль от центральной точки?

11

Я пытаюсь создать квадрат (или круг) вокруг вершины мили вокруг центральной точки, где все стороны квадрата будут на расстоянии х миль от центра. Мне нужны 4 угловые координаты.

Это затягивает мой мозг, пытаясь обвести мою голову? Я могу рассчитать расстояние между двумя точками, используя формулу haversine, но математика - это не моя сильная сторона, и я не понимаю греха, потому что и т. Д., И попытка разобраться в этом потеряла меня!

Я сталкивался с Расчетом Широты / Долготы X миль от точки? но я просто не понимаю!

Кто-нибудь будет достаточно любезен, чтобы объяснить, как я делаю это с точки зрения яблок и груш?

Чтобы точно объяснить, что я пытаюсь сделать;

У меня есть веб-сайт, где пользователи могут искать здания в определенной области. Они войдут в город или место (о котором я буду знать в последнее время) и будут искать в определенном радиусе, скажем, в 10 милях от места.

Мне нужно найти min / max lat и long для 10-мильного радиуса, чтобы я мог запросить свою базу данных, используя предложение where, подобное:

Where buildingLat <= maxLat 
  and buildingLat <= minLat 
  and buildingLong >= minLong 
   or buildingLong >= maxLong

Мне нужна какая-то формула!

Мои координаты в десятичных градусах

Бекс
источник

Ответы:

10

Для этого достаточно простых аппроксимаций. На север или юг один градус составляет около 69 миль, а на восток или запад - всего 69 * cos (широта) миль. Поскольку широты не сильно меняются на протяжении десяти миль, вы можете безопасно использовать косинус центральной широты «квадрата». Поэтому желаемые координаты для квадратных вершин на расстоянии r миль от центрального местоположения (f, l), заданных как широта, вычисляются как

df = r/69        // North-south distance in degrees
dl = df / cos(f) // East-west distance in degrees
{(f-df,l-dl), (f+df,l-dl), (f+df,l+dl), (f-df,l+dl)} // List of vertices

Например, предположим, что r = 10 миль, а центральное местоположение находится на 50 градусах северной широты, 1 градус западной долготы, так что (f, l) = (50, -1) градусов. потом

df = 10/69 = 0.145
dl = 0.145 / cos(50 degrees) = 0.145 / 0.6428 = 0.225
f - df = 50 - 0.145 = 49.855 (southernmost latitude)
f + df = 50 + 0.145 = 50.145 (northernmost latitude)
l - dl = -1 - 0.225 = -1.225 (western longitude)
l + dl = -1 + 0.225 = -0.775 (eastern longitude)

и координаты (49,855, -1,225), (50,145, -1,225), (50,145, -0,775) и (49,855, -0,775) при движении по часовой стрелке вокруг квадрата, начинающегося в его юго-западном углу.

Не используйте это приближение около полюсов или для квадратов больше, чем несколько градусов на стороне. Кроме того, в зависимости от ограничений ГИС, может потребоваться некоторая осторожность в отношении глобального разреза по долготе, обычно принимаемого при + -180 градусах.

Whuber
источник
4

Возьмите координату X центра и вычтите x миль от нее, это левая сторона вашего квадрата. Затем возьмите координату Y центра и вычтите из нее X миль, это нижняя часть вашего квадрата. Повторите эти шаги, но добавьте вместо вычитания, чтобы получить правую руку и верхние края. Теперь вы можете построить четыре угла вашего квадрата.

Обратите внимание, что выше предполагается, что ваша центральная точка в милях. Если это не сначала перепроектировать это. В остальном все ставки сняты, и ваш квадрат не будет квадратным.

Ян Тертон
источник
Вы имеете в виду страницу примера? Как я могу вычесть мили из координаты, и мне не нужно принимать во внимание кривизну Земли?
Bex
Нет, это так просто, что нет необходимости иметь проработанный пример. Может быть, вам нужно указать, какое программное обеспечение вы используете? Как я уже сказал, мое решение предполагает, что вы спроецировали свою координату на местную SRS (если у вас ее нет, то это должен быть ваш первый вопрос)
Ян Тертон
Я действительно смущен сейчас! Я обновил свой вопрос, чтобы точно сказать, что я пытаюсь сделать. Мне нужно создать ограничивающий прямоугольник, чтобы я мог найти минимальный и максимальный лат и длинный.
Bex
3
Тогда должен помочь proj4js ( proj4js.org )
Ян Тертон
1
Мои координаты выглядят так: 51.498485, -0.129089 то есть градусы, не так ли?
Bex
4

Наконец мой ответ: (в C #)

Мне, вероятно, не нужны 4 координаты, но я думаю, что они довольно точные.

 public static void GetBoundingCoords(double centerLat, double centerLong,  double distance)
    {
     Coordinate top=   MaxLatLongOnBearing(centerLat, centerLong,45,10);
     Coordinate right = MaxLatLongOnBearing(centerLat, centerLong, 135, 10);
     Coordinate bottom = MaxLatLongOnBearing(centerLat, centerLong, 225, 10);
     Coordinate left = MaxLatLongOnBearing(centerLat, centerLong, 315, 10);
    }

    public static Coordinate MaxLatLongOnBearing(double centerLat, double centerLong, double bearing, double distance)
    {

        var lonRads = ToRadian(centerLong);
        var latRads = ToRadian(centerLat);
        var bearingRads = ToRadian(bearing);
        var maxLatRads = Math.Asin(Math.Sin(latRads) * Math.Cos(distance / 6371) + Math.Cos(latRads) * Math.Sin(distance / 6371) * Math.Cos(bearingRads));
        var maxLonRads = lonRads + Math.Atan2((Math.Sin(bearingRads) * Math.Sin(distance / 6371) * Math.Cos(latRads)), (Math.Cos(distance / 6371) - Math.Sin(latRads) * Math.Sin(maxLatRads)));

        var maxLat = RadiansToDegrees(maxLatRads);
        var maxLong = RadiansToDegrees(maxLonRads);

        return new Coordinate(){Latitude=maxLat, Longitude=maxLong};
    }

РЕДАКТИРОВАТЬ

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

Бекс
источник
это не будет квадрат.
Ян Тертон
Я изменил свои ориентиры, это был алмаз .. теперь он квадратный
Bex
Что касается редактирования, теорема Пифагора подходит для небольших квадратов, но в целом она не выполняется для сферических прямоугольных треугольников. Странно, что ваш код использует сферическую тригонометрию вместе с этим приближением, основанным на плоской геометрии.
whuber
Мое расстояние никогда не будет больше 100 миль, поэтому я не думаю, что это имеет значение. Поскольку неточности будут небольшими с этим меньшим расстоянием.
Bex
1
Я думаю, что смысл @whuber в том, что нет смысла использовать сложный расчет расстояния по широте и долготе, учитывая, что вы затем комбинируете их с теоремой Пифагора. Вместо этого вы могли бы использовать гораздо более простой расчет, например, как сделал Whuber, или как это делает Эван Тодд . Используйте простые линейные формулы для преобразования долготы в мили и широты в мили или наоборот. Единственная «хитрая» часть - знать, что формула долготы нуждается в корректировке * cos(lat)при преобразовании градусов в мили и / cos(lat)при преобразовании миль в градусы.
ToolmakerSteve
0

Если вы используете пространственно-ориентированную базу данных, вы можете преобразовать интересующую вас область в ту же систему координат, в которой хранятся ваши данные, а затем сравнить яблоки с яблоками.

Например:

  1. Пользователь выбирает местоположение, в результате чего широта / долгота.
  2. Попросите пространственную базу данных преобразовать эту точку в спроектированную систему координат, соответствующую области (единицы футов или метров и т. Д.).
  3. Постройте интересующую вас область вокруг проектируемой точки.
  4. Попросите пространственную базу данных преобразовать эту область интереса обратно в широту / долготу.
  5. Делайте любые сравнения, которые вам нужно сделать.
ворон
источник
0

Я использовал то, что на этой странице

Пункт назначения с учетом расстояния и пеленга от начальной точки

Формула:
lat2 = asin (sin (lat1) * cos (d / R) + cos (lat1) * sin (d / R) * cos (θ))
lon2 = lon1 + atan2 (sin (θ) * sin (d / R) * cos (lat1), cos (d / R) −sin (lat1) * sin (lat2))

θ - азимут (в радианах по часовой стрелке с севера); d / R - угловое расстояние (в радианах), где d - пройденное расстояние, а R - радиус Земли.

Для θ я использовал -45 градусов (в радианах) для «верхней левой точки» и 135 градусов для «нижней правой»

(Я недавно задавал тот же вопрос на сайте по математике )

хуан
источник
Проблема с этим решением заключается в том, что вам сначала нужно вычислить расстояние для диагоналей квадрата. Вместо этого легче перемещаться вдоль геодезических от центра к серединам сторон, а затем, поворачиваясь на 90 градусов, перемещаться вдоль сторон квадрата.
whuber
@whuber, если расстояние достаточно мало, разве ты не можешь использовать для этого простую тригонометрию? (d = противоположная сторона / грех (смежная сторона). Я делаю это, потому что мне не нужно это расстояние, чтобы быть точным. В противном случае, вы можете применить эту формулу дважды, чтобы сделать именно то, что вы говорите (сначала с θ = 0, а затем с θ = -90 для верхнего левого, например)
хуан
Это правильно, Хуан. Но остается только удивляться, почему вы используете более сложные формулы сферической геометрии, когда начинаете с аппроксимации, которая предполагает, что евклидовы формулы будут работать в первую очередь. Нет ничего плохого в использовании сферических формул, но это не нужно и вычислительно неэффективно.
whuber
@whuber, для второго случая это не приблизительно (применяя формулу дважды для каждой стороны). Вы правы, что смешивать их не имеет никакого смысла. Я на самом деле есть это реализовано, но я изменю его (о, а причина в том , что я не так хорош в математике :))
хуан