Как упростить (уменьшить количество точек) в KML?
У меня аналогичная проблема с этот пост. Мне нужно отобразить до 1000 полигонов на встроенной карте Google. Полигоны находятся в базе данных SQL, и я могу отображать каждый из них как один файл KML на лету, используя пользовательский HttpHandler (в ASP.NET), вот такhttp://alpha.foresttransparency.org/concession.1.kml .
даже на моей (очень быстрой) машине разработки требуется некоторое время, чтобы загрузить даже пару десятков форм. Итак, два вопроса, действительно:
Что было бы хорошей стратегией для рендеринга их в качестве маркеров вместо наложений, как только я выйду за определенный уровень масштабирования?
есть ли общедоступный алгоритм для упрощения полигона (уменьшения количества точек), чтобы я не показывал больше точек, чем имеет смысл на определенном уровне масштабирования?
5 ответов
для вашего второго вопроса: вам нужно Алгоритм Обобщения Дугласа-Пекера
для вашего первого вопроса, не могли бы вы рассчитать площадь конкретного многоугольника и связать каждый уровень масштабирования с определенной минимальной площадью, так как вы увеличиваете или уменьшаете масштаб многоугольника, и маркеры появляются в зависимости от уровня масштабирования.
для второго вопроса я бы использовал предложение Марка Бесси.
Я не знаю много AOBUT KML, но я думаю, что обычное решение вопроса № 2 включает итерацию по точкам и удаление любых сегментов линии под определенным размером. Это вызовет некоторые "неудачные" эффекты в некоторых случаях, но это относительно быстро и легко сделать.
Я бы рекомендовал 2 вещи: - Рассчитать и объединить полигоны, которые касаются. Это требует много обработки и жесткой математики, но я сделал это, чтобы знать, что это возможно. - Создайте свой собственный оверлей вместо использования KML в формате PNG, в то время как вы объединяете их в предыдущем предложении. Вам придется создать много PNG, но он быстро пылает на клиенте.
удачи :)
мне нужно было решение вашего вопроса #2 немного назад, и после просмотра нескольких доступных алгоритмов упрощения строк я создал свой собственный.
процесс прост и, кажется, работает хорошо, хотя он может быть немного медленным, если вы не реализуете его правильно:
P[0..n]
- это массив точек
Пусть T[n]
определяется как треугольник, образованный точками P[n-1], P[n], P[n+1]
Max
is количество точек, на которое вы пытаетесь уменьшить эту линию.
- вычислить площадь каждого возможного треугольника
T[1..n-1]
в наборе. - выберите треугольник
T[i]
с наименьшей площадью - удалить точки
P[i]
существенно сгладить треугольник - пересчитать площадь затронутых треугольников
T[n-1], T[n+1]
- перейти к Шагу #2, если количество точек >
Max