删除大于给定多边形的面积。该多边形为
"113.2392901,21.91638982;113.2737369,21.8931719;113.2514275,21.86066642;113.2097454,21.91896039;113.2392901,21.91638982"。格式为 lon1,lat1;lon2,lat2;...lonn,latn;
import numpy as np
import pandas as pd
import math
# 删除 大于 面积最大的泊位
def ConvertToRadian(input):
return input * math.pi / 180;
def CalculatePolygonArea0(data):
area = 0;
arr = data.split(';')
arr_len = len(arr)
if arr_len < 3:
return 0.0
temp = []
for i in range(0, arr_len):
temp.append([float(x) for x in arr[i].split(',')])
print(temp)
for i in range(0, arr_len):
area += ConvertToRadian(temp[(i + 1) % arr_len][0] - temp[(i) % arr_len][0]) * (2 + math.sin(ConvertToRadian(temp[(i) % arr_len][1])) + math.sin(ConvertToRadian(temp[(i + 1) % arr_len][1])));
area = area * 6378137.0 * 6378137.0 / 2.0;
return round(math.fabs(area),6);
def CalculatePolygonArea(data):
area = 0;
arr_len = len(data)
if arr_len < 3:
return 0.0
temp = []
for i in range(0, arr_len):
temp.append([ data[i][1],data[i][2]])
for i in range(0, arr_len):
area += ConvertToRadian(temp[(i + 1) % arr_len][0] - temp[(i) % arr_len][0]) * (2 + math.sin(ConvertToRadian(temp[(i) % arr_len][1])) + math.sin(ConvertToRadian(temp[(i + 1) % arr_len][1])));
area = area * 6378137.0 * 6378137.0 / 2.0;
return round(math.fabs(area),6);
def getMaxBerth():
data = "113.2392901,21.91638982;113.2737369,21.8931719;113.2514275,21.86066642;113.2097454,21.91896039;113.2392901,21.91638982"
return CalculatePolygonArea0(data)*2
def readCsvFile():
# 读取CSV文件,分组,在每个多边形后面添加该多边形第一个元素
df=pd.read_csv("data/ports_terminal.csv")
g=df.groupby(df["PolygenID"])
MaxArea=getMaxBerth()
df=pd.DataFrame([["Beihai01","109.551661","21.477153","False"]],columns=["PolygenID","lon","lat","flag"])
for name,group in g:
# 把DataFrame 变成列表
npPolyge = np.array(group).tolist()
# print(type(npPolyge))
# 每个多边形后面都需要加个,该多边形第一个经纬度坐标
npPolyge.append(npPolyge[0])
cArea=CalculatePolygonArea(npPolyge)
Flag=isDelete(cArea,MaxArea)
FlagList=[Flag for i in range(0,len(npPolyge))]
PolygenDataFrame=pd.DataFrame(npPolyge,columns=["PolygenID","lon","lat"])
PolygenDataFrame["flag"]=FlagList
# print(group)
df=pd.concat([df,PolygenDataFrame],axis=0,ignore_index=True)
# print(df)
# # 创建DataFrame
# df2 = pd.DataFrame.from_records(allgPortParamet)
df.to_csv('data/handle1.csv', index=True, header=True)
def isDelete(cArea,MaxArea):
'''
判断当前多边形是否删除
:param cArea:当前多边形面积
:param MaxArea:最大锚地面积
:return:
'''
# 如大于 最大面积,则标记为删除
if cArea > MaxArea:
return True
# 否则 标记为不删除
return False
if (__name__ == "__main__"):
# data = "115.989099,39.646023;115.987394,39.645988;115.987371,39.647407;115.986684,39.647423;115.986602,39.648088;115.989095,39.648151;115.989188,39.646021;
# 115.989099,39.646023"
readCsvFile()
# print(CalculatePolygonArea0(data))