Soy nuevo trabajando con datos de geo y tratando de responder a una pregunta similar a la publicada aquí.
Utilizando la línea de comandos y/o torneadas/fiona, en la mayoría de manera eficiente y elegante.
He creado dos archivos con sus respectivos atributos numéricos:
- las zonas con los datos de la población
- los distritos de policía con el crimen estadísticas(número único)
Son independientes.
Me gustaría volver a calcular los tales que ambas estimaciones están presentes en cada uno de los shapefiles, por ejemplo. estimación de la delincuencia dentro del área pequeña (tomar los datos de 2 y mire todas las áreas en 1 que hay en ella, cortar esos que se cruzan y hacer de las matemáticas).
Yo tengo el de matemáticas descubierto y atrapado buscando elegantes formas y eficiente de los formatos de datos para hacer las intersecciones y cortar la se superpone a los límites apropiados.
Actualización tras la respuesta de @gen
La adaptación del código no encontrar ninguna de las intersecciones en los datos, el cual está estructurado de la siguiente manera (y sorprendente, ya que es a partir de fuentes oficiales):
- polSHP_upd: cuarteles de policía a través de SA
- sal_subSHP: subconjunto de pequeñas regiones con datos de la población en Ciudad del Cabo
Los archivos en vivo aquí:
https://github.com/AnnaMag/GIS-analyses
Lo que me estoy perdiendo?
polSHP_upd = 'crime/GIS-analyses/polPres_updated4crimes/polPres_updated4crimes.shp'
sal_subSHP = 'crime/GIS-analyses/sal_sub/sal_sub.shp'
import geopandas as gpd
g1 = gpd.GeoDataFrame.from_file(polSHP_upd)
g2 = gpd.GeoDataFrame.from_file(sal_subSHP)
data = []
# A: region of the police data with criminal record
# C: small area with population data
# we look for all small areas intersecting a given C_i, calculate the fraction of inclusion, scale the
# population accordingly: area(A_j, where A_j crosses C_i)/area(A_j)* popul(A_j)
for index, crim in g1.iterrows():
for index2, popu in g2.iterrows():
if popu['geometry'].crosses(crim['geometry']): # objects overlaps to partial extent, not contained
area_int = popu['geometry'].intersection(crim['geometry']).area
area_crim = crim['geometry'].area
area_popu = popu['geometry'].area # there is a Shape_Area field in properties: to check precision
popu_count = popu['properties']['PPL_CNT']
popu_frac = (area_int / area_popu) * popu_count# fraction of the pop area contained inside the crim
data.append({'id': (index1, index2) ,'area_crim': area_crim,'area_pop': area_popu, 'area_inter': area_int, 'popu_frac': popu_frac} )
# data.append({'geometry': crim['geometry'].intersection(popu['geometry']), 'crime_stat':crim['crime_stat'], 'Population': popu['Population'], 'area':crim['geometry'].intersection(popu['geometry']).area})
elif popu['geometry'].intersects(crim['geometry']):
pass
#print("intersect")
elif popu['geometry'].disjoint(crim['geometry']):
pass`