Yo estaba curioso por qué el recorte de los shapefiles era tan difícil y si era diferente a la intersección de los shapefiles?
Usted verá a partir de uno de mis preguntas que me di por vencido tratando de clip de una polilínea con un polígono (aquí)
He intentado varios métodos diferentes:
La conversión ogr2ogr (demasiado lento)
import subprocess subprocess.call(["C:\Program Files\GDAL\ogr2ogr", "-f", "ESRI Shapefile", "-clipsrc", clipping_shp, output_shp, input_shp]) print('Done!')
SQL ogr (demasiado lento)
from osgeo import ogr ogr.UseExceptions() ogr_ds = ogr.Open('K:/compdata/OS_Shape_Files/os_open_roads/trim', True) # Windows: r'C:\path\to\data' start = time.clock() print('Starting:') print(ogr_ds) SQL = """\ SELECT ST_Intersection(A.geometry, B.geometry) AS geometry, A.*, B.* FROM ROADLINK_Project A, cut_se59ef_poly_60 B WHERE ST_Intersects(A.geometry, B.geometry);""" layer = ogr_ds.ExecuteSQL(SQL, dialect='SQLITE') # copy result back to datasource as a new shapefile layer2 = ogr_ds.CopyLayer(layer, 'h1_buf_int_ct3') # save, close layer = layer2 = ogr_ds = None print("Finished in %.0f seconds" % time.clock() - start)
pyclipper (no podía conseguir que esto funcione)
solution = pc.Execute2(pyclipper.CT_INTERSECTION, pyclipper.PFT_NONZERO, pyclipper.PFT_NONZERO)
rTree (no podía conseguir este trabajo, como he python 3.4)
import fiona from shapely.geometry import shape, mapping import rtree bufSHP = produce_poly_shape intSHP = 'K:/compdata/OS_Shape_Files/os_open_roads /trim/ROADLINK_Project.shp' ctSHP = 'output.shp' start = time.clock() print('Starting') with fiona.open(bufSHP, 'r') as layer1: with fiona.open(ctSHP, 'r') as layer2: # We copy schema and add the new property for the new resulting shp schema = layer2.schema.copy() schema['properties']['uid'] = 'int:10' # We open a first empty shp to write new content from both others shp with fiona.open(intSHP, 'w', 'ESRI Shapefile', schema) as layer3: index = rtree.index.Index() for feat1 in layer1: fid = int(feat1['id']) geom1 = shape(feat1['geometry']) index.insert(fid, geom1.bounds) for feat2 in layer2: geom2 = shape(feat2['geometry']) for fid in list(index.intersection(geom2.bounds)): if fid != int(feat2['id']): feat1 = layer1[fid] geom1 = shape(feat1['geometry']) if geom1.intersects(geom2): # We take attributes from ctSHP props = feat2['properties'] # Then append the uid attribute we want from the other shp props['uid'] = feat1['properties']['uid'] # Add the content to the right schema in the new shp layer3.write({ 'properties': props, 'geometry': mapping(geom1.intersection(geom2)) }) print("Finished in %.0f seconds" % time.clock() - start)
Finalmente, miré a esto , pero no podía llegar a trabajar con python 3.4.
A continuación, en R he intentado:
gIntersection(x,y, byid=TRUE)
gDifference
personalizada
gClip
comando que he encontrado en línea
Sin embargo, con un gran polilíneas shapefile (alrededor de 500 mb) y una parte muy pequeña de polígonos shapefile (1mb) la intersección llevaría un día. Esto me llevó a pensar tal vez estoy haciendo algo increíblemente estúpido y hay una rápida comando clip?
Por ejemplo, en el arcGIS intersection
comando toma un par de segundos por lo que seguramente el recorte es aún más fácil? Sé muy poco acerca de los SIG, pero a mí me parece tan simple como la alineación de las dos capas por una coordenada (suponiendo que la misma proyección) y, a continuación, seleccionando el exterior de la clipper forma (por ejemplo, en la pintura) y la eliminación de la otra capa. Supongo que, obviamente, este no es el caso ..
Por lo tanto mi objetivo: crear un polígono en mi código y quiero clip de las carreteras del reino unido la red me carga hasta el punto de que el polígono, el búfer de los puntos, disolver y luego la salida como una matriz que contiene las coordenadas de un polígono.
No necesito conservar todas las características que una intersección proveerán una pinza recta. Supongo que tampoco es estrictamente necesario de la forma de archivos y puede convertir mi 500mb reino unido de la red de carreteras en una geodatabase?