Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import json
- from .isochrone import isochrone, bin_splitting
- from .isochrone.extra_time import extra_times_func
- from .ml import factors_sugar
- import logging
- import grequests
- from gevent import monkey,sleep
- from main_app.models import MapObject
- from main_app.models import Market
- from geopy.distance import vincenty
- from django.db.models import F
- import psycopg2
- def apps_amount_in_time_osrm(id,time1=360,time2=720,mode='foot',map_class='Жилые дома',field='flat_num'):
- instance = Market.objects.get(id=id)
- shop = (instance.lon,instance.lat)
- queryset = MapObject.objects.only('lat', 'lon', field).filter(map_class=map_class, is_deleted=False).annotate(
- column=F(field))
- urls = []
- apps = []
- apps_t1,apps_t2 = 0,0
- urls_add,apps_add = urls.append,apps.append
- for elem in queryset:
- url = 'http://178.62.250.186:5001/table/v1/{}/{};{}?sources=0'. \
- format(mode,','.join(map(str,(elem.lon,elem.lat))),','.join(map(str,shop)))
- urls_add(url)
- apps_add(elem.column)
- rs = (grequests.get(u) for u in urls)
- for ind, response in enumerate(grequests.map(rs)):
- try:
- content = response.content
- except AttributeError:
- continue
- elem = json.loads(content.decode())
- duration = elem['durations'][0][1]
- if duration is not None:
- if duration<time1:
- apps_t1+=apps[ind]
- if duration<time2:
- apps_t2+=apps[ind]
- return apps_t1,apps_t2
- def apps_amount_in_radius(id,r1=500,r2=1000,map_class='Жилые дома',field='flat_num'):
- instance = Market.objects.get(id=id)
- shop = (instance.lat,instance.lon)
- apps_r1,apps_r2 = 0,0
- queryset = MapObject.objects.only('lat','lon',field).filter(map_class=map_class, is_deleted=False).annotate(column=F(field))
- for elem in queryset:
- house,apps = (elem.lat,elem.lon),elem.column
- if vincenty(shop,house).m<=r1:
- apps_r1+=apps
- if vincenty(shop,house).m<=r2:
- apps_r2+=apps
- return apps_r1,apps_r2,instance.lat,instance.lon
- def save_geo_data(id):
- #osrm_t1, osrm_t2 = apps_amount_in_time_osrm(id)
- apps_r1, apps_r2, lat, lon = apps_amount_in_radius(id)
- #print(osrm_t1,osrm_t2,apps_r1,apps_r2)
- conn = psycopg2.connect("host=localhost dbname=postgres user=postgres password=1")
- cur = conn.cursor()
- data = {'rad_500':apps_r1,'rad_1000':apps_r2}
- query = "update main_app_market set geo_data={} where lat={} and lon={}".format(data,lat,lon)
- cur.execute(query)
- conn.commit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement