dayjournal memo

Total 975 articles!!

GeoDjango #007 – バウンディングボックスで空間検索

Yasunori Kirimoto's avatar

画像



バウンディングボックスで空間検索するメモ。



画像



/app/api/views.py

from rest_framework import viewsets
# ページネーション読み込み
from rest_framework_gis.pagination import GeoJsonPagination
# フィルター読み込み
from rest_framework_gis.filters import DistanceToPointFilter, InBBoxFilter
# シリアライザ読み込み
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
    # フィルターの種類設定 (バウンディングボックスで空間検索)
    # 内部で「contained」or「bboverlaps」を利用している
    filter_backends = (InBBoxFilter,)
    # フィルター対象カラム指定
    bbox_filter_field = 'geom'
    # オブジェクトが一部でも含まれた場合も取得
    bbox_filter_include_overlapping =  True


rest_framework_gis.filtersのInBBoxFilterを読み込み

# フィルター読み込み
from rest_framework_gis.filters import DistanceToPointFilter, InBBoxFilter

フィルターの種類を設定

# フィルターの種類設定 (バウンディングボックスで空間検索)
# 内部で「contained」or「bboverlaps」を利用している
filter_backends = (InBBoxFilter,)

フィルター対象カラムを指定

# フィルター対象カラム指定
bbox_filter_field = 'geom'

オブジェクトが一部でも含まれた場合も取得

# オブジェクトが一部でも含まれた場合も取得
bbox_filter_include_overlapping =  True


下記URLで確認

http://127.0.0.1:8000/api/polygons/?in_bbox=139.7669578,35.6892677,139.7672721,35.689427



GeoDjangoを手軽に始める環境を公開しています。
geodjango-starter



book

Q&A