3 votos

PyQGIS funciona demasiado lento. Puedo utilizar GeoPandas?

Tengo una capa con clasificación de edificios. Quiero añadir "Área" a mi tabla de atributos y uso PyQGIS. Para otra capa con 50 registros funciona, pero mi capa es enorme, contiene 6,8 millones de registros y funciona demasiado lento. Con otro problema he utilizado GeoPandas que está trabajando muy rápido. Voy a pegar mi código y necesito consejo. ¿Puedo hacerlo con GeoPandas?

from qgis.core import *
from qgis.utils import *
from qgis.analysis import QgsNativeAlgorithms
from PyQt5.QtCore import QVariant
from qgis.core import QgsApplication, QgsProcessingFeedback, QgsRasterLayer
import sys
import geopandas

sys.path.append('/usr/lib/qgis')
sys.path.append('/usr/share/qgis/python/plugins')
os.environ["QT_QPA_PLATFORM"] = "offscreen"

QgsApplication.setPrefixPath(r'/usr/bin/qgis', True)
qgs = QgsApplication([], False)
qgs.initQgis()

import processing
from processing.core.Processing import Processing

Processing.initialize()
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())
feedback = QgsProcessingFeedback()

#adding the Area field
layer = QgsVectorLayer(r'/home/gis/polskagisencoding.shp', "polskagisencoding", "ogr")
provider = layer.dataProvider()
area_field = QgsField("Area", QVariant.Int)
provider.addAttributes([area_field])
layer.updateFields()

#updating the Area field for each feature
idx = provider.fieldNameIndex('Area')
for feature in layer.getFeatures():
    attrs = {idx : int(feature.geometry().area())}
    layer.dataProvider().changeAttributeValues({feature.id() : attrs})

5voto

GreyCat Puntos 146

Con GeoPandas

import geopandas as gpd
gdf = gpd.read_file('/home/gis/polskagisencoding.shp')
gdf["Area"] = gdf.geometry.area

Pero no estoy seguro de que sea más rápido con shapefiles más grandes

5voto

King Puntos 118

Para conjuntos de datos de gran tamaño como éste, es posible que desee utilizar dask-geopandas . Todavía está en fase de desarrollo (aún no hay lanzamiento oficial) pero area debería funcionar sin problemas.

Debe instalar geopandas , dask y pygeos y luego dask-geopandas de git.

pip install git+git://github.com/jsignell/dask-geopandas.git

Entonces puede leer su archivo con geopandas y convertirlo en dask.dataframe .

import geopandas
import dask_geopandas

df = geopandas.read_file('/home/gis/polskagisencoding.shp')

ddf = dask_geopandas.from_geopandas(df, npartitions=4)

areas = ddf.geometry.area.compute()

npartitions en este caso debe ser el número de procesadores que desea utilizar. dask-geopandas entonces hace el cálculo en paralelo.

Vea más aquí https://github.com/jsignell/dask-geopandas

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