经纬度轮廓面积计算

import js2py
import pandas as pd
import numpy as np
from shapely.geometry import Polygon,Point


data_js = open(r'polygon_go.js', 'r', encoding='utf8').read()
data_js = js2py.eval_js(data_js)

def def_get_area_js(poly,data_js):
    '''
    计算poly的面积(单位:平方公里)
    :param :poly是一个polygon或者是一个字符串(wkt)
    :return :返回polygon的面积,若无polygon,默认为0
    '''
    try:
        shape = str(poly).replace(', ',',')
        shape = shape.replace('POLYGON ((','').replace('))','').replace(', ',',')
        k2 = shape.split(',')
        k3 = []
        for i in k2:
            print(i)
            i = i.replace(")","").replace("(","")
            lng_1 = float(i.split(' ')[0])
            lat_1 = float(i.split(' ')[1])
            k3.append([lng_1,lat_1])

        final = data_js(k3)
        poly_area = float(final)*0.000001
        return poly_area
    except:
#        print()
        return 0
   
data = pd.read_excel(')

id_area = []
for index,row in data.iterrows():
    # wkt = '108.3886230000002 22.73205900000006, 108.3749951436175 22.73057592190073...'
    wkt = row['轮廓坐标串']
    wkt = str(wkt).replace('POLYGON ((','').replace('))','').replace(', ',',').replace('\n',',')## 一般不需要用到
    shape = wkt.split(',')
    shape = np.array([i.split(' ') for i in shape])
    shape = shape.astype(np.float)
    poly = Polygon(shape)
    if poly.is_valid == True:
        pass
    else:
        poly = poly.buffer(0)

    area = def_get_area_js(poly,data_js)

用到的 js 文件代码

    function getArea(ring) {
        var sJ = 6378137;
        var Hq = 0.017453292519943295;

        var arr = [];
        for (var i = 0;i< ring.length; i++){
            var poi = {
                lng:ring[i][0],
                lat:ring[i][1]
            };
            arr[i] = poi;
        }

        ring = arr;

        var c = sJ *Hq , d = 0 , e = ring.length;

        if (3 > e) {
            return 0;
        }

        for (var g = 0; g < e - 1; g += 1){
            var h = ring[g], k = ring[g + 1];
            var u = h.lng * c * Math.cos(h.lat * Hq);
            var h = h.lat * c;
            var v = k.lng * c * Math.cos(k.lat *Hq);
            var d = d + (u * k.lat * c - v * h);
        }

        g = ring[g];
        ring = ring[0];
        e = g.lng * c * Math.cos(g.lat * Hq);
        g = g.lat * c;
        k = ring.lng * c * Math.cos(ring.lat * Hq);
        d += e * ring.lat * c - k * g;
        return 0.5*Math.abs(d)
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值