Skip to content

Instantly share code, notes, and snippets.

@victorouttes
Created January 16, 2020 18:50
Show Gist options
  • Select an option

  • Save victorouttes/e8862a3b42020d08704c7661bae4c70e to your computer and use it in GitHub Desktop.

Select an option

Save victorouttes/e8862a3b42020d08704c7661bae4c70e to your computer and use it in GitHub Desktop.
Geolocalização em Django (django rest framework)

Configuração

Para utilizar o campo PointField (com o sqlite3), que armazena latitude e longitude no django, você precisa instalar no linux:

sudo apt install libsqlite3-mod-spatialite
sudo apt install gdal-bin

Depois você precisa instalar o pacote "django-extra-fields" para permitir você usar no DRF a serialização correta:

pip install django-extra-fields

Além de configurar no "settings.py":

INSTALLED_APPS = [
    [...]
    'django.contrib.gis',
    [...]
]

[...]

SPATIALITE_LIBRARY_PATH = 'mod_spatialite.so'
DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.spatialite',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

[...]

Modo de uso

models.py

from django.db import models
from django.contrib.gis.db import models as geo_models


class MyModel(models.Model):
    name = models.CharField(max_length=200, null=True, blank=True)
    location = geo_models.PointField(null=True)

serializers.py

from rest_framework import serializers
from drf_extra_fields.geo_fields import PointField

class MySerializer(serializers.HyperlinkedModelSerializer):
    location = PointField()

views.py

from rest_framework import viewsets
from django.contrib.gis.geos import Point
from django.contrib.gis.measure import Distance


class MyViewSet(viewsets.ModelViewSet):
    serializer_class = serializers.MySerializer

    def get_queryset(self):
        queryset = models.MyModel.objects.all().order_by('name')
        latitude = self.request.query_params.get('latitude', None)
        longitude = self.request.query_params.get('longitude', None)
        if latitude and longitude:
            point = Point(float(longitude), float(latitude))
            queryset = queryset.filter(location__distance_lt=(point, Distance(km=10)))
        return queryset
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment