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()