2017-06-06 4 views
1

Je dois trouver tous les points à l'intérieur et sur un polygone.Extraire toutes les coordonnées à l'intérieur d'un polygone à partir d'un polygone en forme de Python

Entrée:

from shapely.geometry import Polygon, mapping 
sh_polygon = Polygon(((0,0), (2,0), (2,2), (0,2))) 

Sortie:

(0,0) , (1,0) , (2,0) , (0,1) , (1,1) , (2,1) , (0,2) , (1,2) , (2,2). 

S'il vous plaît indiquer s'il y a une meilleure façon sans utiliser shapely.

J'ai écrit ce morceau de code qui donne des points à l'intérieur du polygone, mais il ne donne pas de points dessus. Aussi est-il une meilleure façon de faire la même chose:

from shapely.geometry import Polygon, Point 

def get_random_point_in_polygon(poly): 
    (minx, miny, maxx, maxy) = poly.bounds 
    minx = int(minx) 
    miny = int(miny) 
    maxx = int(maxx) 
    maxy = int(maxy) 
    print("poly.bounds:", poly.bounds) 
    a = [] 
    for x in range(minx, maxx+1): 
     for y in range(miny, maxy+1): 
      p = Point(x, y) 
      if poly.contains(p): 
       a.append([x, y]) 
    return a 


p = Polygon([(0,0), (2,0), (2,2), (0,2)]) 
point_in_poly = get_random_point_in_polygon(p) 

print(len(point_in_poly)) 
print(point_in_poly) 

Sortie:

poly.bounds: (0.0, 0.0, 2.0, 2.0) 
1 
[[1, 1]] 

J'ai simplifié mon problème. En fait, j'ai besoin de trouver tous les points à l'intérieur et sur un carré avec des coins: (77,97), (141,101), (136,165), (73,160).

+0

Pourriez-vous simplement augmenter votre maximum de 1 et diminuer votre min de 1? – SirParselot

+0

@SirParselot Thansk. Je l'ai changé. Mais, je reçois la même sortie exacte. – Beginner

+0

C'est parce que vous avez 'si poly.contains (p)'. Ce n'est vrai que si le polygone a le point à l'intérieur de celui-ci et non sur celui-ci. Vous ne devriez pas avoir à vérifier si c'est à l'intérieur du polygone si vos boucles sont entre les limites. Ignorez mon premier commentaire si vous supprimez 'si poly.contains (p)' – SirParselot

Répondre

0

N'existe-t-il pas une fonction qui trouvera des points de réseau situés sur une ligne? Ce sont les seuls qui vous manquent. Ils sont simplement des solutions à l'équation de définition du segment de ligne. Sinon, il est assez facile d'écrire l'algorithme vous-même, en trouvant les points par force brute.

Procédez comme suit pour chaque arête (p1, p2) du polygone.

p1 = (x1, y1) 
p2 = (x2, y2) 
xdiff = x2 - x1 
ydiff = y2 - y1 

# Find the line's equation, y = mx + b 
m = ydiff/xdiff 
b = y1 - m*x1 

for xval in range(x1+1, x2): 
    yval = m * xval + b 
    if int(yval) == yval: 
     # add (xval, yval) to your list of points 

J'ai laissé les détails à vous: assurez-vous que x1 < x2 (ou adapter autrement), gérer un segment vertical, etc. Ce n'est pas particulièrement élégant, mais il est rapide, facile à mettre en œuvre, et facile à déboguer.

+0

Alors, me suggérez-vous d'utiliser votre méthode pour trouver des points qui sont sur le polygone et utiliser mon code pour trouver des points qui sont à l'intérieur du polygone? – Beginner

+0

Oui. Alternativement, vous pouvez utiliser mon algorithme pour trouver les points de limite pour chaque valeur de colonne x du polygone, puis simplement parcourir chaque colonne. Cependant, puisque vous avez déjà un appel pratique pour trouver les points intérieurs, pourquoi s'embêter avec ça? – Prune

+0

Si vous * décidez * de trouver vous-même tous les points, notez que vous devez savoir dans quelle direction se trouve l'intérieur du polygone et contourner le yval calculé dans cette direction. Ces yval forment les limites de chaque colonne de points. – Prune