2017-04-05 9 views
1

ユーザーは2つのスラッグフィールド(緯度、経度)を照会し、次に2つのスラッグフィールドを比較して1.5キロ以内の最寄り距離を見つけて、最も近いセーフティハウスに応じて表示します。たとえば :ユーザーが緯度、そのクエリ内の経度、REST APIの緯度と経度を照会

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

を追加するとき、これはここで1.5キロ

内の最も近いsafeplacesが表示されますが、私の関数である。ここ

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では、残りのapi urlのユーザー入力で距離関数を実装して、最も近い安全地点を見つけてREST APIとして表示する方法はありますか?

答えて

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) 

私はあなたが大量のデータを持っている場合は、ロード時間が遅くなるかもしれませんが、回避するためにパンダを使用。しかし、私はこれが仕事をすると思います。通常、Geo Djangoはlongとlatを処理する効率的なシステムを提供しますが、私はGeo Djangoをあまり有能ではありませんので、実際には分かりません。しかし、私はこれが良い仕事であると信じています。

UPDATE:あなたは "www.yourapi.com/safeplace?lat=x & LNG = Y" と

を照会することができます

私はあなたがyourapiは `WWWを意味するURL

+0

を設定する方法を知っていると信じて.yourapi.com/api/safeplace'? – Tushant