7 votos

Cómo script shapefile de edición con herramientas de código abierto?

Realmente me gustaría que no molesta a nadie y encontrar mi respuesta por una búsqueda de Google, pero yo realmente no sé por dónde empezar.

Tengo un .shp capa vectorial con varios puntos en las calles, cada uno con una lista de atributos (alrededor de 40K). Quiero crear una línea entre ciertos puntos.

Por ejemplo: estoy en la esquina de una calle, un punto tiene un atributo "Oriente", en el que se enfrenta un atributo de "Occidente". Quiero simplificar un proceso donde (por ejemplo) de cada punto con el atributo de "Occidente" de una calle en particular (incluido en el atributo) está conectado a la correspondiente "Oriente".

En definitiva, cómo script modificaciones, basadas en atributos, en un .shp?

La salida tiene que ser un shapefile.

Podría usted por favor me guía a algunos de la documentación pertinente, por favor? No tengo ArcGIS.

Muchas gracias!

8voto

Jimmy Puntos 35501

Usted podría hacer esto con bastante facilidad en python usando pyshp: http://code.google.com/p/pyshp/

La forma en que he entendido su pregunta a la que usted está trabajando con un punto de shapefile y transformarlo en una línea de shapefile.

El código sería algo como esto:

import shapefile

# Read your points shapefile

r = shapefile.Reader("streetPoints.shp")

shapes = r.shapes()

records = r.records()

# Create the output shapefile

w = shapefile.Writer(shapefile.POLYLINE)

# Loop through the attributes and create line segments.
# There's probably better logic for this but it's a start

segments = []

# Get the field names from the dbf field descriptors
fieldnames = [n[0] for n in r.fields]

st = fieldnames.index("STREET")
d = fieldnames.index("END")
opp = {"WEST":"EAST", "NORTH":"SOUTH"}

# Build the connected segments based on corresponding points
for rec1 in records:
    street = rec[st]
    e = opp[rec[d]]
    for rec2 in records:
        if street in rec2 and e in rec2:
            p1 = shapes[records.index(rec1)]
            p2 = shapes[records.index(rec2)]
            connect = [p1, p2, street]
            if connect not in segments:
                segments.append(connect)

w.field("STREET")
for seg in segments:
    # add the start and end points
    w.poly(parts=[ [ [[seg[0]], [seg[1]] ] ]
    # add the street name as the attribute
    w.record(seg[2])

# Produce a new shapefile
w.save("streetLines")

Este ejemplo es demasiado simplista y podría ser más eficiente con un poco de trabajo, pero esa es la idea básica. Si este es un proceso que planean repetir a menudo que sería, sin duda vale la pena un trabajo adicional y tal vez incluso la creación de un archivo ejecutable con PyInstaller si usted necesita darle a otras personas.

Si yo lo he entendido mal tu pregunta o estás teniendo problemas con la solución de sentirse libre de ponerse en contacto conmigo y me puede ayudar aún más.

Saludos, Joel

twitter: spatialpython

web: geospatialpython.com

3voto

FlySwat Puntos 61945

Este sitio tiene un montón de tutoriales y ejemplos sobre cómo utilizar GDAL/OGR. Otro lugar para buscar más complicado de python ejemplos es mirar directamente a la GDAL repositorio de código.

0voto

Adam Ernst Puntos 6939

No estoy seguro de lo fácil que será para tu ejemplo pero he utilizado GeoScript para este tipo de cosas en el pasado. Se le facilita las operaciones espaciales en JavaScript, Python, Scala, y Groovy.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X