Объединить KML-полигоны в PHP - PullRequest
       27

Объединить KML-полигоны в PHP

3 голосов
/ 13 октября 2009

У меня проблема с Google Maps API, разрешающим только 1000 функций на карту.

В базе данных я храню записи areas. С каждой областью связана куча информации о многоугольниках KML, которая хранится в виде строки XML. Каждая область состоит из одного или нескольких полигонов.

Учитывая некоторый пользовательский ввод, несколько этих областей объединяются в одну <Placemark>. Я получаю их объединенную геометрию, оборачивая объединенную информацию о многоугольнике в тег <MultiGeometry>.

<Placemark>
    <name>My combined area</name>
    <MultiGeometry>
        <Polygon> (area 1 info) </Polygon>
        <Polygon> (area 2 info) </Polygon>
        <Polygon> (area 2 info) </Polygon>
        <Polygon> (area 3 info) </Polygon>
    </MultiGeometry>
</Placemark>

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

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

1 Ответ

1 голос
/ 07 ноября 2010

Метод хранения делает эту проблему очень сложной для решения. Программное объединение смежных полигонов будет медленным и сложным.

Вместо хранения фрагментов XML поместите их в базу данных с поддержкой ГИС, например PostgreSQL, с PostGIS . Это позволяет хранить информацию о форме в виде хорошо известных двоичных (WKB) объектов, а не фрагментов XML, и предоставляет вам полный набор инструментов для обработки и форматирования ГИС.

Как только вы получите формат, эту проблему очень легко решить. Например. предполагая, что столбец геометрии называется «the_geom», тогда вы можете использовать запрос, подобный следующему:

SELECT ST_ASKML(ST_Union(the_geom)) AS area_union_askml
FROM areas 
WHERE (some_filter_expression)
GROUP BY (optional_group_by_expression)

Это просто использует агрегатную функцию ST_UNION для объединения совпавших геометрий в одном объекте и выводит столбец результата в виде фрагмента KML.

Если вам нужно упростить фигуры, поскольку KML слишком сложен для Карт Google, вы можете добавить ST_Simplify или ST_SimplifyPreserveTopology. Вы также можете использовать ST_NPoints для подсчета количества точек в результирующей геометрии, чтобы вы могли определить, когда вам нужно упростить результат.

...