Python 多个多边形 删除大于某个给定面积的多边形

删除大于给定多边形的面积。该多边形为 
"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))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值