Sélection par boîte englobante avec PostGIS


12

J'ai un grand ensemble de données dans une base de données PostGIS. Je le visualise via une interface Web qui charge les données au format GeoJSON. Il y a trop de données à donner au client à la fois (10 Mo de valeur ...) donc je voudrais obtenir une zone de données dans le cadre de délimitation formé par les bords de la fenêtre (la ligne pointillée dans l'image ci-dessous ). Il est facile d'obtenir les coordonnées des points f et g.

Question 1: Est-ce une bonne façon de faire les choses? Dois-je penser à les mettre en cache sous forme de tuiles ou cette méthode est-elle susceptible d'être suffisamment efficace?

Question 2: Comment récupérer uniquement les données dans ce cadre de sélection?

Question 3: Si une forme chevauche le bord de la boîte englobante (par exemple, la forme A ci-dessous), existe-t-il un moyen simple de la recadrer telle qu'elle est interrogée comme dans la deuxième image?

entrez la description de l'image ici


Quelle visionneuse utilisez-vous sur le client?
underdark

Mapstraction. J'utilise actuellement OpenLayers comme fournisseur.
Mr_Chimp

Réponses:


8

changez simplement l'ordre des questions et vous avez une procédure:

2) Sélectionnez uniquement ce qui coupe la bbox ( ST_Intersects).
3) l'intersection avec la bbox pour couper les polygones ( ST_Intersection).
1) Créez un nouveau tableau avec les résultats ( CREATE TABLE newtable AS SELECT...).

Les documents ST_Intersection contiennent un exemple de code. Vous devrez l'adapter et utiliser ST_PolygonFromText comme bbox .


4

Je pense que la plupart (tous) les clients Web (et les SIG de bureau aussi) le font. Vous ne pouvez pas envoyer l'ensemble de données complet.

Si vous devez configurer une sorte de mise en cache, cela dépend si vos données varient en statique ou si elles changent.

Faire cocher cette case pour obtenir les données sera très rapide (si vous avez un index spatial), mais bien sûr ce n'est pas gratuit. Vous paierez avec un peu de puissance CPU.

Comme indiqué précédemment: pour trouver les polygones à l'intérieur de votre étendue, vous utilisez ST_Intersects.

Pour obtenir uniquement la partie à l'intérieur de votre étendue, utilisez ST_Intersection, mais ne le faites pas. ST_Intersection est un processus coûteux. À moins que vous ayez des polygones extrêmement gros, je pense qu'il vaut mieux envoyer tous les polygones.

Mais je suppose que vous voulez le faire à la volée au lieu de le mettre dans une table

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.