查询REST API纬度和经度

时间:2017-04-05 18:51:44

标签: django-rest-framework

我希望我的用户查询两个slugs字段(纬度,经度)然后比较2个slug字段以找到半径1.5km内的最近距离并根据最近的安全屋显示api。 例如:当用户在查询中添加纬度,经度时,

         www.example.com/safeplace/?find=-37.8770,145.0442

这将显示距离1.5公里范围内最近的安全地点

这是我的功能

 def distance(lat1, long1, lat2, long2):
    R = 6371 # Earth Radius in Km
    dLat = math.radians(lat2 - lat1) # Convert Degrees 2 Radians
    dLong = math.radians(long2 - long1)
    lat1 = math.radians(lat1)
    lat2 = math.radians(lat2)
    a = math.sin(dLat/2) * math.sin(dLat/2) + math.sin(dLong/2) * 
    math.sin(dLong/2) * math.cos(lat1) * math.cos(lat2)
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
    d = R * c
    return d

这是我的模特

class Safeplace(models.Model):
    establishment = models.CharField(max_length=250)
    address = models.CharField(max_length=250)
    suburb = models.CharField(max_length=250)
    postcode = models.IntegerField()
    state = models.CharField(max_length=250)
    type = models.CharField(max_length=250)
    latitude = models.DecimalField(decimal_places=6,max_digits=10)
    longtitude =  models.DecimalField(decimal_places=6,max_digits=10)

有没有办法在我的数据库中运行for循环?我目前正在研究Django SQLite。在Views.py上,我如何用我的rest api url中的用户输入实现distance函数来找到最近的安全位置并显示为REST Api?

1 个答案:

答案 0 :(得分:1)

您需要在views.py中运行循环比较。这很难执行,但我会尝试逐步解释。

假设您正在使用该距离(lat,lng,lat2,lng2)并试图找到2km范围内的距离。

在views.py

import pandas as pd
class someapiview(ListAPIView):
    serializer_class = SafeplaceSerializer
### Now we are creating definition which sorts parameters lng and lat ###
    def get_queryset(self):
        queryset = Safeplace.Objects.all()
        lat = float(self.query_params.get('lag', None)
        lng = float(self.query_params.get('lng', None)
        ### Now, we are reading your api using pandas ###
        df = pd.read_json('yourapi') ## yourapi is a url to ur api
        obj = []
        for x in range(0, len(df)):
            latx = float(df['latitude'][x])
            lngx = float(df['longitude'][x])
            ### Calculating distance ###
            km = distance(lat, lng, latx, lngx)
            if km <= 2:
                obj.append(df['id'][x])
        ### Django auto generate primary key which usually calls id ###
        ### Now we are going to call those pk as a queryset ###
        return Safeplace.objects.filter(pk__in=obj)

我使用pandas来解决,如果你有大量数据,加载时间可能会很慢。但是,我认为这样做了。通常Geo Django提供了一个有效的系统来处理long和lat,但是我在Geo Django中不是很称职,所以我无法说出来。但我相信这是一个很好的工作。

更新:

您可以使用“www.yourapi.com/safeplace?lat=x&lng=y”进行查询

我相信你知道如何设置网址