Módulo geom

Una geometría es un objeto que contiene información geométrica. Estas geometrías tienen un tipo principal: Punto, Linea, Polygono.. y un subtipo o dimensión: D2, D3, D2M..

Para el Módulo de Scripting hemos creado la librería gvsig.geom que nos ayudará para crear rápidamente las geometrías que necesitemos. Para algunas operaciones más complicadas tendremos que usar la API de gvSIG.

Para establecer estos tipos y subtipos lo haremos utilizando las constantes que se incluyen en la libreria.

Constantes que aparecen en la librería gvsig.geom para la creación de geometrías:

#GeometryTypes
AGGREGATE = Geometry.TYPES.AGGREGATE
ARC = Geometry.TYPES.ARC
CIRCLE = Geometry.TYPES.CIRCLE
CURVE = Geometry.TYPES.CURVE
ELLIPSE = Geometry.TYPES.ELLIPSE
ELLIPTICARC = Geometry.TYPES.ELLIPTICARC
GEOMETRY = Geometry.TYPES.GEOMETRY
MULTICURVE = Geometry.TYPES.MULTICURVE
MULTIPOINT = Geometry.TYPES.MULTIPOINT
MULTISOLID = Geometry.TYPES.MULTISOLID
MULTISURFACE = Geometry.TYPES.MULTISURFACE
NULL = Geometry.TYPES.NULL
POINT = Geometry.TYPES.POINT
SOLID =  Geometry.TYPES.SOLID
SPLINE = Geometry.TYPES.SPLINE
SURFACE = Geometry.TYPES.SURFACE

# Common named geometry types
POLYGON = Geometry.TYPES.SURFACE
LINE = Geometry.TYPES.CURVE
MULTILINE = Geometry.TYPES.MULTICURVE
MULTIPOLYGON = Geometry.TYPES.MULTISURFACE

# geometrySubTypes
D2 = Geometry.SUBTYPES.GEOM2D
D2M = Geometry.SUBTYPES.GEOM2DM
D3 = Geometry.SUBTYPES.GEOM3D
D3M = Geometry.SUBTYPES.GEOM3DM
UNKNOWN = Geometry.SUBTYPES.UNKNOWN

# Dimensions
DIMENSIONS = Geometry.DIMENSIONS

Ejemplo testeando la librería de geom:

import gvsig
reload(gvsig)
from gvsig import *
from gvsig import geom


def main(*args):

    # Create Polygon
    print "\nCreate Polygon"
    x = geom.createPolygon()
    pol_1 = geom.createPolygon(vertexes=[geom.createPoint(geom.D2, 4,5),geom.createPoint(geom.D2,3,3),geom.createPoint(geom.D2,3,2),geom.createPoint(geom.D2,4,5)])
    print "pol_1: ", pol_1.convertToWKT()
    pol_2 = geom.createPolygon(vertexes=[geom.createPoint(geom.D2,4,5),geom.createPoint(geom.D2,3,3),geom.createPoint(geom.D2,3,2),geom.createPoint(geom.D2,4,5)])
    print "pol_2: ", pol_2.convertToWKT()
    pol_3 = geom.createPolygon(vertexes=[geom.createPoint(geom.D2,4,5),geom.createPoint(geom.D2,3,3),geom.createPoint(geom.D2,3,2),geom.createPoint(geom.D2,4,5)])
    print "pol_3: ", pol_3.convertToWKT()
    pol_4 = geom.createPolygon(geom.D2,[(0,0),(10,10),[3,3],[3,6],[0,0]])
    print "pol_4: ", pol_4.convertToWKT()


    # Create MultiPolygon
    print "\nCreate MultiPolygon"
    multipolygon1 = geom.createMultiPolygon()
    multipolygon1.addSurface(pol_1)
    multipolygon1.addSurface(pol_2)
    multipolygon1.addSurface(pol_3)
    print "multipolygon1: ", multipolygon1.convertToWKT()

    multipolygon2 = geom.createMultiPolygon(polygons=[pol_1, pol_2, pol_3])
    print "multipolygon2: ", multipolygon2.convertToWKT()

    p2 = geom.createPoint(geom.D2,1,2)
    print "p2:", p2
    line2 = geom.createLine(geom.D2, [[10,19],p2,[5,2]])
    print line2
    print line2.convertToWKT()

    y = geom.createPoint(geom.D3M,10,1,5,8)
    z = geom.createPoint(geom.D3,10, 1, 5)
    print "point y: ", y,type(y)
    print "point z", z, type(z)

    print "preparing 3d"
    x = geom.createLine(geom.D3M,[(10,10,100,8),(1,95,2,8)])
    print x.convertToWKT()

    # Create point
    print "\nCreate Point"
    point1 = geom.createPoint(geom.D2,10, 10)
    point2 = geom.createGeometry(geom.POINT)
    point2.setX(15)
    point2.setY(15)
    print "Point1: ", point1
    print "Point2: ", point2

    point1 = geom.createPoint(geom.D2,10, 10)
    # Create line
    print "\nCreate Line"
    line1 = geom.createGeometry(geom.LINE)
    line1.addVertex(geom.createPoint(geom.D2,0,0))
    line1.addVertex(geom.createPoint(geom.D2,10,10))
    print "Line1: ", line1.convertToWKT()

    p2 = geom.createPoint(geom.D2,1,2)
    print " === LINE == "
    line2 = geom.createLine(geom.D2, [[10,19], point1 ,p2,[5,2]])
    print "Line2 object: ", line2
    print "Line2: ", line2.convertToWKT()
    print "1", line2.getVertex(0)
    print "2", line2.getVertex(1)
    print "3", line2.getVertex(2)
    print "4", line2.getVertex(3)

    # Create polygon
    print "\nCreate Polygon"
    g = geom.createGeometry(geom.POLYGON)
    g.addVertex(geom.createPoint(geom.D2,0,0))
    g.addVertex(geom.createPoint(geom.D2,10,10))
    g.addVertex(geom.createPoint(geom.D2,10,0))
    g.addVertex(geom.createPoint(geom.D2,0, 0))


    print "JTS of the Polygon 1: ", g.convertToWKT()
    g.setVertex(2, geom.createPoint(geom.D2, 15, 15))
    print "JTS of the Polygon 1 modified: ", g.convertToWKT()

    poli_1 = geom.createPolygon(geom.D2, [[0,0],[1,1],[2,3],[3,6],[0,0]])
    print "Poli_1", poli_1.convertToWKT()
    poli_2 = geom.createPolygon(geom.D3, [[0,1,2],[1,1,5],geom.createPoint(geom.D3,2,1,5),[0,1,2]])
    print "Poli_2", poli_2

    # Create gvSIG geometry from a WKT or WKB
    print "\nCreate gvSIG geometry from WKT or WKB"
    wkt = "POLYGON ((0 0, 150 150, 100 0, 0 0))"
    x = geom.createGeometryFromWKT(wkt)
    print "Polygon from WKT: ", x
    print "Type polygon: ", type(x)

    # Create 3D geometry
    print "\nCreate 3D Geometry"
    p3d = geom.createGeometry(geom.POINT, geom.D3)
    p3d.setX(10)
    p3d.setY(10)
    p3d.setZ(100)
    print "Point 3D: ", p3d, type(p3d)
    p1_3d = geom.createPoint(geom.D3,1,3,3)
    print "Point 3D P1: ", p1_3d

    # Create Multipoint
    print "\nCreate Multipoint: "
    multipoint1 = geom.createMultiPoint(points=[geom.createPoint(geom.D2, 10,10), geom.createPoint(geom.D2,5,2), geom.createPoint(geom.D2,8,3)])
    print "multipoint1: ", multipoint1.convertToWKT()
    multipoint1.addPrimitive(geom.createPoint(geom.D2,3, 2))
    print "multipoint1 modified: ", multipoint1.convertToWKT()

    multipoint2 = geom.createMultiPoint()
    print "multipoint2: ", multipoint2.convertToWKT()

    multipoint3 = geom.createMultiPoint(geom.D3,[[19,10,8],[3,5,7],[35,5,5]])
    print "multipoint3: ", multipoint3.convertToWKT()

    # Create Polygon
    print "\nCreate Polygon"
    x = geom.createPolygon()
    pol_1 = geom.createPolygon(vertexes=[geom.createPoint(geom.D2,4,5),geom.createPoint(geom.D2,3,3),geom.createPoint(geom.D2,3,2),geom.createPoint(geom.D2,4,5)])
    print "pol_1: ", pol_1.convertToWKT()
    pol_2 = geom.createPolygon(vertexes=[geom.createPoint(geom.D2,4,5),geom.createPoint(geom.D2,3,3),geom.createPoint(geom.D2,3,2),geom.createPoint(geom.D2,4,5)])
    print "pol_2: ", pol_2.convertToWKT()
    pol_3 = geom.createPolygon(vertexes=[geom.createPoint(geom.D2,4,5),geom.createPoint(geom.D2,3,3),geom.createPoint(geom.D2,3,2),geom.createPoint(geom.D2,4,5)])
    print "pol_3: ", pol_3.convertToWKT()
    pol_4 = geom.createPolygon(geom.D2,[(0,0),(10,10),[3,3],[3,6],[0,0]])
    print "pol_4: ", pol_4.convertToWKT()


    # Create MultiPolygon
    print "\nCreate MultiPolygon"
    multipolygon1 = geom.createMultiPolygon()
    multipolygon1.addSurface(pol_1)
    multipolygon1.addSurface(pol_2)
    multipolygon1.addSurface(pol_3)
    print "multipolygon1: ", multipolygon1.convertToWKT()

    multipolygon2 = geom.createMultiPolygon(polygons=[pol_1, pol_2, pol_3])
    print "multipolygon2: ", multipolygon2.convertToWKT()

    multipolygon3 = geom.createMultiPolygon(geom.D2,[[[0,0],[1,1],[2,2],[0,0]],[[2,5],[3,5],[1,2],[2,5]],pol_4])
    print "multipolygon3: ", multipolygon3.convertToWKT()

    # CreateLine
    print "\nCreate Line"
    line1 = geom.createLine()


    line1.addVertex(geom.createPoint2D(1,1))
    line1.addVertex(geom.createPoint2D(3,3))
    print "line1: ", line1.convertToWKT()
    line2 = geom.createLine(vertexes=[geom.createPoint2D(0,0), geom.createPoint2D(10,10)])
    print "line2: ", line2.convertToWKT()
    line3 = geom.createLine(geom.D2,[[0,1],[1,5],[5,3]])
    print "line3: ", line3.convertToWKT()

    # Create MultiLine
    print "\nCreate MultiLine"
    multiline1 = geom.createMultiLine()
    multiline1.addCurve(line1)
    multiline1.addCurve(line2)
    print "multiline1: ", multiline1.convertToWKT()

    multiline2 = geom.createMultiLine(lines=[line1, line2], subtype=geom.D2)
    print "multiline2: ", multiline2.convertToWKT()


    # Create Envelope
    envelope = geom.createEnvelope(pointMin=geom.createPoint2D(10,0),pointMax=geom.createPoint2D(10,20))
    print "envelope: ", envelope
    env1 = geom.createEnvelope(point1,[38,29])
    print "env1: ", env1,type(env1)

    # Create from WKT
    print "\nCreate geometr from WKT"
    wkt = geom.createGeometryFromWKT("MULTIPOLYGON (((4 5, 3 3, 3 2, 4 5)), ((4 5, 3 3, 3 2, 4 5)), ((4 5, 3 3, 3 2, 4 5)))")
    print "wkt: ", wkt.convertToWKT()

    # Create 2D
    pg = geom.createPoint2D(19,5)
    print pg
    lg = geom.createLine2D()
    print lg
    mg = geom.createPolygon2D()
    print mg
    mg2 = geom.createPolygon2D([[1,5],[4,5],[1,3],[25,2],pg,[1,5]])
    print mg2.convertToWKT()
    x = geom.createPoint2D(1)
    print x

Punto

Creando puntos:

from gvsig.geom import *

def main(*args):

        print "\nCreate Point"
        point1 = createPoint(D3, 10, 10, 5)
        point2 = createPoint(D2, 15, 7)

        point3 = createGeometry(POINT)
        point3.setX(15)
        point3.setY(15)

        point4 = createPoint(D3M, 5, 18, 3, 2)

        print "Point1: ", point1
        print "Point2: ", point2
        print "Point3: ", point3
        print "Point4: ", point4

Creando punto con 3 dimensiones:

from gvsig.geom import *

def main(*args):

        #Create 3D Geometry
        p3d = createGeometry(POINT, D3)
        p3d.setX(10)
        p3d.setY(10)
        p3d.setZ(100)

        print p3d.convertToWKT()

Línea

Creando líneas:

from gvsig.geom import *

def main(*args):

        line1 = createGeometry(LINE)
        line1.addVertex(createPoint(D2,0,0))
        line1.addVertex(createPoint(D2,10,10))
        print "Line1: ", line1.convertToWKT()

Accediendo a los vértices de la línea:

from gvsig.geom import *

def main(*args):

        line1 = createGeometry(LINE)
        line1.addVertex(createPoint(D2,0,0))
        line1.addVertex(createPoint(D2,10,10))
        print "Line1: ", line1.convertToWKT()

        p1 = createPoint(D2, 3, 01)
        p2 = createPoint(D2, 1, 2)

        # List of vertex or coordinates
        vertx = [[10,19], p1 ,p2,[5,2]]
        line2 = createLine(D2, vertx)

        print "\nLine2 object: ", line2
        print "Line2: ", line2.convertToWKT()
        print "1", line2.getVertex(0)
        print "2", line2.getVertex(1)
        print "3", line2.getVertex(2)
        print "4", line2.getVertex(3)

Polígono

Creando polígonos:

from gvsig.geom import *

def main(*args):

        g = createGeometry(POLYGON, D2)
        g.addVertex(createPoint(D2,0,0))
        g.addVertex(createPoint(D2,10,10))
        g.addVertex(createPoint(D2,10,0))
        g.addVertex(createPoint(D2,0, 0))

        print "WKT Polygon: ", g.convertToWKT()

        poli_1 = createPolygon(D2, [[0,0],[1,1],[2,3],[3,6],[0,0]])
        print "Poli_1", poli_1.convertToWKT()

        poli_2 = createPolygon(D3, [[0,1,2],[1,1,5],createPoint(D3,2,1,5),[0,1,2]])
        print "Poli_2", poli_2.convertToWKT()

Multipunto

Creando multipunto:

from gvsig.geom import *

def main(*args):

        # Create Multipoint
        multipoint1 = createMultiPoint(D2, [createPoint(D2, 10,10), createPoint(D2,5,2), createPoint(D2,8,3)])

        print "multipoint1: ", multipoint1.convertToWKT()

        multipoint2 = createMultiPoint()
        print "multipoint2: ", multipoint2.convertToWKT()

        multipoint3 = createMultiPoint(D3,[[19,10,8],[3,5,7],[35,5,5]])
        print "multipoint3: ", multipoint3.convertToWKT()

Añadiendo punto a una geometría de tipo multipunto:

from gvsig.geom import *

def main(*args):

        # Create Multipoint
        multipoint1 = createMultiPoint(D2, [createPoint(D2, 10,10), createPoint(D2,5,2), createPoint(D2,8,3)])

        print "multipoint1: ", multipoint1.convertToWKT()

        multipoint1.addPrimitive(createPoint(D2,3, 2))
        print "multipoint1 modified: ", multipoint1.convertToWKT()

Multilinea

Creando multilíneas:

from gvsig.geom import *

def main(*args):

# CreateLine
        print "\nCreate Line"
        line1 = createLine()

        line1.addVertex(createPoint2D(1,1))
        line1.addVertex(createPoint2D(3,3))
        line2 = createLine(vertexes=[createPoint2D(0,0), createPoint2D(10,10)])
        line3 = createLine(D2,[[0,1],[1,5],[5,3]])

        # Create MultiLine
        multiline1 = createMultiLine()
        multiline1.addCurve(line1)
        multiline1.addCurve(line2)
        print "multiline1: ", multiline1.convertToWKT()

        multiline2 = createMultiLine(D2, lines=[line1, line2])
        print "multiline2: ", multiline2.convertToWKT()

        multiline3 = createGeometry(MULTICURVE, D2)
        multiline3.addCurve(line1)
        multiline3.addCurve(line3)
        print "multiline3: ", multiline3.convertToWKT()

Multipolígono

Creando multipolígonos:

from gvsig.geom import *

def main(*args):

        # Create Polygon
        x = createPolygon()
        pol_1 = createPolygon(vertexes=[createPoint(D2,4,5),createPoint(D2,3,3),createPoint(D2,3,2),createPoint(D2,4,5)])
        pol_2 = createPolygon(vertexes=[createPoint(D2,4,5),createPoint(D2,3,3),createPoint(D2,3,2),createPoint(D2,4,5)])
        pol_3 = createPolygon(vertexes=[createPoint(D2,4,5),createPoint(D2,3,3),createPoint(D2,3,2),createPoint(D2,4,5)])
        pol_4 = createPolygon(D2,[(0,0),(10,10),[3,3],[3,6],[0,0]])


        # Create MultiPolygon
        multipolygon1 = createMultiPolygon()
        multipolygon1.addSurface(pol_1)
        multipolygon1.addSurface(pol_2)
        multipolygon1.addSurface(pol_3)
        print "multipolygon1: ", multipolygon1.convertToWKT()

        multipolygon2 = createMultiPolygon(polygons=[pol_1, pol_2, pol_3]) #2D as default
        print "multipolygon2: ", multipolygon2.convertToWKT()

        multipolygon3 = createMultiPolygon(D2, [[[0,0],[1,1],[2,2],[0,0]],
                                                                                        [[2,5],[3,5],[1,2],[2,5]],
                                                                                        pol_4])
        print "multipolygon3: ", multipolygon3.convertToWKT()

        multipolygon4 = createMultiPolygon()
        print "multipolygon4: ", multipolygon4.convertToWKT()

Envelope

Crear Envelope:

from gvsig.geom import *

def main(*args):

        # Create Envelope
        envelope = createEnvelope(pointMin=createPoint2D(10,0),pointMax=createPoint2D(10,20))
        print "envelope: ", envelope
        point1 = createPoint(D2, 0, 0)
        env1 = createEnvelope(point1,[38,29])
        print "env1: ", env1
        print "env1 type: ", type(env1)

WKT

Crear geometría desde un WKT:

from gvsig.geom import *

def main(*args):

        # Create from WKT
        wkt = createGeometryFromWKT("MULTIPOLYGON (((4 5, 3 3, 3 2, 4 5)), ((4 5, 3 3, 3 2, 4 5)), ((4 5, 3 3, 3 2, 4 5)))")
        print "wkt: ", wkt.convertToWKT()

Operaciones espaciales

Distancia entre puntos:

from gvsig.geom import *

def main(*args):
        # Creamos punto2
        point1 = createPoint(D2, 0, 0)
        point2 = createPoint(D2, 10, 10)
        print "Distance 2D: ", point1.distance(point2)

        point3 = createPoint(D3, 0, 0, 100)
        point4 = createPoint(D3, 10, 10, 0)
        print "Distance 2D: ", point3.distance(point4)

Moviendo un punto:

from gvsig.geom import *

def main(*args):
        # Creamos punto2
        point1 = createPoint(D2, 10, 10)

        print "Point 1: ", point1.convertToWKT()

        #Move point
        point1.move(5, -3)

        print "Moved point by 5, -3: ", point1.convertToWKT()

Operaciones entre polígonos y líneas:

from gvsig.geom import *

def main(*args):
        # Creamos punto2
        point1 = createPoint(D2, 0, 0)
        buffer1 = point1.buffer(10)

        line1 = createLine(D2, [[-5, -5],[10, 10]])

        print "Intersects?: ", buffer1.intersects(line1)
        print "Intersection: ", buffer1.intersection(line1).convertToWKT()

Operaciones espaciales entre polígonos:

from gvsig.geom import *

def main(*args):
        # Creamos punto2
        point1 = createPoint(D2, 0, 0)

        # Aplicamos un area de influencia buffer(m)
        buffer1 = point1.buffer(10)
        print "Buffer1 Area: ", buffer1.area()

        # Creamos punto 2
        point2 = createPoint(D2, 8, 0)
        buffer2 = point2.buffer(5)
        print "Buffer2 Area: ", buffer2.area()

        # Union
        buffer12_union = buffer1.union(buffer2)
        print "Buffer12 Union Area: ", buffer12_union.area()

        # Differencia
        buffer12_diff = buffer1.difference(buffer2)
        print "Buffer12 Difference Area: ", buffer12_diff.area()

Creando un polígono con un hueco interno y añadirlo en una capa nueva:

from gvsig import *
from gvsig.geom import *

def main(*args):

        pol_1 = createPolygon(D2M, [(0,0),(300,0),(300,300),(0,300),(0,0)])


        # Add interior ring
        pol_1x = createPolygon(D2M, pol_1).buffer(200)
        pol_1x.addInteriorRing(pol_1)

        schema = createSchema()
        schema.append("ID", "STRING", 5)
        schema.append("GEOMETRY", "GEOMETRY")
        schema.get('GEOMETRY').setGeometryType(POLYGON, D2M)

        shape = createShape(schema ,CRS='EPSG:25830')

        shape.edit()
        shape.append(ID=1, GEOMETRY=pol_1x)
        shape.commit()

        currentView().addLayer(shape)