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

