1 votos

¿Cómo puedo utilizar Django REST Framework GIS para consultar GeoJSON?

Estoy tratando de escribir la vista que devolverá un GeoJSON de mi modelo almacenado en la base de datos. Me gustaría crear una API para poder utilizar una petición AJAX en un archivo JavaScript que tengo. No he sido capaz de encontrar cómo utilizar los serializadores GIS de Django REST Framework en mis vistas. Simplemente quiero crear una API que devuelva el GeoJSON para cargarlo en mi mapa de Leaflet.

Vistas.py

from django.shortcuts import render
from django.core.serializers import serialize
from .serializers import GeoJsonSerializer
from .models import UtmZones
# Create your views here.
def index(request):
    context = {}
    return render(request, 'proj_picker/proj.html', context)

def api_get_utm(request):
    utm_poly = serialize('geojson', UtmZones.objects.all(), geometry_field='mpoly')
    return JsonResponse(utm_poly, safe=False)

modelos.py

from django.contrib.gis.db import models

# Create your models here.
class UtmZones(models.Model):
    swlon = models.CharField(max_length=254)
    swlat = models.CharField(max_length=254)
    hemisphere = models.CharField(max_length=3)
    zone = models.CharField(max_length=5)
    cm = models.CharField(max_length=5)
    zone_hemi = models.CharField(max_length=5)

    mpoly = models.MultiPolygonField()

    def __str__(self):
        return self.zone

urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='proj'),
    path('api/utm/', views.api_get_utm, name='utm'),
]

1voto

Mohamad Puntos 6

Descubrí cómo hacerlo con el serializador de Django 2.2 para no necesitar DRF-gis. Mi problema era que el JsonResponse era innecesario porque ya lo había serializado como json. El siguiente código funciona.

from django.shortcuts import render
from django.core.serializers import serialize
from django.http import HttpResponse
from .models import UtmZones

# Create your views here.
def index(request):
    context = {}
    return render(request, 'proj_picker/proj.html', context)

def api_get_utm(request):
    utm_poly = serialize('geojson', UtmZones.objects.all(), geometry_field='mpoly', fields=('zone', 'zone_hemi'))
    return HttpResponse(utm_poly, content_type='application/json')

0voto

Saad Puntos 57

Su flujo de trabajo se ve bien, pero pruebe mi siguiente consulta

def api_get_utm(request):
   cur = conn.cursor()
   qry='''SELECT row_to_json(fc)
          FROM
           ( SELECT 'FeatureCollection' AS TYPE,
                   array_to_json(array_agg(f)) AS features
           FROM
             (SELECT 'Feature' AS TYPE,
                     ST_AsGeoJSON(g.geom,4326)::JSON AS geometry,
                     row_to_json(
                                   (SELECT p
                                    FROM
                                      ( SELECT "INSERT FIELD NAMES") AS p)) AS properties
              FROM "TABLE NAME" AS g
              ) AS f) AS fc;
      '''
   cur.execute(qry)
   row=cur.fetchone()
   return JsonResponse(row[0])

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