Проектирование наложения сетки на основе долготы и широты - PullRequest
2 голосов
/ 01 ноября 2009

Я пытаюсь найти лучший способ подойти к следующему:

Скажи, что у меня плоское представление о земле. Я хотел бы создать сетку, которая перекрывает это с каждым квадратом на сетке, соответствующей примерно 3 квадратным километрам. Каждый квадрат будет иметь уникальный идентификатор региона. Эта сетка будет просто сохранена в таблице базы данных, которая будет иметь идентификатор региона, а затем, вероятно, координаты длинного / лат четырех углов региона, верно? Любые предложения о том, как легко создать эту таблицу? Я знаю, что сначала мне нужно выяснить ширину и высоту этой «сплющенной земли» в километрах, рассчитать количество областей, а затем каким-то образом назначить длинные / лат для каждого пересечения вертикальной / горизонтальной линии; однако, это звучит как много ручной работы.

Во-вторых, после создания таблицы сетки мне нужно спроектировать fxn, который берет пару long / lat и затем определяет, в каком логическом «регионе» он находится. Я не уверен, как это сделать.

Любая помощь будет оценена.

Спасибо.

Ответы [ 5 ]

3 голосов
/ 02 ноября 2009

Предположим, что Земля - ​​это сфера с радиусом R = 6371 km.

Начать с (широта, лонг) = (0, 0) град. В районе экватора 3 км соответствует изменению долготы на

dlong = 3 / (2 * pi * R) * 360 
      = 0.0269796482 degrees

Если мы будем обходить экватор и ставить маркер каждые 3 км, их будет около (2 * pi * R) / 3 = 13343.3912. "О", потому что это ваше решение, как справиться с дополнительными 0.3912.

От (0, 0) мы идем на север 3 км до (широта, длинна) (0.0269796482, 0). Мы снова будем ходить вокруг Земли по пути, который локально параллелен первому пути, по которому мы шли. Поскольку он немного ближе к Северному полюсу, радиус этого круга немного меньше, чем у первого круга, который мы прошли. Давайте использовать нижний регистр r для этого радиуса

r = R * cos(lat)
  = 6371 * cos(0.0269796482)
  = 6 368.68141 km

Мы снова вычисляем dlong, используя меньший радиус,

dlong = 3 / (2 * pi * r) * 360
      = 0.0269894704 deg

Мы установили второй набор флагов. На этот раз их около (2 * pi * r) / 3 = 13 338.5352. Раньше их было 13 343, а сейчас - 13 338. Что это такое? пять меньше.

Как мы рисуем ленту квадратов, когда в верхней строке меньше пяти углов? Фактически, когда мы обошли Землю, мы обнаружили, что начали с довольно хороших квадратов, но форма областей распалась на довольно экстремальные параллелограммы.

Нам нужна другая стратегия, которая дает нам одинаковое количество углов выше и ниже. Если нижняя граница (SW-SE) имеет длину 3 км, то верхняя часть должна быть немного короче, чтобы образовалась лента трапеций.

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

Специфика вашего приложения может значительно упростить вам задачу, особенно если вам не нужно отображать весь глобус.

2 голосов
/ 01 ноября 2009

Microsoft вкладывает средства в пространственные типы данных в свое предложение SQL Server 2008. Это может помочь вам здесь. Поскольку у него есть типы данных для представления ваших сплющенных земных областей, операторы для определения, когда набор координат находится внутри геометрии, и т. Д. Даже если вы решите не использовать это, рассмотрите возможность проверки следующих ссылок. Второй, в частности, содержит много полезной справочной информации о проблеме и обсуждение некоторых стандартных отраслевых форматов данных для пространственных данных.

http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx

http://jasonfollas.com/blog/archive/2008/03/14/sql-server-2008-spatial-data-part-1.aspx

1 голос
/ 01 ноября 2009

Во-первых, Павел прав. К сожалению, земля круглая, что действительно усложняет эту вещь.

Я создал сетку, подобную этой, для сервера топографических карт много лет назад. Я только что записал координаты верхнего левого кодера каждой области. Я также использовал координаты UTM вместо широты / долготы. Если вы знаете, что каждый регион покрывает 3 квадратных километра, и, поскольку UTM основан на метрах, будет просто выполнить запрос диапазона, чтобы найти правильный регион.

1 голос
/ 01 ноября 2009

Вы понимаете, что, поскольку Земля - ​​это сфера, "3 квадратных километра" будет иметь различное количество градусов вблизи полюсов, чем вблизи экватора, верно? И что вверху и внизу карты ваши квадраты сетки будут фактически представлять части мира в форме кругов, верно?

Я сделал нечто похожее с моей базой данных - я разбил ее на четыре ячейки. Поэтому я разделил землю на четыре четверти (-180, -90) - (0,0), (-180,0) - (0,90) и так далее. Когда я добавил точечные объекты в свою базу данных, если «ячейка» получила больше X записей, я разделил ячейку на 4. Это означает, что в областях мира с большим количеством точечных объектов у меня много четырехугольных ячеек, но в других частях света у меня их очень мало.

Моя база данных для дерева квадов выглядит так:

\d areaids;
                 Table "public.areaids"
    Column    |            Type             | Modifiers 
--------------+-----------------------------+-----------
 areaid       | integer                     | not null
 supercededon | timestamp without time zone | 
 supercedes   | integer                     | 
 numpoints    | integer                     | not null
 rectangle    | geometry                    | 
Indexes:
    "areaids_pk" PRIMARY KEY, btree (areaid)
    "areaids_rect_idx" gist (rectangle)
Check constraints:
    "enforce_dims_rectangle" CHECK (ndims(rectangle) = 2)
    "enforce_geotype_rectangle" CHECK (geometrytype(rectangle) = 'POLYGON'::text OR rectangle IS NULL)
    "enforce_srid_rectangle" CHECK (srid(rectangle) = 4326)

Я использую PostGIS, чтобы помочь найти точки в ячейке. Если я смотрю на ячейку, я могу сказать, была ли она разделена, потому что supercededon не равен нулю. Я могу найти его детей, отыскивая тех, у которых есть supercedes, равный его идентификатору. И я могу копаться сверху вниз, пока не найду те, которые покрывают интересующую меня область, ища те с нулевым supercedeson, чей прямоугольник перекрывает мою область интереса (используя оператор PostGIS '&'). *

0 голосов
/ 13 июля 2016

Вы никак не сможете сделать это с прямоугольными ячейками, но я только что закончил пакет R dggridR , который упростил бы это, используя сетку из шестиугольных ячеек. Тем не менее, требование к ячейке 3 км может привести к такому количеству ячеек, что это приведет к перегрузке вашей машины.

Вы можете использовать R для создания сетки:

install.packages('devtools')
install.packages('rgdal')
library(devtools)
devools.install_github('r-barnes/dggridR')
library(dggridR)
library(rgdal)

#Construct a discrete global grid (geodesic) with cells of ~3 km^2
dggs <- dgconstruct(area=100000, metric=FALSE, resround='nearest')

#Get a hexagonal grid for the whole earth based on this dggs
grid <- dgearthgrid(dggs,frame=FALSE)

#Save the grid
writeOGR(grid, "grid_3km_cells.kml", "cells", "KML")

В этом файле KML содержатся идентификаторы и координаты вершин ребер каждой ячейки.

Сетка выглядит примерно так:

Discrete Global Grid

Мой пакет основан на DGGRID Кевина Сара, который может генерировать эту же сетку напрямую в KML, хотя вам нужно будет выяснить, как ее скомпилировать самостоятельно.

...