Dalam dunia hari ini, ciri berasaskan lokasi semakin penting dalam aplikasi web. Penyepaduan data geografi boleh meningkatkan pengalaman pengguna dengan ketara, sama ada mencari rakan berdekatan, mencari perkhidmatan berdekatan atau mendayakan kandungan geotag.
Artikel ini akan meneroka cara menggunakan ORM Django untuk mencari pengguna berdekatan berdasarkan koordinat geografi mereka (latitud dan longitud) dan jejari tertentu.
Pertama, kami akan menentukan model Lokasi untuk menyimpan koordinat geografi setiap pengguna. Kami akan menggunakan model Pengguna terbina dalam Django untuk mengaitkan setiap lokasi dengan pengguna.
<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>
pengguna: Kunci asing yang menunjuk ke model Pengguna Django. Ini mewujudkan perhubungan di mana setiap pengguna boleh mempunyai satu atau lebih lokasi. latitud & longitud: Medan Medan Perpuluhan digunakan untuk menyimpan koordinat geografi dengan ketepatan sehingga enam tempat perpuluhan, yang mencukupi untuk kebanyakan aplikasi berasaskan lokasi.
Rumus Haversine ialah formula matematik yang digunakan secara meluas untuk mengira jarak sfera antara dua titik di permukaan Bumi, menggunakan latitud dan longitud. Formula ini amat berguna dalam navigasi, geofencing, analisis geospatial dan perkhidmatan berasaskan lokasi.
Berikut ialah fungsi yang menyepadukan formula Haversine ke dalam model Lokasi untuk mendapatkan pengguna dalam radius tertentu menggunakan Django ORM:
<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>
Kaedah ini menggunakan formula Haversine untuk mengira jarak dan menapis pengguna dalam radius tertentu.
Dengan kaedah get_users_within_radius
, mendapatkan pengguna berdekatan adalah mudah. Begini cara menggunakannya:
<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
dan center_longitude
dengan titik tengah yang diingini, seperti lokasi pengguna semasa. radius_km
kepada jejari carian yang diingini dalam kilometer. get_users_within_radius
untuk mendapatkan kejadian Lokasi dalam radius yang ditentukan. Melaksanakan carian geolokasi dalam Django ialah kemahiran berharga untuk pembangun yang bertujuan untuk mencipta perkhidmatan berasaskan lokasi. Dengan memahami formula Haversine, pembangun boleh membina carian berasaskan lokasi yang cekap.
Untuk kefungsian geografi yang lebih maju, teroka GeoDjango dan pangkalan data spatial.
Atas ialah kandungan terperinci Django: Cari Pengguna Berdekatan dengan Koordinat dan Jejari. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!