Как обобщить береговые линии?


12

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

Представьте себе набор точек, представляющих зубчатую береговую линию. При разрешении 1 м мы видим все детали и нуждаемся в 50 точках данных для правильного представления побережья, однако при разрешении в 10 км берег выглядит как прямая линия, и нам нужны только 2 точки.

Я пишу картографическое приложение, которое потребует масштабирования данных от разрешений "полной планеты" до разрешений "улиц". Мне нужна помощь в уменьшении разрешения моих точек данных и, следовательно, объема данных для более широкого разрешения.

Я читал о Vector-Tiling и думаю, что это будет лучшим решением (я уже делаю что-то подобное), однако при низких разрешениях мой набор данных по-прежнему огромен, что означает, что его повторная обработка занимает [относительно] длительное время время, когда высокие разрешения бывают быстрыми, потому что «эффективный» набор данных мал (подмножество целого).

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

Я счастлив использовать инструмент, но я бы предпочел сделать это сам, чтобы узнать, как это делается.


1
Вы проверили ответы на gis.stackexchange.com/questions/6585/… ? Пожалуйста, уточните, если вы думаете, что ваш вопрос отличается.
Подземье

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

Если вы просто хотите выполнить сносную работу и двигаться дальше, ответ @R Thiede, вероятно, является лучшим местом для начала. Если вы хотите поработать над реальной задачей, упрощая линейную работу, не теряя смысла фигур, см. Связанные вопросы gis.stackexchange.com/questions/38/… и gis.stackexchange.com/questions/440/… .
Мэтт Уилки

Ответы:


7

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

Один подход использует буферизацию, как показано здесь . У меня тоже была похожая проблема, и я подробно изложил свое решение здесь .

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


+1 за вдумчивый ответ. Добро пожаловать на наш сайт, Рюдигер!
whuber

5

Вы должны подготовить различные обобщенные версии вашего набора данных для уровней масштабирования "полная планета" до масштабирования крупным планом.

Классическим алгоритмом обобщения является алгоритм Дугласа-Пекера . Сначала вам нужно будет соединить точки с береговыми линиями, если вы этого еще не сделали.


2
Библиотека GEOS имеет встроенные алгоритмы Дугласа-Пекера, которые вы можете использовать, если хотите кодировать это самостоятельно. Возможно, вы захотите рассмотреть топологию, и в этом случае инструмент GRASS v.generalize также может помочь.
Лагерратроб

Привет @lagerratrobe. Я сделал этот ответ в вики сообщества, так что вы сможете редактировать его напрямую и добавлять к нему решения GEOS и GRASS.
Подземье

1

Вы исследовали Tilemill для производства ваших наборов плиток? Это автоматически уменьшит количество узлов при разных уровнях масштабирования. https://github.com/mapbox/tilemill


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.