Расстояние по морскому калькулятору, промежуточные координаты? - PullRequest
3 голосов
/ 25 марта 2010

Как рассчитать расстояние между двумя координатами по морю? Я также хочу иметь возможность нарисовать маршрут между двумя координатами.

Единственное решение, которое я нашел до сих пор, - это разбить карту на пиксели, идентифицировать каждый пиксель как LAND или SEA, а затем попытаться найти путь, используя алгоритм A *. Затем преобразуйте пиксели в относительные координаты.

Я могу купить несколько программных пакетов, но ни у одного из них нет онлайн-расширений. Служба, которая вычисляет расстояния между морскими портами и прокладывает путь на карте: searates.com

Ответы [ 3 ]

2 голосов
/ 29 марта 2010

Остерегайтесь того факта, что карты могут искажать расстояния. Например, в проекциях Меркатора отрезки, удаленные от экватора, представляют меньшее фактическое расстояние, чем отрезки, расположенные вблизи экватора равной длины. Если вы просто назначите одинаковую стоимость для ваших пикселей / квадратов / и т. Д., Вы получите неоптимальную маршрутизацию и ошибочные вычисления расстояния.

Если вы проецируете сетку на карту (пиксели - это всего лишь одна конкретная сетка из множества возможных) и ищете оптимальный путь, используя A *, все, что вам нужно сделать, чтобы алгоритм поиска работал правильно, это установить вес края в соответствии с реальным расстоянием вдоль поверхности сферы (земли), а не расстоянием на карте.

Помните, что просто сказать «море или нет» недостаточно для определения судоходства. Существуют также проблемы глубины, маршрутизации трафика (например, судоходства, считая, что Ла-Манш разделен на полосы) и политические соображения (территориальные воды и т. Д.). Вы также хотите добавить маршруты вручную для каналов, которые слишком малы для отображения на карте (Панама, Суэц) и скорректировать их стоимость, чтобы покрыть любые накладные расходы.

1 голос
/ 01 апреля 2010

Я достиг удовлетворительного решения. Это похоже на то, что вы предложили, и то, что я изначально имел в виду, но мне потребовалось некоторое время, чтобы выяснить концепции программного обеспечения и ГИС, я новичок в ГИС. Если кто-то снова столкнется с чем-то похожим, вот мои настройки: PostGIS для PostgreSQL, карты из Natural Earth , программное обеспечение для редактирования ГИС qGis и OpenJUmp, алгоритмы маршрутизации pgRouting .

Карты Природной Земли нуждались в некоторой обработке, чтобы быть полезными, я присоединился к морской полисе и рекам, чтобы иметь возможность получить некоторые точные пути к большинству внутренних точек. Затем я использовал 1 градусную сетку, чтобы найти пути от одного континента к другому (мне нужно найти более элегантное решение, чем это, потому что некоторые пути выглядят как шахматные кубы). Все эти операции могут быть выполнены из командной строки с помощью PostGIS, я обнаружил, что проще использовать программное обеспечение для настольных ПК (дальше, дальше). Альтернативой картам Natural Earth может быть OpenStreetMap, но дамп planet.osm составляет около 200 Гб, и это меня обескуражило.

Я думаю, что эта установка также решает проблему точности расстояния, PostGIS учитывает фактическую форму Земли, и расстояния должны быть довольно точными.

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

1 голос
/ 25 марта 2010

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

В качестве альтернативы, вы можете итеративно «вырастить» многоугольники из всех ваших портов, создав выпуклые многоугольники (так, чтобы любая точка внутри многоугольника была достижима из любой другой, не выходя наружу, вы хотите, например, избежать формы PacMan) , хотя это уточнение / усложнение / оптимизация подхода «квадратов», о котором я впервые упомянул. Ключ в том, что вы знаете, когда попадаете в область, куда вы можете попасть куда-либо еще в этой области.

Не знаю, поможет ли это, извините. Это был долгий день. Удачи, хотя. Звучит как забавная проблема!

Редактировать: Забыл упомянуть, вы также можете предварительно обработать вашу область в квадродерево. То есть, возьмите всю свою карту и разделите ее пополам по вертикали и горизонтали (вам не нужно делать оба разделения одновременно, и если вы хотите потратить некоторое время на создание «лучших» разделений, вы можете сделать это позже) и делайте это рекурсивно до тех пор, пока каждый узел не окажется полностью сухопутным или морским. Из этого вы можете тривиально создать сеть соединений (просто подключите соседние листья), и A * должно быть достаточно простым для реализации оттуда. В любом случае, это будет самый простой способ реализовать мое первое предложение. :)

...