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)) # 输出结果,单位为度数