ぷろぐら×でざいん

GeoDjangoの距離検索

GeoDjangoの距離検索

GeoDjangoの距離検索

ご無沙汰です

数ヶ月ぶりの投稿になります。本職が忙しく全く更新ができておりませんでしたが、年末ということもあり、可能な限り毎日今年の学びを投稿できればと思っております。それはコード的な話もそうですがスタートアップでのチームビルディングの話など書ければと思います。

Django Gisでの距離検索

仕事でかなりハマったので備忘録のために書いていこうと思います。

Model

ある地点の緯度・経度から半径N kmの距離の中にあるPlaceを取得するロジックになっています。


# -*- coding: utf-8 -*-
from django.db import models
from django.contrib.gis.db import models as gis
from django.contrib.gis.geos import GEOSGeometry


class Place(models.Model):
    class Meta:
        db_table = 'places'

    name = models.CharField('場所', max_length=255)
    point = gis.GeometryField(spatial_index=True, srid=4326)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)



    @classmethod
    def filter_by_location(cls, longitude, latitude, radius):
        query = cls.objects
        p = f'POINT({longitude} {latitude})'
        return query.filter(
            point__distance_lte=(
                GEOSGeometry(p),
                float(radius) / 110.57)
        )


第一のポイント

point__distance__lteとすることである地点からの半径の中にあるPlaceが取得できます。
point_distance__gteでは逆にある地点からの半径の外にあるPlaceを取得できます。

第二のポイント

radiusにはkmを引数と渡すのですが、110.57で割る処理を加えています。色々と調べたのですが、point_distanceでの数値はdegreeで計算されるので、kmをdegreeに変換する必要があります。

あとがき

行く年来る年ですねぇー。師走ですね!
今年ももう終わり、来年は怒涛の東京オリンピックと思うと時の流れの早さをしみじみと感じます。急に寒さが強まっているので皆様もどうぞご自愛ください。また呼んでくださいー。

参照

http://www.longitudestore.com/how-big-is-one-gps-degree.html
https://docs.djangoproject.com/en/2.2/ref/contrib/gis/tutorial/

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください