from shapely.geometry import Polygon,Point
|
import math
|
|
class ShapelyUtil:
|
|
def __init__(self, points:list):
|
#[[12146938.804545141,3106558.9023983314],[12147505.698887747,3106620.0104321464],[12147188.527927307,3108004.3420571982],[12146593.188072586,3107932.8914925163]]
|
self.points = points
|
#self.points = [[1,1],[1,5],[5,5],[5,0]]
|
self.polygon = Polygon(self.points)
|
|
def isInPolygon(self, lng: float, lat: float):
|
point = Point([lng,lat])
|
return self.polygon.contains(point)
|
|
def isInPolygon_(self, lng: float, lat: float):
|
point = Point([lng*100000,lat*100000])
|
return self.polygon.contains(point)
|
|
|
def angle(self, lat1:float, lon1:float, lat2:float, lon2:float):
|
# 将角度转为弧度
|
rad_lat1 = math.radians(lat1)
|
rad_lon1 = math.radians(lon1)
|
rad_lat2 = math.radians(lat2)
|
rad_lon2 = math.radians(lon2)
|
# 计算经纬度差值
|
dlon = rad_lon2 - rad_lon1
|
# haversine公式计算距离
|
a = math.sin((rad_lat1-rad_lat2)/2)**2 + \
|
math.cos(rad_lat1)*math.cos(rad_lat2)*math.sin((dlon)/2)**2
|
c = 2*math.asin(math.sqrt(a))
|
r = 6371 # 地球平均半径,单位为公里
|
dist_meters = c*r*1000 # 距离转换为米
|
# 计算方位角(相对于正北方向顺时针的角度)
|
y = math.sin(dlon) * math.cos(rad_lat2)
|
x = math.cos(rad_lat1)*math.sin(rad_lat2) - \
|
math.sin(rad_lat1)*math.cos(rad_lat2)*math.cos(dlon)
|
|
bearing_degrees = (math.degrees(math.atan2(y, x)) + 360) % 360
|
|
return bearing_degrees
|
|
|
|
|
if __name__ == '__main__':
|
geou = ShapelyUtil()
|
print(geou.isInPolygon_(122.46938804545141,31.065589023983314))
|
print(geou.isInPolygon_(121.46938804545141,32.065589023983314))
|
print(geou.isInPolygon_(121.46792784545,31.06938583314)) # 121.4679278,31.0693858
|
print(geou.isInPolygon(3,3)) # 121.4679278,31.0693858
|
print(geou.isInPolygon(5.1,5.1))
|
print(geou.isInPolygon(4.9,4.9))
|
# 示例:计算北京和上海之间的方位角
|
lat1, lon1 = 39.9, 116.4 # 北京的经纬度
|
lat2, lon2 = 31.23, 121.47 # 上海的经纬度
|
print(geou.angle(lat1, lon1, lat2, lon2)) # 输出结果,单位为度数
|
print(geou.angle(lat2, lon2, lat1, lon1)) # 输出结果,单位为度数
|