Suite

Comment obtenir le nombre de polygones d'une géométrie dans PostgreSQL

Comment obtenir le nombre de polygones d'une géométrie dans PostgreSQL


Comment puis-je obtenir le nombre de polygones qui forment une géométrie dans PostgreSQL ?

Par exemple, la carte des États-Unis a beaucoup d'îles en plus de ses terres principales. Je veux compter ces îles plus les terres principales.


Utilisez l'accesseur de géométrie ST_NumGeometries.

Par example

SELECTIONNER L'ID, ST_NumGeometries (forme) DE myTable

Si vos géométries contiennent des types de géométrie autres que des polygones, vous devrez les séparer et ne conserver que les polygones avant de compter. Mais d'après votre question, cela ne serait pas nécessaire.


Selon la documentation (chapitre 7.3), il existe plusieurs accesseurs de géométrie qui pourraient répondre à vos critères, selon que la géométrie est une collection, un polygone ou un multi-polygone :

  • ST_NumGeometries - Si la géométrie est une GEOMETRYCOLLECTION (ou MULTI*) retourne le nombre de géométries, sinon retourne NULL.
  • ST_NumInterior Rings - Renvoie le nombre d'anneaux intérieurs du premier polygone de la géométrie. Cela fonctionnera avec les types POLYGON et MULTIPOLYGON mais ne regarde que le premier polygone. Renvoie NULL s'il n'y a pas de polygone dans la géométrie.
  • ST_NRings - Si la géométrie est un polygone ou multi-polygone renvoie le nombre d'anneaux.

La preuve stricte ressemblerait à ceci:

Supposons que vous ayez un polygone régulier $P$ avec $2n$ côtés : $A_1A_2. A_nA_. A_<2n>$ . Selon la définition d'un polygone régulier, tous les côtés ont des longueurs égales et tous les angles entre les côtés consécutifs doivent être égaux.

Vous devez d'abord prouver que les bissectrices de tous les angles des polygones passent par le même point. Considérons par exemple les bissectrices des angles $angle A_1$ et $angle A_2$ . Ils se coupent à un certain point $O$ . Les angles $angle OA_1A_2$ et $angle OA_2A_1$ sont égaux (exactement la moitié de l'angle entre les côtés consécutifs) donc le triangle $ riangle OA_1A_2$ est isocèle et $OA_1=OA_2$ . De la même manière, vous pouvez montrer que $OA_2=OA_3$ , . $OA_<2n-1>=OA_<2n>$ , $OA_<2n>=OA_1$ .

Il existe donc un point O tel que toutes les longueurs $OA_i$ ( $i$ =1. $2n$ ) sont égales et ce point est le centre du cercle circonscrit. Vous pouvez aussi facilement prouver que les triangles $ riangle OA_iA_$ et $ riangle OA_jA_$ sont congruents pour tout $i,j$ (car $OA_i=OA_j$ , $OA_=OA_$ , $A_iA_=A_jA_$ ).

A cause de cela tous les angles $angle A_iOA_$ sont égaux. Notons cet angle avec $alpha$ . Évidemment $alpha=2pi/(2n)=pi/n$

Les triangles $ riangle OA_1A_2$ et $ riangle OA_2A_3$ sont congrus donc il doit y avoir une transformation isométrique qui transforme le premier triangle en le second. L'isométrie à un point fixe $O$ est une rotation. Donc:

$R_( riangle OA_1A_2)= riangle OA_2A_3$

$R_( riangle OA_2A_3)= riangle OA_3A_4$

$R_<0,pi>( riangle OA_1A_2)= riangle OA_UNE_$

En d'autres termes, si vous avez un point $Min P$ qui appartient au triangle $ riangle OA_1A_2$ , la rotation autour du point $O$ pour $180^circ$ transforme ce point en un point $M'$ qui appartient à triangle $ riangle OA_UNE_$ c'est-à-dire jusqu'à un certain point $M'in P$ .

La rotation autour d'un point fixe $O$ pour $pi=180^circ$ est en fait une symétrie centrale avec $O$ étant un centre de symétrie.

Ainsi, tout polygone régulier avec $2n$ côtés a un centre de symétrie qui est aussi le centre d'un cercle circonscrit.


Vous pouvez utiliser la propriété "Interior" pour obtenir les faces intérieures de vm :

Utiliser Style[interiorfaceindices, Directive[EdgeForm[], FaceForm[]]] pour obtenir :

Construisez un ensemble de données avec des nombres d'arêtes, des aires et des centroïdes de région des faces intérieures :


2 réponses 2

OK, je pense que je me souvenais mal dans mon commentaire, je pense que le périmètre est plus facile à travailler que la zone. Vous commencez donc avec un cercle de circonférence $pi$ (c'est-à-dire un rayon de $frac<1><2>$ ). Trouvez la longueur du côté du carré (ce sera $frac<1>>$ ), donc la supposition initiale est $4cdotfrac<1>> = 2sqrt <2>environ 2.828427$ :

Voici un exemple concret où l'on peut utiliser l'accord connu précédent (dans ce cas $frac<1>>$ ) pour trouver le suivant :

Cela donne $pi approx 3.0614674$ . Maintenant, voici le cas général, où vous connaissez l'accord précédent, $s_n$ , puis trouvez le suivant (sachant qu'à chaque fois, vous coupez en deux l'accord précédent donc le nombre de côtés double). Je pense que cette formule est correcte, la formule pour $s_$ donné $s_n$ est définitivement correct parce que je l'ai testé, mais pas tout à fait certain de la formule du périmètre :

En utilisant ce qui précède, nous pouvons écrire :

commencer P_1 environ & 2.8284271247461903 P_2 environ & 3.061467458920718 P_3 environ & 3.121445152258053 P_4 environ & 3.1365484905459406 P_5 approx & 3.140331156954739x P_6 environ & 3.1415138011441455 P_8 environ & 3.1415729403678827 P_9 environ & 3.141587725279961 P_ <11>environ & 3.141591421504635 P_ <12>environ & 3.141592345611077 P_x & 3.1415925765450043 P_ <14>approx & 3.1415926334632482 P_ <15>approx & 3.141592654807589 P_ <16>approx & 3.1415926453212153 P_ <17>approx & 3.1415926073757197 P <18>environ & 3.1415929109396727 P_ <19>environ & 3.141594125195191 P_ <20>environ & 3.1415965537048196 P_ <21>environ & 3.1415965537048196 end

Cela donne cinq chiffres de précision : $pi approx 3.14159$ .

Cet exemple m'a été enseigné dans mon cours de Calcul Scientifique chemin retour pour afficher l'erreur d'arrondi dans les calculs à virgule flottante. Vous remarquerez que sur les deux derniers, on obtient le même résultat. C'est parce que les calculs en virgule flottante de l'ordinateur ont essentiellement atteint leur limite. La raison en est que $s_n^2$ est devenu si petit que $1 - s_n^2$ ne génère pas de "nouveau" nombre (il continue de donner le même nombre qui générera à nouveau $s_n^2$ lorsqu'il est soustrait de $1$ Il existe une astuce pour améliorer ce calcul :

Cela donne vraiment de meilleurs résultats:

commencer P_1 approx& 2.8284271247461903 P_2 approx& 3.0614674589207183 P_3 approx& 3.1214451522580524 P_4 approx& 3.1365484905459393 P_5 approx& 3.1403311569327appro P_4 approx& 3.1365484905459393 P_5 approx& 3.140331156954753 P_14 approx& 3.1365484905459393 P_5 approx& 3.140331156954753 P_14approx& 3.1365484905459393 P_5 approx& 3.1403311569327appro approx& 3.1415729403670913 P_9 approx& 3.1415877252771596 P_ <10>approx& 3.1415914215111997 P_ <11>approx& 3.1415923455701176 P_ <12>approx& 3.14159257658413approx& 3.1415923455701176 P_ <12>approx& 3.14159257658413 3.1415926343385627 P_ <14>approx& 3.1415926487769856 P_ <15>approx& 3.141592652386591 P_ <16>approx& 3.141592653288993 P_ <17>approx& 3.141592653514593> P_x<16>approx& 3.141592653288993 P_ <17>approx& 3.141592653514593 P_ 3.141592653570993 P_ <19>approx& 3.1415926535850933 P_ <20>approx& 3.141592653588618 P_ <21>approx& 3.1415926535894996 P_ <22>approx& 3.1415926535897203 P_x <21>approx& 3.1415926535894996 P_ <22>approx&& 3.1415926535897203 3.1415926535897754 P_ <24>approx& 3.141592653589789 P_ <25>approx& 3.1415926535897927 P_ <26>a pprox& 3.1415926535897936 P_ <27>approx& 3.1415926535897936 end

En changeant simplement le calcul, pas l'algorithme !, on obtient maintenant Douze chiffres de précision ! $pi approx 3.141592653589$ --tous en raison d'une erreur d'arrondi en virgule flottante.


2 réponses 2

S'il y a des trous, alors la formule ne tient pas comme je l'ai déjà commenté.

Sans trous, la formule tient.

Dans la suite, considérons des polygones fusionnés sans trous.

La raison pour laquelle la formule est valable est que si vous ajoutez un nouvel hexagone aux polygones fusionnés, la relation suivante $( ext)-( exte)=1$ tient.

On peut prouver que la formule tient par récurrence sur le nombre de polygones.

Si nous considérons un hexagone, alors $S=A=6$ , donc $S-A+1=N$ est vérifié.

Supposons que $S_F-A_F+1=N$ tienne dans les polygones fusionnés $F$ .

Cas 1 : Si vous ajoutez un hexagone $H$ à $F$ où $H$ et $F$ ont exactement une arête commune, alors dans les nouveaux polygones $F'$ , nous avons $N_=N+1,quad S_=S_F+5,quad A_=A_F+4$ Donc, on voit que $S_-UNE_+1=N_$ tient.

Cas 2 : Si vous ajoutez un hexagone $H$ à $F$ où $H$ et $F$ ont exactement deux arêtes communes (notez que les deux arêtes doivent être adjacentes), alors dans les nouveaux polygones $F'$ , nous avons $N_=N+1,quad S_=S_F+4,quad A_=A_F+3$ Donc, on voit que $S_-UNE_+1=N_$ retient.

Cas 3 : Si vous ajoutez un hexagone $H$ à $F$ où $H$ et $F$ ont exactement trois arêtes communes (notez que les trois arêtes doivent être adjacentes), alors dans les nouveaux polygones $F'$ , nous avons $N_=N+1,quad S_=S_F+3,quad A_=A_F+2$ Donc, on voit que $S_-UNE_+1=N_$ retient.

Cas 4 : Si vous ajoutez un hexagone $H$ à $F$ où $H$ et $F$ ont exactement quatre arêtes communes (notez que les quatre arêtes doivent être adjacentes), alors dans les nouveaux polygones $F'$ , nous avons $N_=N+1,quad S_=S_F+2,quad A_=A_F+1$ Donc, on voit que $S_-UNE_+1=N_$ tient.

Cas 5 : Si vous ajoutez un hexagone $H$ à $F$ où $H$ et $F$ ont exactement cinq arêtes communes, alors dans les nouveaux polygones $F'$ , nous avons $N_=N+1,quad S_=S_F+1,quad A_=A_F$ Donc, on voit que $S_-UNE_+1=N_$ tient.


Conducteurs

Pilotes mis à jour dans le cadre de cette RFC

  • PostSIG :
    • une forme de soutien ad hoc existe déjà. Les tables avec plusieurs géométries sont actuellement signalées sous forme de couches appelées "table_name(geometry_col_name)" (autant de couches que de colonnes de géométrie). Ce comportement sera modifié afin que la table ne soit signalée qu'une seule fois en tant que couche OGR.
    • ajouter la prise en charge de l'écriture pour les tables multi-géométries.
    • mis à jour comme une simple illustration des nouvelles capacités.
    • mis à jour pour prendre en charge plusieurs champs de géométrie (ainsi que d'autres modifications non liées à cette RFC)

    Autres pilotes candidats (mise à niveau non couverte à l'origine par ce RFC)

    • Pilote GML : actuellement, une seule géométrie par entité signalée. Possibilité de changer cela en éditant manuellement le fichier .gfs
    • Pilote SQLite :
      • actuellement, même comportement que le pilote PostGIS actuel.
      • le pilote et le dialecte SQLite pourraient être mis à jour pour prendre en charge les couches multi-géométries.
      • Pilote Google Fusion Tables : actuellement, seule la première colonne géométrique trouvée est utilisée. Possibilité de spécifier "table_name(geometry_column_name)" comme nom de couche passé à GetLayerByName?().
      • VRT : quelques réflexions nécessaires pour trouver la syntaxe pour supporter plusieurs géométries.

      Syntaxe XML impactée :

      . au niveau de l'élément OGRVRTLayer :

      GeometryType ?, LayerSRS, GeomField ?, SrcRegion ?, ExtentXMin/YMin/XMax/YMax,

      . au niveau de l'élément OGRVRTWarpedLayer :

      ajouter un nouvel élément pour sélectionner le champ géométrique

      . au niveau de l'élément OGRVRTUnionLayer :

      --> implémenté après RFC dans GDAL 1.11

      • CSV : actuellement, prenez les géométries de la colonne nommée "WKT". A étendre pour prendre en charge plusieurs colonnes géométriques. Pas sûr que ça en vaille la peine. Peut être fait avec le pilote VRT étendu.
      • WFS : actuellement, seules les couches à géométrie unique sont prises en charge. La norme permet la multi-géométrie. Nécessiterait d'abord la prise en charge du pilote GML.
      • Autres pilotes basés sur le SGBDR : MySQL ?, MSSQLSpatial ? Oracle Spatial ?

      Déterminer la position d'un polygone à l'intérieur d'un cercle à partir uniquement de l'angle des côtés/bords opposés.

      J'ai un simple polygone irrégulier convexe (octogone dans l'image d'exemple) à l'intérieur d'un cercle (le cercle et le polygone ne sont pas toujours concentriques et ne se touchent ni ne se coupent) et je dois déterminer la position du polygone par rapport au cercle.

      Malheureusement, je ne connais que trois choses fondamentales.

      1. Je connais l'angle exact entre chacun des côtés opposés du polygone. Aucun côté n'est parallèle.
      2. Lorsqu'ils sont étendus au cercle, les bords/côtés du polygone forment des angles inscrits. Comme un angle représente deux côtés de polygone, il y a toujours moitié moins d'angles inscrits que de côtés de polygone. Dans l'exemple, il y a quatre angles inscrits car c'est un octogone.
      3. Les sommets de chaque angle inscrit sont régulièrement espacés autour du cercle.

      Mon inquiétude est que ce type de calcul puisse impliquer un nombre infini d'itérations et/ou plusieurs solutions.

      Si je connaissais les angles relatifs (étiquetés « Inconnu » dans le dessin) des angles inscrits, cela devrait suffire pour déterminer tout le reste, n'est-ce pas ? Même si je pouvais approximer le «centre» du polygone irrégulier d'une manière ou d'une autre.

      *Les bords en bas à droite de l'exemple se rencontrent avec un angle si obtus qu'ils semblent être une seule ligne, désolé. C'est un octogone avec chaque angle inscrit créant deux côtés du polygone.


      Ces informations, extraites de manière flagrante de l'ancienne page de manuel, vous donnent une idée claire de ce à quoi s'attendre lors du subsurf.

      EDIT : Malheureusement, le lien vers l'ancien manuel a disparu

      cela valait la peine de lire toute la page, en particulier les considérations sur les performances.

      Considérations relatives aux performances

      Des niveaux de subdivisions plus élevés signifient plus de sommets, et plus de sommets signifient que plus de mémoire sera utilisée (à la fois de la mémoire vidéo pour l'affichage et de la RAM système pour le rendu). Blender peut potentiellement planter ou se bloquer si vous n'avez pas assez de mémoire.

      Lorsque vous utilisez des niveaux élevés de subdivision avec une carte graphique qui a une faible quantité totale de Vram, certaines parties de la géométrie disparaîtront visuellement. Votre maillage sera en fait OK, car le rendu est généré à l'aide de vos données d'objet (même s'il ne peut pas être affiché par votre carte graphique).

      Le nombre de faces (polygones) est affiché dans le En-tête d'informations au sommet.

      Après avoir ajouté un Modificateur Subsurf il a 96 faces (2 subdivisions :

      Dans une scène complexe avec plusieurs objets, vous auriez besoin de passer à Mode édition ou déplacez l'objet vers un calque inutilisé M pour voir uniquement le nombre de faces d'un objet particulier.

      Avant d'appliquer le modificateur, c'est aussi une bonne idée de passer àFilaire mode d'affichage pour avoir une idée de la densité réelle du maillage.

      La subdivision divise une face en quatre faces (par niveau) comme le ferait une subdivision de maillage. Voici un exemple avec algorithme Simple car il apparaît plus clairement.

      La règle approximative dérivée des informations ci-dessus (sans étudier le papier) est

      il ne couvre pas les triangles et les n-gones. Pour une description plus détaillée, voir :

      Il fournit des formules basées sur le nombre de vétices qui semblent être plus précises.


      Enregistrement publié 2011-03-09
      Enregistrement de la dernière modification 2021-06-25
      État de la ressource en cours

      Description de l'objet

      Nom de l'objet : WHSE_FOREST_TENURE.FTEN_RECREATION_POLY_SVW

      Nom court: FTN_REC_PL
      commentaires: La représentation spatiale d'un élément de récréation. Il peut s'agir d'une réserve récréative, d'un site récréatif ou d'une forêt d'interprétation.


      Regardez TileAreas dans ComputationalGeometry :

      EDIT : Attendez, vous vouliez des périmètres aussi.

      DEUXIÈME EDIT : Nombre de côtés

      Si vous continuez à réutiliser le BoundedDiagram de nombreux points, vous devriez probablement l'enregistrer au lieu de le recalculer à chaque fois comme je le fais.

      Cela fait plus d'un an mais depuis v10 introduit quelques fonctionnalités intéressantes pour le faire avec élégance, revenons à cette question :

      Nous générons des points et obtenons leur diagramme de Voronoi en utilisant VoronoiMesh

      Maintenant pour les zones des cellules :

      Éditer: Une façon plus propre de calculer les aires est de faire :

      On peut vérifier que l'aire totale est bien de 16 (l'aire du diagramme de Voronoï borné $4^2$)

      Pour calculer les périmètres, nous utilisons RegionMeasure , convertissez les primitives Polygon en primitives Line et veillez à rejoindre les lignes.

      Enfin pour le nombre de côtés de chaque cellule, on fait simplement :

      Les objets MeshRegion créés par VoronoiMesh ont des propriétés utiles à cette fin. Voici l'exemple de maillage de @RunnyKine :

      Les propriétés MeshRegion utilisent des identifiants de face qui ont été attribués à chaque face. Malheureusement, les étiquettes de visage ne correspondent pas aux identifiants de visage internes. Donc, voici une modification du maillage de Voronoi qui utilise les identifiants de visage comme étiquettes (ici j'utilise la propriété "Faces" d'un objet MeshRegion):

      Notez à quel point les étiquettes sont différentes de celles utilisées dans la visualisation de @RunnyKine.

      Maintenant, pour obtenir le périmètre de chaque cellule, nous pouvons utiliser à la fois "FaceEdgeConnectivity" et "EdgeLengths":

      <1 ->3.99709, 2 -> 2.7707, 3 -> 3.61356, 4 -> 3.88435, 5 -> 3.40604, 6 -> 4.40972, 7 -> 4.1388, 8 -> 4.05183, 9 -> 2.60374, 10 -> 2.75359, 11 -> 3.55026, 12 -> 3.63583, 13 -> 3.18751, 14 -> 3.21415, 15 -> 4.20549, 16 -> 2.08804, 17 -> 3.3514, 18 -> 5.58528, 19 -> 5.40562, 20 -> 4.3344>

      Pour la zone, nous utilisons "FaceAreas":

      <1 ->1.00297, 2 -> 0.268352, 3 -> 0.73707, 4 -> 0.834388, 5 -> 0.665234, 6 -> 1.23476, 7 -> 0.974388, 8 -> 0.938105, 9 -> 0.402544, 10 -> 0.363854, 11 -> 0.59353, 12 -> 0.759838, 13 -> 0.55102, 14 -> 0.367406, 15 -> 0.957965, 16 -> 0.210096, 17 -> 0.602978, 18 -> 1.99269, 19 -> 1.44529, 20 -> 1.09752>

      Et enfin, pour le nombre de bords :

      <1 ->7, 2 -> 4, 3 -> 6, 4 -> 5, 5 -> 8, 6 -> 5, 7 -> 5, 8 -> 8, 9 -> 5, 10 -> 4, 11 -> 4, 12 -> 5, 13 -> 4, 14 -> 5, 15 -> 6, 16 -> 4, 17 -> 5, 18 -> 6, 19 -> 5, 20 -> 5>


      Voir la vidéo: Tuto. comment déterminer le nombres de tôles dun bâtiment