经纬度轮廓面积计算

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)
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,计算经纬度定义的区域的面积是可能的,但需要进行一些预处理和转换。 首先,我们需要将经纬度坐标转换为平面坐标系,例如使用UTM(通用横向墨卡托投影)。这是因为经纬度坐标是基于地球的曲面的,无法直接用于计算面积。 一种方法是使用MATLAB中的Mapping Toolbox。该工具箱提供了许多函数来处理地理空间数据。我们可以使用`geotransform`函数将经纬度坐标转换为平面坐标系。假设我们有一个经纬度点向量`lat`和`lon`,我们可以使用以下代码将其转换为平面坐标系: ``` utmstruct = defaultm('utm'); utmstruct.zone = 'auto'; utmstruct.geoid = wgs84Ellipsoid; % 使用WGS84椭球体 [x, y, zone] = mfwdtran(utmstruct, lat, lon); ``` 接下来,我们可以使用`polyarea`函数计算转换后的平面坐标系中多边形的面积。假设我们有一串顶点的平面坐标系向量`x`和`y`,我们可以使用以下代码计算面积: ``` area = polyarea(x, y); ``` 最后,如果要将面积单位转换为正确的单位(例如平方米或平方千米),我们需要根据转换后的计算地理坐标系确定的比例因子来进行缩放。比例因子可以通过`utmstruct`结构中的信息获得。 综上所述,要在MATLAB中计算经纬度定义的区域的面积,我们需要执行以下步骤: 1. 使用Mapping Toolbox将经纬度坐标转换为平面坐标系。 2. 使用`polyarea`函数计算平面坐标系中多边形的面积。 3. 根据转换后的计算地理坐标系确定的比例因子进行单位转换。 请注意,以上仅为思路和大致步骤,具体的实现可能因你的数据格式和需求而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值