Использование ответа JSON от стороннего API с Geodjango - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь создать способ сужать сообщения в приложении django по местоположению и радиусу. Я пытаюсь сделать это так:

  • Использование стороннего (OpenCage) API для преобразования местоположения в широты / долготы
  • Соберите ответ JSON, выберите наиболее правильный фильтр (первый ответ в США)
  • Используйте ответ lat & lng для фильтрации списков через ГИС

Я успешно подключился к API и получил ответ, однако мне приходится фильтровать ответ в моих шаблонах, а не в моих моделях. Я также нашел следующее, которое, по-видимому, является решением, необходимым для сужения результатов в радиусе:

from django.contrib.gis.geos import Point
from django.contrib.gis.measure import Distance  


lat = 52.5
lng = 1.0
radius = 10
point = Point(lng, lat)    
Place.objects.filter(location__distance_lt=(point, Distance(km=radius)))

Что мне нужно решить, и я надеюсь на вашу помощь, как мне

  1. фильтровать ответы API и получать от них только то, что мне нужно (страна компонентов, геометрия lat, геометрия lng)

  2. Соберите последние символы для использования в приведенном выше коде?

views.py

from posts import services


def search(request):
    queryset_list = posts.objects.order_by('id')
    if 'location' in request.GET:
        q = request.GET['location']
        locations_list = services.get_location(q)
        context = {
            'posts': queryset_list,
            'locations_list': locations_list
        }
    return render(request, 'posts/search.html', context)

services.py

import requests

def get_location(location):
    url = 'https://api.opencagedata.com/geocode/v1/json'
    params = {'q': location, 'key': '###', 'language': 'en', 'pretty': 1}
    r = requests.get(url, params=params)
    locations = r.json()
    return locations

1 Ответ

0 голосов
/ 23 мая 2019

Я думаю, вы можете попробовать вот так (на основе демонстрационного ответа JSON, предоставленного OpenCage):

import requests
from django.db.models import Q

def get_location(location):
    url = 'https://api.opencagedata.com/geocode/v1/json'
    params = {'q': location, 'key': '###', 'language': 'en', 'pretty': 1}
    r = requests.get(url, params=params)
    locations = r.json()
    filter_query = Q()
    radius = 10
    for item in locations.get('results', []):
         geo = item.get('geometry')
         lat = geo.get('lat')
         lng = geo.get('lng')
         point = Point(lng, lat)    
         filter_query |= Q(location__distance_lt=(point, Distance(km=radius)))
    return Place.objects.filter(filter_query)
...