У меня есть приложение Django, которое должно фильтровать пользователей по местоположению (показывать пользователей, которые находятся на заданном расстоянии от зарегистрированного пользователя).
Прямо сейчас я могу записать координаты зарегистрированных пользователей latitude and longitude
, используя HTML5, и сохранить их в таблицу Location
в моем бэкэнде SQLite.
У меня есть списки GeoIP2 с city
и country
в папке в моем проекте, я не уверен, как я могу их использовать, но они кажутся хорошим вариантом, так как они принимают координаты lat
и lon
и генерируют местоположение.
Я знаю, что здесь есть несколько вариантов, например, получение значения point
из координат lat lon
, которое затем, возможно, сможет фильтровать по радиусу?И т.д., 5 км, 10 км, 15 км?
Я относительно новичок во всем этом, поэтому я прошу о чистом минимальном решении.
Я не хочу использовать PostGres, ГИСГеоДжанго.
Если у кого-то есть простое решение для этого с использованием Sqlite и, возможно, списков geoip2, я был бы очень признателен, если бы вы поделились им!
models.py
class Location(models.Model):
latitude = models.DecimalField(max_digits=19, decimal_places=16)
longitude = models.DecimalField(max_digits=19, decimal_places=16)
user = models.OneToOneField(User, on_delete=models.CASCADE, null=False, related_name='loc')
def __str__(self):
return f'{self.user}\'s location'
@login_required
def insert(request):
location = Location(latitude=request.POST['latitude'],
longitude=request.POST['longitude'], user = request.user)
location.save()
return JsonResponse({'message': 'success'})
def location_view(request):
queryset = User.objects.annotate(
radius_sqr=pow(models.F('loc__latitude') -
request.user.loc.latitude, 2) + pow(models.F('loc__longitude') -
request.user.loc.longitude, 2)
).filter(
radius_sqr__lte=pow(radius_km / 9, 2)
)
return django.shortcuts.render_to_response(request, context, 'connect/home.html')
Пример страницы page.html
{% for user in location %}
<h5><b>{{ user.first_name }} {{ user.last_name }}</b></h5>
{% endfor %}