123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- # -*- coding: utf-8 -*-
- #!/usr/bin/env python
- import calendar
- import datetime
- import math
- import numbers
- from django.conf import settings
- from pandas import date_range
- class CoordinateTrans(object):
- """
- 坐标系转换
- """
- def __init__(self, lng=0.0, lat=0.0):
- """
- :param lng: 经度
- :param lat: 维度
- """
- self._x_pi = 3.14159265358979324 * 3000.0 / 180.0
- self._lng = lng
- self._lat = lat
- def bd09_to_gcj02(self):
- """
- 百度坐标系到google坐标系的经纬度转换
- :return:
- """
- if self._lng == 0.0 or self._lat == 0.0:
- return self._lng, self._lat
- x = self._lng - 0.0065
- y = self._lat - 0.006
- z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * self._x_pi)
- theta = math.atan2(y, x) - 0.000003 * math.cos(x * self._x_pi)
- gg_lng = z * math.cos(theta)
- gg_lat = z * math.sin(theta)
- return [gg_lng, gg_lat]
- def gcj02_to_bd09(self):
- """
- 高德/谷歌 坐标系 转百度
- :return:
- """
- if self._lng == 0.0 or self._lat == 0.0:
- return self._lng, self._lat
- z = math.sqrt(self._lng * self._lng + self._lat * self._lat) + 0.00002 * math.sin(self._lat * self._x_pi)
- theta = math.atan2(self._lat, self._lng) + 0.000003 * math.cos(self._lng * self._x_pi)
- bd_lng = z * math.cos(theta) + 0.0065
- bd_lat = z * math.sin(theta) + 0.006
- return [bd_lng, bd_lat]
- def __call__(self, lng, lat, _type="b_to_g"):
- """
- :param lng:
- :param lat:
- :param _type: b_to_g 百度转高德 g_to_b 高德转百度
- :return:
- """
- self._lng = lng
- self._lat = lat
- if _type == "b_to_g":
- return self.bd09_to_gcj02()
- elif _type == "g_to_b":
- return self.gcj02_to_bd09()
- else:
- pass
- coordinateHandler = CoordinateTrans()
- class IntToHex(object):
- """
- 数字转换16进制字符串
- """
- def __init__(self):
- self._number = None
- def _add_trans_number(self, number):
- if isinstance(number, numbers.Integral):
- self._number = number
- elif isinstance(number, str) and number.isdigit():
- self._number = int(number)
- else:
- raise TypeError("type of number must in <Integral,str>")
- @staticmethod
- def _reverse_hex(h):
- if not len(h):
- return ""
- return h[-2:] + IntToHex._reverse_hex(h[:-2])
- def __call__(self, number, lens=4, reverse=False):
- """
- :param number: 带转换的数字
- :type number: int
- :param lens: 转换后的长度
- :type lens: int
- :param reverse: 是否高低位互换
- :type reverse: bool
- :return:
- :rtype: str
- """
- if not isinstance(lens, numbers.Integral):
- raise TypeError("type of lens must be Integral")
- self._add_trans_number(number)
- formatStr = "{:0>%sX}" % lens
- numberHex = formatStr.format(self._number)
- if reverse:
- return IntToHex._reverse_hex(numberHex)
- return numberHex
- int_to_hex = IntToHex()
- def get_start_and_end_by_month(monthStr):
- # type:(str) -> (str, str)
- """根据月份获取 当月月初和月末"""
- year, month = map(lambda x: int(x), monthStr.split("-"))
- firstWeekDay, lastDay = calendar.monthrange(year, month)
- startTime = datetime.date(year, month, 1).strftime("%Y-%m-%d")
- endTime = datetime.date(year, month, lastDay).strftime("%Y-%m-%d")
- return startTime, endTime
- def get_start_and_end_by_year(yearStr):
- """
- 获取年初 和年尾
- :param yearStr:
- :return:
- """
- return "{}-01-01".format(yearStr), "{}-12-31".format(yearStr)
- def get_date_range(st, et, freq='D', reverse = True):
- if reverse:
- return list(reversed(date_range(st, et, freq=freq).tolist()))
- else:
- return list(date_range(st, et, freq = freq).tolist())
- def get_test_point(domain, key):
- import os
- return os.environ.get('test_{}_{}'.format(domain, key), None)
- def support_test_point(point):
- if not settings.DEBUG:
- return False
- import os
- test_point = os.environ.get(point, None)
- if test_point == 'yes':
- return True
- else:
- return False
|