Explicaré los pasos que he seguido para realizar el suavizado de polígonos. El primer paso para esta serie de scripts es convertir los polígonos en puntos, estos puntos serán sus vértices y sus puntos medios.
Cogeremos los polígonos seleccionados, o todos los de la capa (se podrá elegir cambiando una linea de código).
Además, para cálculos posteriores, los puntos vendrán con un campo ID que corresponde al polígono al que pertenecen. En el próximo script veréis la función de este campo que consiste en poder unir de nuevo los polígonos al poder agruparlos por ID.
Por ejemplo, este scripts podríamos mejorarlo dando la opción de elegir cuantos puntos extras queremos añadir al poligono.
Suavizado_01_PuntosMedio:
from gvsig import * from geom import * def main(): """Calcula puntos en vertices y puntos medio de un pol""" #PASO1 de suavizado #INPUT: seleccion de poligonos/poligonos de capa #OUTPUT: capa shape de puntos con ID:poligono(int) layer = currentLayer() try: #Cambiando las siguiente linea, pasariamos de seleccionar #Todos los poligonos de una capa o.. #selection = layer.features() #.. los poligonos seleccionados selection = layer.getSelection() except: print "No seleccion" return if selection == None: return output = crearShape() #Id del poligono ite = 0 for feature in selection: geom = feature.geometry() vertices = geom.getNumVertices() for i in range(vertices): lista = creaLista(i,vertices) print ite," FOR: ", i,lista pto0,pto1,pto2 = asignarVertices(geom,lista) ptoMedio = puntoMedio(pto0,pto1) crearPunto(pto0,output,ite) crearPunto(ptoMedio,output,ite) ite = ite + 1 try: output.commit() print "End" except: print "Comprueba: nombre repetido, seleccion" currentView().addLayer(output) def asignarVertices(geom,lista): pto0 = geom.getVertex(lista[0]) pto1 = geom.getVertex(lista[1]) pto2 = geom.getVertex(lista[2]) return pto0,pto1,pto2 def puntoMedio(pto0,pto1): x0 = pto0.getX() y0 = pto0.getY() x1 = pto1.getX() y1 = pto1.getY() disx = x1 - x0 disy = y1 - y0 xM = x0 + disx/2 yM = y0 + disy/2 ptoMedio = createPoint(xM,yM) return ptoMedio def crearShape(): ruta = "C:/gvsig/mdtarti/Puntos_medios_01.shp" CRS = currentLayer().getProjectionCode() schema = createSchema() schema.append("GEOMETRY", "GEOMETRY") schema.append("ID", "INTEGER", size = 10) output = createShape( schema, ruta, CRS = CRS, geometryType=POINT) return output def crearPunto(punto,output,ite): #añade punto a capa y con una ite == ID #la ID es para saber de que poligono viene values = dict() values["ID"] = ite values["GEOMETRY"] = punto output.append(values) return output def creaLista(ite,vertices): #lista de vertices siguientes puntos = 3 lista = list() for i in range(puntos): i = i + ite if i >= vertices: i = i - vertices lista.append(i) return lista