Por último, en este pack de scripts para suavizar polígonos tenemos este que su función será crear un capa de puntos partiendo de la capa resultante del script anterior, con puntos medios en cada polígono entre vértices, para suavizar las esquinas del siguiente modo:
Este script esta creado de forma especifica, osea, los vértices que irá cogiendo son de dos en dos, coincidiendo con los puntos medios generados en el script anterior, si queréis hacerlo de diferente forma lo deberéis modificar. Lo que hace será, crear una linea entre dos puntos medios, y acercar la esquina hacia esa linea un ratio (que podremos modificar), y con esto se suavizarán las esquinas.
La capa resultante es otra capa de puntos pero aplicando de nuevo el script 02 Suavizado – Unir puntos por ID estará concluido el ejercicio, espero que os sea útil. En la siguiente imagen podemos comparar como cambia el polígono.
Así, los pasos ha seguir desde nuestra capa inicial será:
- Inicial: capa de poligonos
- 01 Puntos medios. Resultado: capa de puntos: vértices + puntos medios
- 02 Unir puntos. Resultado: capa de poligonos
- 03 Suavizado. Resultado: capa de puntos: vértices suavizados + puntos medios
- 02 Unir puntos. Resultado: capa de polígonos suavizados
from gvsig import * from math import * from geom import * def main(): """Capa de puntos suavizando las esquinas""" #INPUT: capa poligono con puntos #OUTPUT: capa de puntos suavizando esquinas global ruta ruta = "C:/gvsig/mdtarti/S-Suavi-01.shp" #Remove this lines and add here your code output = crearShape() selection = currentLayer().features() #selection = currentLayer().getSelection() ite = 0 for feature in selection: geom = feature.geometry() vertices = geom.getNumVertices() print vertices for i in range(vertices): lista = creaLista(i,vertices) print ite," FOR: ", i,lista punto0,punto1,punto2 = asignarVertices(geom,lista) linea = createLine() linea.addVertex(punto0) linea.addVertex(punto2) puntoCercano = linea.closestPoints(punto1) #crearPunto(puntoCercano[0],output) pcX = puntoCercano[0].getX() pcY = puntoCercano[0].getY() x1 = punto1.getX() y1 = punto1.getY() disx = x1 - pcX disy = y1 - pcY xM = x1 - disx/2 yM = y1 - disy/2 ptoMedio = createPoint(xM,yM) if not i % 2 == 0: print "ahora" crearPunto(punto0,output) crearPunto(ptoMedio,output) #crearPunto(punto2,output) output.commit() 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 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 def coordenadas(punto0,punto1,punto2): x0 = punto0.getX() y0 = punto0.getY() x1 = punto1.getX() y1 = punto1.getY() x2 = punto2.getX() y2 = punto2.getY() return x0,y0,x1,y1,x2,y2 def crearShape(): global ruta 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): values = dict() values["ID"] = 0 values["GEOMETRY"] = punto output.append(values) return output
Deja una respuesta