我希望我的用户查询两个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?
答案 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”进行查询
我相信你知道如何设置网址