2 votos

¿Ordenar (ORDER BY) filas de Shapefile usando Python?

Estoy escribiendo un script en el que tengo que leer un Shapefile, ordenar sus filas/registros por un campo específico, y luego escribir un nuevo shapefile con ese nuevo orden.

¿Alguien sabe cómo puedo hacerlo?

Estoy usando Fiona para abrir el archivo pero no encuentro cómo puedo hacer una operación tan fácil y común como un ORDER BY.

EDITAR

La solución propuesta por @Jose funciona perfectamente. Pero geopandas no crea el .prj que contiene la descripción de la proyección y esto es un problema si lo necesita. Una posible solución podría ser simplemente copiar el archivo original con el nuevo nombre:

import os
import geopandas as gpd

def main(file, field):
    output_file_name = os.path.splitext(file)[0] + '_sorted_by_' + field + os.path.splitext(file)[1]

    shape = gpd.read_file(file)
    shape_sorted = shape.iloc[shape[field].sort_values().index.values]
    shape_sorted.to_file(driver='ESRI Shapefile', filename=output_file_name)

    # Copy prj file
    prj_file = os.path.splitext(file)[0] + '.prj'

    if os.path.isfile(prj_file):
        from shutil import copyfile
        output_prj_file_name = os.path.splitext(file)[0] + '_sorted_by_' + field + '.prj'
        copyfile(prj_file, output_prj_file_name)

Finalmente decidí utilizar un comando ogr2ogr con -sql y ejecutarlo en Python utilizando os.system(command) utilidad.

import os

def main(file, field):
    output_file_name = os.path.splitext(file)[0] + '_sorted_by_' + field + os.path.splitext(file)[1]
    file_object = os.path.splitext(os.path.basename(file))[0]

    command = 'ogr2ogr -sql "SELECT * FROM ' + file_object + ' ORDER BY ' + field + '" ' + output_file_name + ' ' + file

    os.system(command)

if __name__ == '__main__':
   main()

2voto

kstrat2001 Puntos 11

Puedes usar geopandas, si usas pandas estarás familiarizado con esta librería:

import geopandas as gpd

shapefile_path = 'path_to_your_file/your_file.shp'
shape = gpd.read_file(shapefile_path)
shape_sorted = shape.iloc[shape['YOUR FIELD'].sort_values().index.values]
shape_sorted.to_file(driver='ESRI Shapefile', filename='output_file.shp')

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