Scripting en gvSIG: 03 Suavizado – Redondear esquinas y capa final

suavizadoFinal05Por ú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:

suavizadoFinal04Este 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.

suavizadoFinal06

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

suavizadoFinal02

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: