From 58d456d3a702c4612ce0de7c50569ba7fe6363c0 Mon Sep 17 00:00:00 2001 From: fxxian Date: Sun, 3 Mar 2024 14:20:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20mosq=20=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=EF=BC=8C=E6=9B=B4=E6=96=B0=E8=AE=BE=E5=A4=87=20locati?= =?UTF-8?q?on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/counter/api/mobile/serializers.py | 13 ++------- apps/mosquito/tasks.py | 39 ++++++++++++++++++++++---- requirements.txt | 2 ++ 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/apps/counter/api/mobile/serializers.py b/apps/counter/api/mobile/serializers.py index 5cdd7fd..cf073e1 100644 --- a/apps/counter/api/mobile/serializers.py +++ b/apps/counter/api/mobile/serializers.py @@ -2,7 +2,6 @@ from typing import Optional from rest_framework import serializers from counter.models import DeviceCount, DeviceInfo from mosquito.models import DeviceInfo as MosquitoDeviceInfo -from geopy.geocoders import Nominatim class DeviceInfoMobileSerializer(serializers.ModelSerializer): @@ -25,7 +24,6 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer): super().__init__(*args, **kwargs) self.latest = None self.cur_device = None - self.geolocator = Nominatim(user_agent="geoapiExercises") def get_device_name(self, obj) -> Optional[str]: qs = MosquitoDeviceInfo.objects.filter(device_id=obj.device_id) @@ -45,12 +43,5 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer): return [lon, lat] return None - # TODO: 作为定时任务 - # def get_location(self, obj): - # if self.cur_device: - # lon, lat = [self.cur_device.longitude, self.cur_device.latitude] - # if lon and lat: - # location = self.geolocator.reverse("{},{}".format(lat, lon)) - # address = location.raw['address'] - # return address - # return None + def get_location(self, obj): + return obj.location diff --git a/apps/mosquito/tasks.py b/apps/mosquito/tasks.py index fa71bac..dcdda16 100644 --- a/apps/mosquito/tasks.py +++ b/apps/mosquito/tasks.py @@ -1,6 +1,7 @@ +import time as std_time import pytz +import requests from functools import reduce -# from collections import OrderedDict from datetime import datetime, time, timedelta from django.db.models import Max from celery import task @@ -144,14 +145,42 @@ def update_daily_statistic(): return _date_list +def get_location(lon: int, lat: int) -> str: + key = 'f9fc42eb1a45f311beeb832740f67b0f' + url = 'https://restapi.amap.com/v3/geocode/regeo?output=json&location={},{}&key={}'.format(lon, lat, key) + resp = requests.get(url) + if resp.status_code != 200: + return '' + data = resp.json() + if data['status'] == '1' and data['info'] == 'OK': + address = data['regeocode']['formatted_address'] + + # address == [] + if isinstance(address, list): + return '' + return address + else: + return '' + + @task() -def update_latest_statistic(): - pass +def update_mosql_device_location(): + """ + 更新 mosquito DeviceInfo 表 location 字段 + 高德逆地理编码配额:5000/天,并发30/秒 + """ + device_list = DeviceInfo.objects.all() + for device in device_list: + if device.longitude and device.latitude: + location = get_location(device.longitude, device.latitude) + std_time.sleep(0.1) + device.location = location + device.save() @task() def update_mosq_device_info(): - """ 更新mosquito的DeviceInfo表""" + """ 更新 mosquito DeviceInfo 表""" counter_devices = CounterDeviceInfor.objects.values_list('device_id', flat=True) mosq_devices = DeviceInfo.objects.values_list('device_id', flat=True) s1 = set(counter_devices) @@ -183,4 +212,4 @@ if __name__ == '__main__': # a, b = get_daily_statistic() # print(a, b) # update_mosq_device_info() - update_daily_statistic() + update_mosql_device_location() diff --git a/requirements.txt b/requirements.txt index 2307d50..78be267 100644 --- a/requirements.txt +++ b/requirements.txt @@ -26,3 +26,5 @@ six==1.11.0 sqlparse==0.3.0 vine==1.1.4 paho-mqtt==1.6.1 + +requests~=2.31.0 \ No newline at end of file