ホームページ > バックエンド開発 > Python チュートリアル > Django: 座標と半径を使用して近くのユーザーを見つける

Django: 座標と半径を使用して近くのユーザーを見つける

Susan Sarandon
リリース: 2025-01-07 20:17:41
オリジナル
201 人が閲覧しました

Django: Find Nearby Users with Coordinates and Radius

今日の世界では、Web アプリケーションにおける位置ベースの機能の重要性がますます高まっています。地理データを統合すると、近くの友達を見つけたり、近くのサービスを見つけたり、地理タグ付きコンテンツを有効にしたりするなど、ユーザー エクスペリエンスが大幅に向上します。

この記事では、Django の ORM を使用して、地理座標 (緯度と経度) と指定された半径に基づいて近くのユーザーを見つける方法を説明します。

まず、各ユーザーの地理座標を保存する位置モデルを定義します。 Django の組み込み User モデルを使用して、各場所をユーザーに関連付けます。

<code class="language-python">from django.db import models
from django.contrib.auth.models import User

class Location(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    latitude = models.DecimalField(max_digits=9, decimal_places=6, db_index=True)
    longitude = models.DecimalField(max_digits=9, decimal_places=6, db_index=True)

    def __str__(self):
        return str(self.user)</code>
ログイン後にコピー

user: Django User モデルを指す外部キー。これにより、各ユーザーが 1 つ以上の場所を持つことができる関係が確立されます。 緯度と経度: DecimalField フィールドは、地理座標を小数点以下 6 桁までの精度で保存するために使用されます。これは、ほとんどの位置ベースのアプリケーションには十分です。

Django に Haversine 式を実装する

ハバーシンの公式は、緯度と経度を使用して、地球表面上の 2 点間の球面距離を計算するために広く使用されている数式です。この式は、ナビゲーション、ジオフェンシング、地理空間分析、および位置ベースのサービスで特に役立ちます。

これは、Django ORM を使用して指定された半径内のユーザーを取得するために、Haversine 式を Location モデルに統合する関数です。

<code class="language-python">from django.db.models import F, Value
from django.db.models.functions import ACos, Cos, Radians, Sin

class Location(models.Model):
    # ... [字段如上] ...

    @classmethod
    def get_users_within_radius(cls, center_latitude, center_longitude, radius_km):
        # Haversine 公式计算距离
        distance_expression = (
            ACos(
                Sin(Radians(F('latitude'))) * Sin(Radians(Value(center_latitude))) +
                Cos(Radians(F('latitude'))) * Cos(Radians(Value(center_latitude))) *
                Cos(Radians(F('longitude')) - Radians(Value(center_longitude)))
            ) * 6371  # 地球半径(公里)
        )

        # 过滤指定半径内的用户
        users_within_radius = cls.objects.annotate(
            distance=distance_expression
        ).filter(
          distance__lte=radius_km
        ).select_related('user')

        return users_within_radius</code>
ログイン後にコピー

このメソッドは、Haversine 式を使用して距離を計算し、指定された半径内のユーザーをフィルターします。

指定した半径内にユーザーを取得します

get_users_within_radius メソッドを使用すると、近くのユーザーを簡単に取得できます。使用方法は次のとおりです:

<code class="language-python">from .models import Location

# 加德满都的纬度和经度
center_latitude = 27.707460
center_longitude = 85.312205

radius_km = 10     # 10 公里

nearby_location_points = Location.get_users_within_radius(
    center_latitude, center_longitude, radius_km
)
nearby_users = [
    location.user for location in nearby_location_points
]</code>
ログイン後にコピー

説明

  • 中心座標を定義します: center_latitudecenter_longitude を、現在のユーザーの位置など、目的の中心点に置き換えます。
  • 半径指定: radius_km を目的の検索半径にキロメートル単位で設定します。
  • 近くの場所を取得: get_users_within_radius を呼び出して、指定された半径内の Location インスタンスを取得します。
  • ユーザーの抽出: Location インスタンスを反復処理して、関連付けられた User オブジェクトを収集します。

Django での位置情報検索の実装は、位置ベースのサービスの作成を目指す開発者にとって貴重なスキルです。 Haversine の公式を理解することで、開発者は効率的な位置ベースの検索を構築できます。
より高度な地理機能については、GeoDjango と空間データベースを調べてください。

以上がDjango: 座標と半径を使用して近くのユーザーを見つけるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート