Извлечь все точки широты и долготы в пределах x расстояния с учетом области

Учитывая область, определяемую количеством точек x, я хотел бы разделить эту область на блоки по 3 мили и извлечь долготу центральной широты из каждого блока. Вот что я имею в виду:

Площадь, охватывающая Лондон:

Площадь разделена на 3 мили (не идеально):

А затем распечатайте широту и долготу каждого центра блоков. Это даст мне все точки широты и долготы (в пределах 3 миль), которые покрывают район Лондона.

Мне нужно сделать это программно, учитывая любую область любого размера, но, к сожалению, я понятия не имею, с чего начать. Математика не мой самый сильный предмет, и я мало что сделал с гео. Я думаю, что система координат Universal Transverse Mercator может мне помочь, но, опять же, я не знаю, с чего начать.

1 ответ

Решение

Вы можете сделать это как отдельный SQL-запрос в Postgis, а именно:

SELECT 
  ST_AsText(ST_Transform(ST_SetSrid(ST_MakePoint(
     500000 + x * 4828.03, 155000 + y * 4828.03), 27700), 4326)) 
FROM 
   generate_series(0, 12) x, 
   generate_series(0, 10) y;

Некоторое объяснение в порядке:

  1. Используйте очень полезную функцию generate_series в Postgres для создания сетки в направлениях x и y
  2. Передайте значения x и y, созданные в ST_MakePoint, чтобы создать сетку. Я использовал British National Grid, который проецируется и измеряется в метрах, чтобы помочь в расчете. Нижний левый угол ограничительной рамки, содержащей M25, примерно равен (500000, 155000), поэтому я использовал его в качестве точки привязки. Верхний правый угол приблизительно (560000, 205000), т. Е. 60 х 50 километров. Три мили - это 4828,03 метра, что объясняет смещение на каждой итерации ST_MakePoint. Пределы для generate_series составляют 12 и 10, или 13 и 11 приращений, начиная с 0, то есть количества раз, когда 4828,03 метра вписывается в ширину / высоту ограничительной рамки M25.
  3. Используйте ST_SetSRID, чтобы сообщить Postgis, что эти координаты находятся в British National Grid, известной как 27700.
  4. Используйте ST_Transform для преобразования в широту / долготу, которая известна по идентификатору пространственной привязки (SRID) как 4326.
  5. ST_AsText дает вам текстовое представление основных геометрий. Удалите это, чтобы получить необработанные геометрии, т. Е. Если вы действительно хотите создать таблицу и сохранить точки как геометрии.

Я использовал British National Grid (27700), чтобы создать 3-мильную сетку, а затем преобразовал ее в широты / долготы. Вы могли бы сделать вышеупомянутое непосредственно, вычислив приблизительно, что 3 мили в широтах и ​​долях в Лондоне и выполнив ту же самую процедуру generate_series дважды, но используя непосредственно 4326, и таким образом пропустив ST_Transform. Проблема в том, что минута широты изменится, когда вы идете на север / юг. Британская национальная сеть была разработана с базовой моделью формы Земли (геоид), которая особенно хорошо подходит для Великобритании и отличается от WGS84, используемой в спутниках GPS. Таким образом, логика заключалась в том, что использование сетки в метрах и последующее преобразование в широта / долгота приводили бы к более регулярным искажениям, чем прямое использование широты / долготы, когда масштаб изменяется по мере перемещения на север / юг. На практике, в районе размером с Лондон, вы, вероятно, можете игнорировать все это, если только вы не строите атомную электростанцию:D

Вы упоминаете Spherical Mercator (3857), который является проекцией, используемой Google Maps (и другими) для глобального охвата в метрах. Вы можете использовать вышеописанную процедуру, используя также 3857 - 4326, но эта проекция сохраняет растущее искажение масштаба по мере продвижения на север, тогда как сетка Великобритании, основанная на поперечном меркаторе, имеет постоянный масштаб Север / Юг, и искажение растет по мере продвижения на восток /West. Если вы хотите нанести точки на Карты Google или аналогичные, это может подойти вам. Я оставляю это как упражнение, чтобы выяснить начальную точку в 3857 (подсказка использовать ST_Transform).

Другие вопросы по тегам