今日の世界では、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 桁までの精度で保存するために使用されます。これは、ほとんどの位置ベースのアプリケーションには十分です。
ハバーシンの公式は、緯度と経度を使用して、地球表面上の 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_latitude
と center_longitude
を、現在のユーザーの位置など、目的の中心点に置き換えます。 radius_km
を目的の検索半径にキロメートル単位で設定します。 get_users_within_radius
を呼び出して、指定された半径内の Location インスタンスを取得します。 Django での位置情報検索の実装は、位置ベースのサービスの作成を目指す開発者にとって貴重なスキルです。 Haversine の公式を理解することで、開発者は効率的な位置ベースの検索を構築できます。
より高度な地理機能については、GeoDjango と空間データベースを調べてください。
以上がDjango: 座標と半径を使用して近くのユーザーを見つけるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。