2009-10-13 7 views
3

J'ai un problème avec l'API Google Maps qui autorise seulement 1000 fonctionnalités par carte.Combiner les polygones KML en PHP

Dans une base de données, je conserve les enregistrements de areas. Chaque zone est associée à un tas d'informations polygonales KML, stockées sous la forme d'une chaîne XML. Chaque zone est composée d'un ou de plusieurs polygones.

En raison de certaines entrées utilisateur, une poignée de ces zones sont combinées en une <Placemark>. Je reçois leur géométrie combinée en enveloppant les informations de polygone concaténé dans une balise <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> 

Le problème est que beaucoup de ces domaines sont très complexes et, par conséquent, toute donnée Placemark pourrait avoir plus de 100 polygones qui me pousse très rapidement de la limite de 1000 par document. Maintenant, étant donné que les zones combinées principalement forment une seule zone continue, il y a beaucoup de lignes et de polygones à l'intérieur de la zone continue qui sont tout à fait inutiles. Est-il possible de faire une boucle dans les polygones et de les fusionner en un (ou au moins, moins) polygones?

+0

Eh bien, oui, cela s'appelle un petit problème de programmation. Donc, pour nous aider, nous devons en savoir plus sur les informations de zone qui doivent être combinées, et quand ils doivent rester séparés. Et quand avez-vous réellement besoin de tous les détails? – Don

+0

Je peux facilement obtenir une liste de polygones qui doivent être fusionnés en un (ou plus selon que les zones sont continues), et je n'ai plus jamais besoin de tous les détails après la fusion. – nickf

Répondre

1

La méthode de stockage en fait un problème très difficile à résoudre. Fusionner par programmation des polygones contigus va être lent et compliqué. Plutôt que de stocker des fragments XML, placez-les dans une base de données compatible avec GIS comme PostgreSQL avec PostGIS. Cela vous permet de stocker les informations de forme en tant qu'objets binaires connus (WKB) plutôt que des fragments XML et vous offre une suite complète d'outils de traitement et de mise en forme SIG.

Une fois que vous avez ce format, ce problème devient très facile à résoudre. Par exemple. en supposant que la colonne de géométrie est appelée « the_geom », vous pouvez utiliser une requête comme suit:

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

Il utilise simplement la fonction d'agrégat ST_Union pour combiner les géométries adaptées en un seul objet et envoie la colonne de résultat en tant que Fragment KML.

Si vous devez simplifier les formes car le code KML est trop compliqué pour Google Maps, vous pouvez ajouter un ST_Simplify ou un ST_SimplifyPreserveTopology. Vous pouvez également utiliser ST_NPoints pour compter le nombre de points dans la géométrie résultante afin que vous puissiez détecter quand vous devez simplifier le résultat.

Questions connexes