Suite

Problème de bagues intérieures/trous de polygone

Problème de bagues intérieures/trous de polygone


Je travaille sur un script pour lisser les polygones. Essentiellement, il sépare les anneaux/polygones intérieurs et extérieurs et envoie les coordonnées à une définition/fonction de lissage. Les coordonnées "lissées" sont ensuite ajoutées et écrites dans un fichier de formes à l'aide de pyshp.

Le problème auquel je suis confronté est le suivant : pour certains polygones, après le lissage, tous les anneaux/trous intérieurs ne sont pas dessinés/insérés. Cependant, pour des polygones complexes similaires, les trous sont dessinés/insérés. La raison de cela, je ne suis pas tout à fait sûr.

Ce que j'ai essayé jusqu'à présent d'identifier le problème était d'imprimer les coordonnées entrant dans la fonction/déf de lissage et il semble que les bagues intérieures manquantes ne soient, pour une raison quelconque, pas envoyées à la def/fonction de lissage.

Vous trouverez ci-dessous le script et des exemples d'images. Veuillez noter que je suis assez nouveau sur python et les scripts en général.

Des suggestions pour résoudre ce problème ???

ÉDITER: Je peux confirmer que les anneaux intérieurs manquants dans le fichier de formes lissé sont dus au fait qu'il n'est pas envoyé à la fonction de lissage.

import os import sys import ogr import fileinput import shapefile import Tkinter import tkSimpleDialog import gdalnumeric import tkFileDialog import numpy as np depuis scipy.ndimage import gaussian_filter import shapely import time import Shutil root = Tkinter.Tk() #Formule de lissage pour les anneaux extérieurs def smoothingouter( pts) : pour i en pts : array = np.array(pts) x, y = array.T t = np.linspace(0, 1, len(x)) t2 = np.linspace(0, 1, 100) x2 = np.interp(t2, t, x) y2 = np.interp(t2, t, y) sigma = 1,25 x3 = gaussian_filter(x2, sigma) y3 = gaussian_filter(y2, sigma) x4 = np.interp(t , t2, x3) y4 = np.interp(t, t2, y3) zippé = zip(x4,y4) return zippé #Formule de lissage pour les anneaux intérieurs def smoothinginner(pts): for i in pts: array = np.array( pts) x, y = tableau.T t = np.linspace(0, 1, len(x)) t2 = np.linspace(0, 1, 100) x2 = np.interp(t2, t, x) y2 = np.interp(t2, t, y) sigma = 0,2 x3 = filtre_gaussien(x2, sigma) y3 = filtre_gaussien(y2, sigma) x4 = np.interp(t, t2, x3) y4 = np.interp(t, t2 , y3) zippé = zip(x4,y4) return zipped #Select input shapefile inshp = tkFileDialog.askopenfilename(title='Select shapefile to smooth:') mdir, mfilename = os.path.split(inshp) mnam, mext = os.path.splitext (mfilename) sf = shapefile.Reader(inshp) shapeout = mdir + '/' + mnam + '_smoothed.shp' w = shapefile.Writer(shapefile.POLYGON) w.autoBalance = 1 w.field("ID") id =8 shape = sf.shapes() # a: fonction index tracker a = 0 #Steps et cnt pour les pas de la barre de progression = len(shape)/10 cnt = 0 #for chaque feature in layer for i in shape : b = shape[a].points # ajoute des points caractéristiques au tableau numpy d = np.array(b) extérieur = vrai #q est l'indice du premier point pour chaque anneau (inclut les anneaux intérieur et extérieur) q = 0 #v est le traqueur d'index de chaque point d'une entité, qu'il fasse partie de l'anneau interne ou externe v = 0 #créer une liste pour ajouter des points lissés à wparts = [] #boucle à travers chaque point d'un polygone pour c dans b : #get le premier point (c'est le premier point du polygone extérieur puisque tous les points s de la bague extérieure sont les premiers dans l'index, toutes les bagues intérieures par la suite) first = b[q] #compare chaque point au premier point. Chaque anneau aura des coordonnées identiques pour ses premier et dernier points. À partir de là, nous pouvons séparer chaque coord des anneaux si c == first: # q doit être plus petit que v. Par exemple, pour le premier coord, q = 0 et v = 0 donc d[q] et d[v] sont le même point et aucune plage ne sera trouvée si (q < v): #Tous les points de l'anneau extérieur d'un polygone sont traités à l'aide de la fonction smoothingouter if external == True: ss = smoothingouter(d[q:v]) #Points from each interior l'anneau d'un polygone est traité à l'aide de la fonction smoothinginner else : ss = smoothinginner(d[q:v]) #Ajouter les coordonnées résultantes à la liste wparts.append(ss) if (exterior == True): w.record(id ) #Mettre à jour l'index de départ du prochain polygone extérieur q = v+1 extérieur = False v+=1 w.poly(wparts) a+=1 #Créer un nouveau fichier de formes poly lissé w.save(shapeout) prjcopy = shapeout[:-3 ] + 'prj' shutdown.copy(inshp[:-3] + 'prj', prjcopy) print 'done' root.destroy()

Polygone non lissé avec anneaux intérieurs :

Polygone lissé avec anneaux intérieurs manquants :


Après quelques tests supplémentaires sur différents ensembles de données, je suis arrivé à la conclusion que les données du fichier de formes semblent être le problème et pas tellement le script (ouvert au débat). Pour les jeux de données sans îlots ni anneaux/trous internes complexes, le script de lissage fonctionne très bien. Cependant, lorsque des anneaux/trous internes sont présents, toutes sortes de choses intéressantes se produisent dans le fichier de formes en sortie, telles que des entités manquantes, des polygones où il devrait y avoir des trous, etc. Les résultats diffèrent également considérablement entre les différents jeux de données avec des polygones complexes).


Voir la vidéo: 1 2 Monikulmioita nelikulmio