es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Administrador de GeoDjango: cómo poblar un GeometryField desde una carga de archivo

Tengo un proyecto que utiliza GeoDjango para almacenar rutas GPS. La geometría se guarda en un campo GeometryField. Esto funciona muy bien cuando se importan datos con información geoespacial, pero resulta frustrante cuando tengo un modelo que necesita datos proporcionados por el usuario. Me gustaría tener un widget en el panel de administración que me permita cargar un archivo y luego utilizar ese archivo para importar la información geoespacial.

El campo FileField no parece apropiado, ya que no quiero que el archivo se guarde en el sistema de archivos. Quiero que se procese y se guarde en el campo de la base de datos geoespaciales para poder ejecutar funciones geoespaciales en los datos.

Idealmente, la interfaz de administración contendría un widget para carga de archivos y el campo geoespacial, mostrado con el mapa típico.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, puedes crear un formulario personalizado para manejar la carga y procesamiento del archivo, y luego anular el formulario del Administrador para usar el formulario personalizado. En el formulario personalizado, puedes usar un widget de entrada de archivo para permitir al usuario cargar el archivo, y luego utilizar los datos del archivo para rellenar el GeometryField.

    Aquí tienes un ejemplo de cómo puedes lograr esto:

    from django import forms
    from django.contrib.gis.geos import LineString
    
    
    class GeoFileForm(forms.Form):
        geo_file = forms.FileField()
    
        def save(self, commit=True):
            geo_file = self.cleaned_data.get('geo_file')
            if geo_file:
                # Procesa el archivo y crea un LineString a partir de los datos
                # Suponiendo que el archivo contiene una lista de coordenadas de latitud/longitud
                coordinates = []
                for line in geo_file:
                    lat, long = line.split(',')
                    coordinates.append((float(long), float(lat)))
                line_string = LineString(coordinates)
    
                # Establece el LineString como el valor para el GeometryField
                self.instance.geometry_field = line_string
    
                if commit:
                    self.instance.save()
    
            return self.instance
    

    En la clase Admin para el modelo, puedes anular el formulario para usar el formulario personalizado:

    from django.contrib import admin
    from myapp.models import Route
    from myapp.forms import GeoFileForm
    
    
    @admin.register(Route)
    class RouteAdmin(admin.ModelAdmin):
        form = GeoFileForm
        ...
    

    Esto agregará un widget de carga de archivos al formulario del Administrador para el modelo Route, y permitirá al usuario cargar un archivo que contenga coordenadas GPS. Los datos del archivo se utilizarán para rellenar el GeometryField, y se podrán utilizar para funciones geoespaciales. El GeometryField se almacenará en el campo de la base de datos geoespacial, por lo que no tienes que preocuparte por almacenar el archivo en el sistema de archivos.

Comments are closed.