Suite

Point d'intersection du polygone et de la ligne créée par deux points ArcPy

Point d'intersection du polygone et de la ligne créée par deux points ArcPy


J'ai une couche de polygone. J'ai sélectionné le sommet le plus éloigné du centroïde (image : point A). (Comment faire cela est dans la réponse ici: sélectionnez le sommet le plus éloigné du centroïde du polygone à l'aide d'ArcPy) Ce que je dois faire ensuite, c'est que je dois trouver le point d'intersection (point B) du contour du polygone et de la ligne créés par le centroïde et le point le plus éloigné (ligne OA).


Solution de calcul de champ. Voir le premier post sur la façon d'utiliser:

def getFarPoint(shp,n): p=shp.centroid g=arcpy.PointGeometry(p) l=shp.boundary() points=l.getPart(0) m=len(points); lMax=0.0 pour i dans range(m) : pN=points.getObject(i) d=g.distanceTo(pN) si d>lMax : lMax=d;pBest=pN xC,yC=pX,pY xF=pBest. X;yF=pBest.Y pBest.X=xC+(xC-xF) pBest.Y=yC+(yC-yF) L=arcpy.Polyline(arcpy.Array([pBest,p])) arcpy.Intersect_analysis([l ,L],"in_memory/pnts", "","", "point") g = arcpy.Geometry() geometryList = arcpy.CopyFeatures_management("in_memory/pnts",g) pBest=geometryList[0].getPart( 0) pick=[pBest.X,pBest.Y] return pick[n]

Ce que vous cherchez est le code pour intersection segment-segment. C'est-à-dire que vous avez un segment (ou rayon) de O, et vous devez l'intersecter avec chaque bord de votre polygone, puis sélectionnez le plus proche. (Il est généralement préférable d'être inconscient à ce sujet, et simplement itératif sur tous les bords de polygone, plutôt que d'essayer d'éliminer les bords qui n'ont aucune chance de se croiser.) Vous pouvez trouver du code d'intersection segment-segment partout sur le Web,



y compris le mien SegSegInt code décrit dans Computational Geometry en C.


Déterminer si un segment de ligne coupe un polygone

Si j'ai un vecteur (une ligne composée de 2 points) sur un plan 2D, comment puis-je déterminer s'il a traversé un polygone ?

Je sais que je peux prendre chaque ligne qui compose le polygone et voir si certaines se croisent, mais existe-t-il un meilleur moyen?

J'ai lu cet article Comment puis-je déterminer si un point 2D se trouve dans un polygone ? ce qui me donne quelques idées pour voir si le point est dans un polygone mais j'ai besoin de voir s'il l'a dépassé/intersecté.


Intersection de polygone avec ligne | Python galbé

J'ai essayé d'utiliser shapely pour trouver l'intersection d'une ligne et d'un polygone, mais j'ai des problèmes avec certains nombres à virgule flottante.

Ce à quoi je m'attendrais, c'est une liste de deux sommets.

Point 1 : point qui serait à l'intérieur du polygone, ou (4.0, -2.0000000000000004) dans ce cas.

Point 2 : point qui est l'intersection de [(4.0, -2.0000000000000004), (2.0, -1.1102230246251565e-15)] et [(3.0, -3.0), (4.0, -2.0)].

Cependant, le résultat que je reçois est:

J'ai également vérifié s'il y a une intersection avec le bord que je regarde :

Si je remplace (4.0, -2.0000000000000004) par (4.0, -2.000000000000000), l'intersection des bords sera évaluée à True.

Est-ce que quelqu'un a une idée de ce qui se passe ou de ce qui me manque ? Merci!

J'ai testé en utilisant la version 1.12 de shapely et les géos de 3.3.1, 3.3.5, 3.3.6, 3.3.7.

Au cas où quelqu'un serait curieux de savoir comment j'ai mis à jour la version geos sur Windows :


Methodenübersicht

Construit la limite de la géométrie.

Construit un polygone à une distance spécifiée de la géométrie.

Construit l'intersection de la géométrie et de l'étendue spécifiée.

Gibt an, ob die Basisgeometrie die Vergleichsgeometrie enthält.

contient ist das Gegenteil von à l'intérieur.

Seules les relations vraies sont affichées dans cette illustration.

Construit la géométrie qui est le polygone de délimitation minimal de telle sorte que tous les angles extérieurs soient convexes.

Gibt an, ob die beiden Geometrien sich in einer Geometrie mit einem geringeren Shape-Typ überschneiden.

Zwei Polylinien kreuzen sich, wenn sie nur Punkte gemeinsam haben, von denen mindestens einer kein Endpunkt ist. Eine Polylinie und ein Polygon kreuzen sich, wenn sie im Inneren of Polygons eine Polylinie oder einen Punkt (für eine vertikale Linie) gemeinsam haben, die bzw. der nicht der gesamten Polylinie entspricht.

Seules les relations vraies sont affichées dans cette illustration.

Divise cette géométrie en une partie à gauche de la polyligne de coupe et une partie à droite de celle-ci.

Lorsqu'une polyligne ou un polygone est coupé, il est divisé à l'endroit où il coupe la polyligne de coupe. Chaque pièce est classée à gauche ou à droite de la fraise. Cette classification est basée sur l'orientation de la ligne de coupe. Les parties de la polyligne cible qui n'intersectent pas la polyligne de coupe sont renvoyées comme faisant partie du droit de résultat pour cette polyligne en entrée. Si une géométrie n'est pas coupée, la géométrie de gauche sera vide ( Aucun ).

Construit la géométrie composée uniquement de la région unique de la géométrie de base mais ne faisant pas partie de l'autre géométrie. L'illustration suivante montre les résultats lorsque le polygone rouge est la géométrie source.

Gibt an, ob die Basis- und die Vergleichsgeometrie keine gemeinsamen Punkte aufweisen.

Zwei Geometrien überschneiden sich, wenn disjoint den Wert False zurückgibt.

Seules les relations vraies sont affichées dans cette illustration.

Renvoie la distance minimale entre deux géométries. Si les géométries se coupent, la distance minimale est 0.

Les deux géométries doivent avoir la même projection.

Indique si les géométries de base et de comparaison sont du même type de forme et définissent le même ensemble de points dans le plan. Il s'agit d'une comparaison 2D, seules les valeurs M et Z sont ignorées.

Seules les relations vraies sont affichées dans cette illustration.

Renvoie la zone de l'entité à l'aide d'un type de mesure.

Renvoie la longueur de l'entité à l'aide d'un type de mesure.

Renvoie un tableau d'objets ponctuels pour une partie particulière de la géométrie ou un tableau contenant un certain nombre de tableaux, un pour chaque partie.

Construit une géométrie qui est l'intersection géométrique des deux géométries en entrée. Différentes valeurs de dimension peuvent être utilisées pour créer différents types de formes.

L'intersection de deux géométries du même type de forme est une géométrie contenant uniquement les régions de chevauchement entre les géométries d'origine.

Pour des résultats plus rapides, testez si les deux géométries sont disjointes avant d'appeler intersect .

Renvoie une mesure du point de départ de cette ligne au in_point .

Gibt an, üb die Überschneidung der beiden Geometrien denselben Shape-Typ wie eine der Eingabegeometrien aufweist, aber keiner der Eingabegeometrien entspricht.

Seules les relations vraies sont affichées dans cette illustration.

Renvoie un point sur une ligne à une distance spécifiée du début de la ligne.

Projette une géométrie et applique éventuellement une géotransformation.

Pour projeter, la géométrie doit avoir une référence spatiale et non un UnknownCoordinateSystem . Le nouveau système de référence spatiale passé à la méthode définit le système de coordonnées de sortie. Si l'une des références spatiales est inconnue, les coordonnées ne seront pas modifiées. Les valeurs Z et de mesure ne sont pas modifiées par la méthode ProjectAs.

Recherche le point sur la polyligne le plus proche du point in_point et la distance entre ces points. Renvoie également des informations sur le côté de la ligne sur lequel se trouve in_point ainsi que la distance le long de la ligne où se trouve le point le plus proche.

Renvoie un nouveau point basé sur in_point accroché à cette géométrie.

Construit la géométrie qui est l'union de deux géométries moins l'intersection de ces géométries.

Les deux géométries d'entrée doivent être du même type de forme.

Gibt an, ob sich die Grenzen der Geometrien überschneiden.

Zwei Geometrien berühren sich, wenn die Schnittmenge der Geometrien nicht leer, die Schnittmengen der Innenbereiche jedoch leer ist. Ein Punkt berührt beispielsweise eine Polylinie nur, wenn der Punkt lagegleich mit einem der Endpunkte der Polylinie ist.

Seules les relations vraies sont affichées dans cette illustration.

Construit la géométrie qui est l'union théorique des ensembles des géométries d'entrée.

Les deux géométries réunies doivent être du même type de forme.

Gibt an, ob sich die Basisgeometrie innerhalb der Vergleichsgeometrie befindet.

Der au sein -L'opérateur stellt das Gegenteil von contient dar.

Seules les relations vraies sont affichées dans cette illustration.


Méthodes

La limite d'un polygone est une polyligne. La limite d'une polyligne est un multipoint, correspondant aux extrémités de la ligne. La limite d'un point ou d'un multipoint est un point ou un multipoint vide.

La distance de tampon est dans les mêmes unités que la géométrie qui est tamponnée.

Une distance négative ne peut être spécifiée que par rapport à une géométrie polygonale.

La géométrie du polygone tamponné.

Objet d'étendue utilisé pour définir l'étendue du découpage.

Une géométrie en sortie découpée à l'étendue spécifiée.

Une valeur booléenne renvoyée True indique que cette géométrie contient la deuxième géométrie.

La géométrie résultante. L'enveloppe convexe d'un seul point est le point lui-même.

Une valeur booléenne renvoyée vraie indique que les deux géométries s'intersectent dans une géométrie de type de forme inférieure.


Syntaxe

Les entités en entrée qui peuvent être des lignes ou des polygones.

La classe d'entités points en sortie.

Spécifie où un point de sortie sera créé.

  • ALL —Un point sera créé à chaque sommet d'entité en entrée. C'est la valeur par défaut.
  • MID —Un point sera créé au milieu, pas nécessairement un sommet, de chaque ligne d'entrée ou limite de polygone.
  • START —Un point sera créé au point de départ (premier sommet) de chaque entité en entrée.
  • END —Un point sera créé à l'extrémité (dernier sommet) de chaque entité en entrée.
  • BOTH_ENDS —Deux points seront créés, un au point de départ et un autre à l'extrémité de chaque entité en entrée.
  • DANGLE —Un point d'inflexion sera créé pour tout point de début ou de fin d'une ligne d'entrée, si ce point n'est pas connecté à une autre ligne à n'importe quel emplacement le long de cette ligne. Cette option ne s'applique pas à l'entrée de polygone.

Syntaxe

Entités ponctuelles en entrée à partir desquelles les polygones de Thiessen seront générés.

Classe d'entités en sortie contenant les polygones de Thiessen générés à partir des entités ponctuelles en entrée.

Détermine les champs des entités en entrée qui seront transférés vers la classe d'entités en sortie.

  • ONLY_FID —Seul le champ FID des entités en entrée sera transféré vers la classe d'entités en sortie. C'est la valeur par défaut.
  • ALL —Tous les champs des entités en entrée seront transférés vers la classe d'entités en sortie.

Syntaxe

Emplacement ou espace de travail dans lequel la classe d'entités points aléatoires sera créée. Cet emplacement ou espace de travail doit déjà exister.

Nom de la classe d'entités points aléatoires à créer.

Des points aléatoires seront générés à l'intérieur ou le long des entités de cette classe d'entités. La classe d'entités contraignantes peut être point, multipoint, ligne ou polygone. Les points seront placés de manière aléatoire à l'intérieur des entités surfaciques, le long des entités linéaires ou aux emplacements des entités ponctuelles. Chaque entité de cette classe d'entités contiendra le nombre spécifié de points générés à l'intérieur (par exemple, si vous spécifiez 100 points et que la classe d'entités contraignante comporte 5 entités, 100 points aléatoires seront générés dans chaque entité, pour un total de 500 points).

Des points aléatoires seront générés à l'intérieur de l'étendue. L'étendue de contrainte ne sera utilisée que si aucune classe d'entités de contrainte n'est spécifiée.

Le nombre de points à générer aléatoirement.

Le nombre de points peut être spécifié sous la forme d'un nombre entier long ou d'un champ à partir des entités de contrainte contenant des valeurs numériques pour le nombre de points aléatoires à placer dans chaque entité. L'option de champ n'est valide que pour les entités de contrainte surfacique ou linéaire. Si le nombre de points est fourni sous la forme d'un nombre entier long, chaque entité de la classe d'entités contraignante aura ce nombre de points aléatoires générés à l'intérieur ou le long de celle-ci.

La distance la plus courte autorisée entre deux points placés au hasard. Si une valeur de 1 mètre est spécifiée, tous les points aléatoires seront à plus de 1 mètre du point le plus proche.

Détermine si la classe d'entités en sortie sera une entité en plusieurs parties ou en une seule partie.

  • POINT — La sortie sera un point de type géométrique (chaque point est une entité distincte). C'est la valeur par défaut.
  • MULTIPOINT — La sortie sera de type géométrie multipoint (tous les points sont une seule entité).

Si create_multipoint_output est défini sur MULTIPOINT , spécifiez le nombre de points aléatoires à placer dans chaque géométrie multipoint. La valeur par défaut est 10.


Je suis confus quant à la façon dont vous voulez la dualité ici.

Soit $V$ l'espace vectoriel sous-jacent, soit $k$ ($=mathbb$ ou $mathbb$) soit le champ sur lequel l'espace vectoriel est pris (donc $V=k^3$). Soit $(x_1:x_2:x_3)$ des coordonnées homogènes dans le plan projectif $mathbb

^2$ (défini par la base standard de $V$).

Soit $p_1=(alpha_1:alpha_2:alpha_2)$ et $p_2=(eta_1:eta_2:eta_3)$ deux points dans $mathbb

^2$, et soit $l_1$ et $l_2$ les lignes correspondantes dans l'espace vectoriel sous-jacent $V$. Puis $overline$ est une ligne dans $mathbb

^2$, qui est un plan dans $V$ la normale à ce plan est donnée par $l_1 imes l_2=:l_3$, et l'équation de la droite dans $mathbb

^2$ est donné par $(l_3)_1x_1+(l_3)_1x_2+(l_3)_3x_3=0$, où $(l_3)_i$ est la $i$-ième composante de $l_3$, $1le ile 3 $.

Soit $l_1$ et $l_2$ deux lignes dans $mathbb

^2$ il y a des nombres $gamma_1,gamma_2,gamma_3,delta_1,delta_2,delta_3in k$ tels que egin l_1&=<(x_1:x_2:x_3)inmathbb

^2:gamma_1x_1+gamma_2x_2+gamma_3x_3=0>, l_2&=<(x_1:x_2:x_3)inmathbb

^2 :delta_1x_1+delta_2x_2+delta_3x_3=0>, end donc $gamma:=(gamma_1,gamma_2,gamma_3)$ et $delta:=(delta_1,delta_2,delta_3)$ sont les normales correspondantes aux plans $L_1$ et $L_2$ auxquels $l_1$ et $l_2$ correspondent en $V$. Le produit vectoriel de $l_1$ et $l_2$ est simplement le produit vectoriel de $gamma$ et $delta$, qui est un vecteur normal à la fois à $gamma$ et à $delta$ ce vecteur se trouve nécessairement dans les deux plans et est donc égal à l'intersection $L_1cap L_2$, qui est projectivement l'intersection $l_1cap l_2$, et est un point dans $mathbb

^2$.


Prenez votre rectangle $ABCD$, mettez, par exemple, $ left| droit| = bquad gauche| droit| = d $ et considérons les vecteurs unitaires $ <f u>= <limits^ o > over ight|>> = <1 over b>mathop limits^ o quad quad <f v>= <limits^ o > over ight|>> = <1 over d>mathop limites^ à $

Alors un point générique $P$ sera à l'intérieur du rectangle si la projection de $vec $ sur $f u$ et $f v$ est $ left< matrix< 0 le mathop limits^ o cdot <f u>le b hfill cr 0 le mathop limits^ o cdot <f v>le d hfill cr> ight. $

Le point $P$ sera sur et à l'intérieur du segment si $ mathop limits^ o = lambda mathop limits^ o + left( <1 - lambda > ight)mathop limits^ o quad left| < le lambda le 1> ight. $ ou ce qui est le même, si $ mathop limits^ o = mathop limits^ o + lambda mathop limits^ o quad left| < le lambda le 1> ight. $

Donc le rectangle et le segment auront des points en commun ssi $ egin gauche< egin 0 le mathop limits^ o cdot <f u>le b 0 le mathop limits^ o cdot <f v>le d mathop limits^ o = mathop limits^ o + lambda mathop limits^ o 0 le lambda le 1 end ight.quad Rightarrow quad left< egin 0 le lambda mathop limits^ o cdot <f u>+ mathop limits^ o cdot <f u>le b 0 le lambda mathop limits^ o cdot <f v>+ mathop limits^ o cdot <f v>le d 0 le lambda le 1 end droite. Rightarrow quad left< egin frac<limits^ o cdot <f u>>><limits^ o cdot <f u>>> le lambda le frac<limits^ o cdot <f u>>><limits^ o cdot <f u>>> frac<limits^ o cdot <f v>>><limits^ o cdot <f v>>> le lambda le frac<limits^ o cdot <f v>>><limits^ o cdot <f v>>> 0 le lambda le 1 end droite. finir $


Voir la vidéo: Tutorial N9: Fusionner polygones ArcGis. How to Merge different Shapefiles