1 votos

Copiar características de una capa a otra con ogr y python

Tengo dos capas con las mismas definiciones de características llamadas lyr y lyr_add . Estas capas fueron pobladas desde un servidor de mapas basado en JSON. Me gustaría añadir todas las características de lyr_add a lyr , pero, cuando uso lyr.CreateFeature(feature) para un solo feature no se adjunta. Me gustaría anexar las características a la lyr antes de escribirlo en un archivo. La ejecución de mi python script no da lugar a ningún error o excepción. ¿Qué debo modificar en mi código para añadir con éxito las características?

Una versión abreviada de mi código que he intentado es:

import ogr
import os
import sys
import urllib, json

os.chdir(r'C:\Users\pipi\Documents\Rogaine')

xmin = 16501408.594
ymin = -4372525.989
xmax = 16520000
ymax = -4320000
extent = str(xmin) + ',' + str(ymin) + ',' + str(xmax) + ','+ str(ymax)

dict = {}
dict['Creek_Unnamed']=49

def count(url):
    """Returns a count of all of the features within the provided boundary"""
    url_count = '&where=1%3D1&returnCountOnly=true'
    url = url + url_count

    response = urllib.urlopen(url)
    data = json.loads(response.read())
    count = data[u'count']
    return count

def object_list(url):
    """Returns a list of the OBJECTID'S for all of the features within the provided boundary"""
    url_id = '&returnIdsOnly=true'
    url = url + url_id
    response = urllib.urlopen(url)
    data = json.loads(response.read())
    list = data['objectIds']
    return list

url_server = "http://maps.six.nsw.gov.au/arcgis/rest/services/sixmaps/LPIMap/MapServer/"
url_2 = "/query?geometry="
url_3 = "&geometryType=esriGeometryEnvelope"
url_4 = "&f=pjson"

for key in dict:
    url = url_server + str(dict[key]) + url_2 + extent + url_3 + url_4
    count = count(url)
    if count == 0:
        pass
    else:
        ds = ogr.Open(url)
        lyr = ds.GetLayer()
        if count > 1000:
            object_list = object_list(url)
            low_bound = object_list[x*1000]
            if ((x+1)*1000) > count:
                up_bound = object_list[-1]
            else:
                up_bound = object_list[((x+1)*1000-1)]

            url_loop = "&where=OBJECTID+>%3D+" + str(low_bound) + "+AND+OBJECTID+<%3D+" +str(up_bound)
            url_2 = url + url_loop
            ds_add = ogr.Open(url_2)
            lyr_add = ds_add.GetLayer()
            for i in range(0, lyr_add.GetFeatureCount()):
                feature = lyr_add.GetFeature(i)
                lyr.CreateFeature(feature)
            del ds_add

        del ds, lyr

4voto

Myles Gray Puntos 294

Es necesario tener acceso de "escritura" a la fuente de datos. En este caso, la fuente de datos es una página web resultante de una consulta. Una solución es crear una copia de la fuente de datos en la memoria del ordenador y, a continuación, añadirla a esa memoria:

        #create an output datasource in memory
        mem_driver=ogr.GetDriverByName('MEMORY')
        source = mem_driver.CreateDataSource('memData')
        mem = source.CopyLayer(lyr, key)
        lyr=source.GetLayer()

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