ポイントと距離で空間検索するメモ。
/app/api/views.py
from rest_framework import viewsets
# ページネーション読み込み
from rest_framework_gis.pagination import GeoJsonPagination
# フィルター読み込み
from rest_framework_gis.filters import DistanceToPointFilter
# シリアライザ読み込み
from .serializers import PointsSerializer, LinesSerializer, PolygonsSerializer
# モデル読み込み
from .models import Points, Lines, Polygons
# ページネーションの設定
class Pagination(GeoJsonPagination):
# 1ページに表示するオブジェクト数
page_size = 5
# ポイントビュー
class PointsViewSet(viewsets.ModelViewSet):
queryset = Points.objects.all()
serializer_class = PointsSerializer
# ページネーションの適用
pagination_class = Pagination
# フィルターの種類設定 (ポイントと距離で空間検索)
# 内部で「DWithin」を利用している
filter_backends = (DistanceToPointFilter,)
# フィルター対象カラム指定
distance_filter_field = 'geom'
# EPSG:4326時に設定
distance_filter_convert_meters = True
# ラインビュー
class LinesViewSet(viewsets.ModelViewSet):
queryset = Lines.objects.all()
serializer_class = LinesSerializer
# ページネーションの適用
pagination_class = Pagination
# ポリゴンビュー
class PolygonsViewSet(viewsets.ModelViewSet):
queryset = Polygons.objects.all()
serializer_class = PolygonsSerializer
# ページネーションの適用
pagination_class = Pagination
rest_framework_gis.filtersのDistanceToPointFilterを読み込み
# フィルター読み込み
from rest_framework_gis.filters import DistanceToPointFilter
フィルターの種類を設定
# フィルターの種類設定 (ポイントから範囲検索)
# 内部で「DWithin」を利用している
filter_backends = (DistanceToPointFilter,)
フィルター対象カラムを指定
# フィルター対象カラム指定
distance_filter_field = 'geom'
距離をEPSG:4326用に適用
# EPSG:4326時に設定
distance_filter_convert_meters = True
下記URLで確認
http://127.0.0.1:8000/api/points/?dist=10&point=139.7577071,35.6678306
GeoDjangoを手軽に始める環境を公開しています。
geodjango-starter
- 参考文献
Django
GeoDjango
Django REST framework GIS
GeoDjangoではじめる地理空間情報
Django Rest Framework GISで誰でも簡単RESTful Geo API