Scripting en gvSIG: 01 Suavizado – Cálculo de los puntos medios

Suavizado_01puntomedio0Explicaré 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

Suavizado_01puntomedio2

Suavizado_01puntomedio1

1 comentario

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: