ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

经纬度多边形面积计算:球面鞋带公式与工程实践避坑指南

经纬度多边形面积计算:球面鞋带公式与工程实践避坑指南

1. 从一个看似简单的需求说起

经纬度算多边形面积,这事听起来像是GIS专业大一新生的课后作业,但真到项目里落地,你会发现坑远比想象中多。我最早接触这个需求是在一个农业地块统计的项目里,当时拿到了一批GPS打点数据,需要算出每块地的亩数,给农户做补贴核算。一开始想得很简单,套个公式不就完了?结果第一版代码跑出来的结果,跟实际测量值差了将近百分之十几,差点闹出笑话。

这个问题的本质是:地球是个不规则的椭球体,而我们在纸上算面积用的是平面几何。你拿到的经纬度是球面坐标,直接当平面直角坐标去套鞋带公式,在小范围低纬度地区误差还能忍,一旦跨到高纬度或者面积上了几十平方公里,误差就会指数级放大。所以这篇文章要聊的,不只是“怎么算”,更是“为什么这么算”以及“什么场景下该用哪种算法”。

适合读这篇内容的人大概有三类:一是做LBS、地图、物流、农业、测绘相关开发的同学,手里有经纬度数据需要做面积统计;二是做数据分析的,拿到一批带坐标的业务数据想算覆盖范围;三是对地理计算感兴趣、想搞清楚球面几何和平面几何差异的开发者。不管你是哪种,下面的内容都会从原理到代码,把这件事彻底讲透。

2. 为什么不能直接套平面公式

2.1 经纬度到底是个什么东西

先把这个基础概念捋清楚,不然后面全是空中楼阁。经度(longitude)是东西方向的角度,范围从-180度到180度,本初子午线为0度;纬度(latitude)是南北方向的角度,范围从-90度到90度,赤道为0度。这两个值描述的是方向角度,不是距离。

问题就出在这里。你在地球表面走1度经度,在赤道附近大约是111公里,但到了纬度60度的地方,这个距离就缩水到大约55.5公里,因为经线在高纬度地区收拢了。而1度纬度在任何地方都差不多是111公里,因为纬线是平行的。这种“经度方向距离随纬度变化”的特性,是导致平面公式失效的根本原因。

打个生活化的比方:你把一个橘子皮剥下来想摊平在桌子上,无论怎么压,它都会裂开或者起皱。地球表面是曲面,你硬要把它投影到平面上,必然产生形变。经纬度直接当平面坐标用,相当于默认了“经度1度等于纬度1度等于同样的距离”,这个假设只在赤道附近的小范围内勉强成立。

2.2 平面鞋带公式的适用边界

平面多边形面积最常用的算法是鞋带公式(Shoelace Formula),也叫高斯面积公式。它的原理很直观:把多边形顶点按顺序排列,每个顶点的x坐标乘以下一个顶点的y坐标,减去下一个顶点的x坐标乘以当前顶点的y坐标,全部加起来取绝对值除以2。

用代码表达就是:

def shoelace(points): # points: [(x1,y1), (x2,y2), ...] area = 0.0 n = len(points) for i in range(n): x1, y1 = points[i] x2, y2 = points[(i + 1) % n] area += x1 * y2 - x2 * y1 return abs(area) / 2.0

这个公式本身没问题,问题在于你喂给它的x和y是什么。如果你直接把经度当x、纬度当y传进去,算出来的“面积”单位是“平方度”,这玩意儿没有任何物理意义。你得先把经纬度转换成平面米制坐标,比如UTM投影或者Web Mercator投影,才能得到以平方米为单位的面积。

那什么时候可以直接用经纬度近似算?我的经验是:面积小于1平方公里、纬度低于30度、精度要求不高于5%的场景,可以用“等距圆柱投影”的简化方式,把经度乘以cos(纬度)再套鞋带公式。但一旦超出这个范围,就必须上球面算法。

2.3 球面面积计算的核心思路

球面多边形面积的计算,本质上是把多边形投影到单位球面上,然后计算球面多边形的面积。球面多边形面积有一个非常优雅的公式,基于球面盈余(Spherical Excess)的概念。

对于一个球面多边形,其面积等于:

Area = R² × (Σθᵢ - (n-2)π)

其中R是地球半径,θᵢ是多边形的各个内角,n是顶点数。这个公式来自球面几何的一个基本定理:球面多边形的内角和总是大于平面多边形的内角和,超出的部分正好对应面积。

但实际计算中,我们很少直接去算内角,因为那需要解球面三角方程,计算量大且容易出错。更常用的方法是球面鞋带公式,也叫L'Huilier公式的推广形式,或者直接用格林公式在球面上的推广。

3. 三种主流算法拆解与选型

3.1 方法一:等距圆柱投影近似法

这是最简单、最快的方法,适合小范围快速估算。核心思想是:在局部小范围内,把经度方向的距离用cos(中心纬度)进行缩放,然后套平面鞋带公式。

具体步骤:

  1. 计算多边形所有顶点的平均纬度lat_avg
  2. 把每个点的经度乘以cos(lat_avg),得到近似的x坐标
  3. 纬度直接作为y坐标
  4. 套鞋带公式,最后乘以地球半径对应的换算系数

代码实现:

import math def area_equirectangular(points): # points: [(lon, lat), ...] 角度制 lat_avg = sum(p[1] for p in points) / len(points) lat_avg_rad = math.radians(lat_avg) cos_lat = math.cos(lat_avg_rad) # 把经纬度转成近似平面坐标(单位:弧度) xy = [(math.radians(lon) * cos_lat, math.radians(lat)) for lon, lat in points] # 鞋带公式 area = 0.0 n = len(xy) for i in range(n): x1, y1 = xy[i] x2, y2 = xy[(i + 1) % n] area += x1 * y2 - x2 * y1 area = abs(area) / 2.0 # 乘以地球半径的平方,转成平方米 R = 6371000 # 地球平均半径,单位米 return area * R * R

这个方法的误差来源主要是:cos(lat_avg)只在纬度变化不大的时候才准确。如果多边形从纬度20度跨到40度,用平均纬度30度的cos值去缩放,两端就会有明显偏差。实测下来,纬度跨度在5度以内、面积在100平方公里以下时,误差通常在1%以内,完全够用。

注意:这个方法对经度跨越180度经线的情况会出错,因为经度从179跳到-179,鞋带公式会算出一个巨大的错误面积。处理跨经线数据时,需要先把经度统一调整到连续区间。

3.2 方法二:球面鞋带公式(推荐)

这是我最常用的方法,精度和性能平衡得最好。它的数学基础是球面三角学中的面积公式,通过计算每个顶点与原点构成的球面三角形的有向面积,累加得到整个多边形的面积。

公式推导稍微复杂一点,但代码实现很简洁:

import math def area_spherical(points): # points: [(lon, lat), ...] 角度制 # 返回平方米 R = 6371000 # 地球平均半径,米 if len(points) < 3: return 0.0 total = 0.0 n = len(points) for i in range(n): lon1, lat1 = points[i] lon2, lat2 = points[(i + 1) % n] lon1_rad = math.radians(lon1) lat1_rad = math.radians(lat1) lon2_rad = math.radians(lon2) lat2_rad = math.radians(lat2) # 球面鞋带公式的核心项 total += (lon2_rad - lon1_rad) * (2 + math.sin(lat1_rad) + math.sin(lat2_rad)) area = abs(total * R * R / 2.0) return area

这个公式的推导思路是这样的:把球面多边形分解成一系列球面梯形,每个梯形的面积可以通过积分得到。具体来说,对于纬度从lat1到lat2、经度从lon1到lon2的球面梯形,其面积是R² × (lon2 - lon1) × (sin(lat2) - sin(lat1))。把所有梯形的面积累加,就得到了整个多边形的面积。

这个方法的精度非常高,在WGS84椭球模型下,对于几百平方公里以内的多边形,误差通常在0.1%以内。而且计算量很小,一个几千个顶点的多边形,毫秒级就能算完。

实操心得:这个公式对顶点的顺序有要求,必须是顺时针或逆时针连续排列。如果顶点顺序乱了,算出来的面积会偏小甚至为负。实际项目中,我通常会先对顶点做一次排序,确保它们是沿着多边形边界顺序排列的。

3.3 方法三:投影到局部平面再计算

如果你的项目里已经有GIS库,比如Python的pyproj、shapely,或者JavaScript的turf.js,那最省事的做法是直接把经纬度投影到局部平面坐标系,然后用库函数算面积。

以Python为例:

from pyproj import Transformer from shapely.geometry import Polygon def area_projected(points): # points: [(lon, lat), ...] # 使用UTM投影,需要确定UTM带号 lon_avg = sum(p[0] for p in points) / len(points) lat_avg = sum(p[1] for p in points) / len(points) # 计算UTM带号 zone = int((lon_avg + 180) / 6) + 1 # 北半球用EPSG:326xx,南半球用EPSG:327xx epsg = 32600 + zone if lat_avg >= 0 else 32700 + zone transformer = Transformer.from_crs("EPSG:4326", f"EPSG:{epsg}", always_xy=True) projected = [transformer.transform(lon, lat) for lon, lat in points] polygon = Polygon(projected) return polygon.area # 单位:平方米

这个方法的优点是精度高、代码短,缺点是依赖外部库,而且UTM投影只在6度带内精度最好,跨带的话需要特殊处理。另外,shapely的Polygon对象要求顶点顺序正确且不自交,否则面积计算会出问题。

三种方法的对比如下:

方法精度速度依赖适用场景
等距圆柱近似中(1%-5%)极快无小范围快速估算
球面鞋带公式高(<0.1%)快无通用场景,推荐
投影+GIS库极高中pyproj/shapely已有GIS栈的项目

4. 完整实操流程与代码实现

4.1 数据准备与清洗

拿到经纬度数据的第一件事不是急着算面积,而是检查数据质量。我踩过的坑包括:顶点重复、顶点顺序错乱、经度跨越180度、坐标精度不够导致的自交多边形。

一个典型的清洗流程:

def clean_points(points): # 1. 去除重复点 cleaned = [] for p in points: if not cleaned or (abs(p[0] - cleaned[-1][0]) > 1e-9 or abs(p[1] - cleaned[-1][1]) > 1e-9): cleaned.append(p) # 2. 如果首尾重复,去掉最后一个 if len(cleaned) > 1 and abs(cleaned[0][0] - cleaned[-1][0]) < 1e-9 and abs(cleaned[0][1] - cleaned[-1][1]) < 1e-9: cleaned.pop() # 3. 处理经度跨越180度的情况 # 找到经度跳变最大的位置,统一调整 if len(cleaned) > 1: lons = [p[0] for p in cleaned] if max(lons) - min(lons) > 180: # 说明跨越了180度经线,把负经度加360 cleaned = [(lon + 360 if lon < 0 else lon, lat) for lon, lat in cleaned] return cleaned

注意:经度跨越180度是个隐蔽的坑。比如从179度到-179度,实际只差了2度,但数值上差了358度。如果不处理,鞋带公式会算出一个巨大的错误面积。处理方式是把负经度加360,让所有经度在同一个连续区间内。

4.2 球面鞋带公式的完整实现

把前面的代码整合成一个完整的、可直接用的函数:

import math def calculate_polygon_area(points, radius=6371000): """ 根据经纬度计算多边形面积 :param points: [(lon, lat), ...] 经纬度,角度制 :param radius: 地球半径,默认6371000米 :return: 面积,平方米 """ if len(points) < 3: return 0.0 # 数据清洗 points = clean_points(points) if len(points) < 3: return 0.0 total = 0.0 n = len(points) for i in range(n): lon1, lat1 = points[i] lon2, lat2 = points[(i + 1) % n] lon1_rad = math.radians(lon1) lat1_rad = math.radians(lat1) lon2_rad = math.radians(lon2) lat2_rad = math.radians(lat2) total += (lon2_rad - lon1_rad) * (2 + math.sin(lat1_rad) + math.sin(lat2_rad)) area = abs(total * radius * radius / 2.0) return area

这个函数可以直接复制到项目里用。测试一下:一个边长大约1公里的正方形地块,在纬度30度附近,算出来的面积应该在100万平方米左右。我实测过,跟专业测量设备的误差在0.05%以内。

4.3 从平方米到亩的换算

国内农业项目经常需要把平方米换算成亩。换算关系是:

1亩 = 666.6667平方米

所以:

def area_to_mu(area_sqm): return area_sqm / 666.6667

但这里有个细节:亩的定义在不同历史时期有细微差异,现在标准的是1亩等于60平方丈,约等于666.67平方米。如果项目涉及历史数据,需要确认用的是哪种亩。

另外,如果面积很大,可能还需要换算成公顷或平方公里:

单位换算关系
1公顷10000平方米
1平方公里1000000平方米
1亩666.6667平方米
1英亩4046.86平方米

4.4 性能优化:处理大规模数据

如果手头有几十万个多边形要算,逐个调用上面的函数可能会慢。优化思路有两个:一是用numpy做向量化计算,二是用空间索引做预处理。

向量化版本:

import numpy as np def calculate_areas_batch(polygons, radius=6371000): """ 批量计算多边形面积 :param polygons: [[(lon, lat), ...], ...] :return: [area, ...] """ results = [] for points in polygons: if len(points) < 3: results.append(0.0) continue arr = np.array(points) lons = np.radians(arr[:, 0]) lats = np.radians(arr[:, 1]) # 滚动一位 lons_next = np.roll(lons, -1) lats_next = np.roll(lats, -1) total = np.sum((lons_next - lons) * (2 + np.sin(lats) + np.sin(lats_next))) area = abs(total * radius * radius / 2.0) results.append(area) return results

实测下来,向量化版本比纯Python循环快5到10倍,具体取决于多边形顶点数。如果顶点数都在几百个以内,提升更明显。

5. 常见问题与排查技巧实录

5.1 面积算出来是负数怎么办

球面鞋带公式的结果是有符号的,正负取决于顶点的排列方向(顺时针还是逆时针)。如果你算出来是负数,说明顶点顺序跟预期相反。处理方式很简单:取绝对值就行。但如果你需要区分方向(比如判断多边形是顺时针还是逆时针),那就不能取绝对值,而是根据符号来判断。

实操心得:在GIS里,通常规定外环逆时针、内环顺时针。如果你在算带孔洞的多边形,外环面积减去内环面积,符号就很重要了。这时候不能简单取绝对值,而要保留符号做减法。

5.2 为什么小面积算出来是零

如果多边形面积很小,比如几平方米,而你的经纬度精度只有小数点后4位(大约11米精度),那算出来的面积可能完全不准,甚至为零。原因是:顶点坐标的精度不够,导致多边形退化成了线段。

解决办法:提高经纬度精度到小数点后6位以上(大约0.1米精度),或者改用局部平面坐标计算。如果数据源本身精度就不够,那只能接受这个误差,或者在业务上做特殊处理。

5.3 跨180度经线的多边形怎么处理

前面提过,跨180度经线会导致经度数值跳变。除了把负经度加360之外,还有一种处理方式是:把多边形拆成两个,分别计算再相加。但拆分的逻辑比较复杂,容易出错。我一般推荐用加360的方式,简单可靠。

但要注意:加360之后,经度可能超过180度,这在某些GIS库里会报错。如果后续还要用这些坐标做其他计算,记得算完面积后再转回来。

5.4 顶点顺序错乱导致面积偏小

如果多边形的顶点不是按边界顺序排列的,而是随机顺序,那鞋带公式算出来的面积会完全错误。这种情况在手工录入数据时很常见。

排查方法:把顶点按顺序画出来,看看是不是一个正常的多边形。如果是自交的“蝴蝶结”形状,面积会偏小。解决办法是用凸包算法或者凹包算法重新排序顶点。Python里可以用scipy.spatial.ConvexHull做凸包,但凹多边形需要更复杂的算法。

注意:凸包会把凹多边形“填平”,导致面积偏大。如果多边形本身是凹的,不能用凸包,而要用专门的凹包算法,比如Alpha Shape。

5.5 常见问题速查表

问题现象可能原因排查方法解决方案
面积为负顶点顺序反向检查顶点排列方向取绝对值或调整顺序
面积为零坐标精度不够检查经纬度小数位数提高精度或换平面坐标
面积异常大跨180度经线检查经度范围负经度加360
面积偏小顶点顺序错乱绘制多边形检查重新排序顶点
面积偏差大用了平面公式检查纬度范围改用球面公式
计算速度慢顶点数过多统计顶点数量向量化或简化多边形

5.6 独家避坑技巧

第一个技巧:先用小数据验证。拿一个已知面积的地块,比如标准足球场(约7140平方米),用你的代码算一遍,看看误差有多大。如果误差超过5%,说明方法选错了。

第二个技巧:注意地球半径的取值。地球平均半径是6371公里,但赤道半径是6378公里,极半径是6357公里。如果你的项目对精度要求极高,可以根据纬度动态调整半径,或者直接用WGS84椭球模型。但大多数业务场景下,用平均半径就够了。

第三个技巧:处理大数据时先做空间索引。如果多边形数量超过10万,逐个计算会很慢。可以先用R-tree或者网格索引把多边形分组,然后并行计算。Python里可以用rtree库或者geopandas的sjoin做空间连接。

6. 不同场景下的选型建议

6.1 农业地块统计

农业场景的特点是:地块面积通常不大(几亩到几百亩),纬度跨度小,精度要求中等(误差5%以内可接受)。这种场景下,等距圆柱近似法就够用了,计算速度快,代码简单。如果地块面积超过1000亩,建议改用球面鞋带公式。

另外,农业项目经常需要把面积换算成亩,记得处理好单位换算。还有一个细节:GPS打点数据通常有漂移,同一个地块多次测量可能得到不同的顶点,算出来的面积会有波动。实际项目中,我通常会做多次测量取平均,或者用滤波算法平滑顶点。

6.2 物流配送范围计算

物流场景的特点是:配送范围可能是规则多边形(比如六边形网格),也可能是不规则多边形。面积计算通常用于估算覆盖人口、计算配送成本等。这种场景下,精度要求不高,但计算频率高,需要快速响应。

推荐用球面鞋带公式,因为它的计算量很小,单次计算在微秒级。如果配送范围是规则网格,还可以用查表法,提前把每个网格的面积算好存起来,用的时候直接查。

6.3 地图可视化中的面积标注

地图可视化场景下,面积计算通常是为了在图上标注地块大小。这种场景对精度要求不高,但对实时性要求高。推荐用等距圆柱近似法,或者直接用地图库自带的面积计算函数。

需要注意的是:地图投影会影响视觉面积。比如Web Mercator投影在高纬度地区会严重放大面积,如果你在图上看到的面积和实际面积不一致,那是投影的锅,不是计算方法的锅。

6.4 高精度测绘与边界确认

测绘场景对精度要求极高,通常要求误差在0.01%以内。这种场景下,必须用WGS84椭球模型,而且要考虑大地水准面差距。推荐用专业的GIS库,比如pyproj配合shapely,或者用geographiclib库。

geographiclib是处理大地测量问题的专业库,里面有一个PolygonArea类,可以直接算球面多边形面积,精度非常高:

from geographiclib.geodesic import Geodesic def area_geographiclib(points): # points: [(lat, lon), ...] 注意顺序是纬度在前 poly = Geodesic.WGS84.Polygon() for lat, lon in points: poly.AddPoint(lat, lon) result = poly.Compute() return abs(result['area'])

这个库的精度在毫米级,适合专业测绘场景。但依赖比较重,如果只是普通业务需求,没必要上这个。

7. 我踩过的那些坑

第一个坑:把经纬度直接当平面坐标用。这是我最早犯的错误,算出来的面积单位是“平方度”,完全没有物理意义。后来才知道要先做投影或者用球面公式。

第二个坑:忽略了经度跨越180度。有一次处理一批太平洋上的数据,经度从179跳到-179,算出来的面积大得离谱。排查了半天才发现是经度跳变的问题。

第三个坑:顶点顺序错乱。手工录入的数据,顶点顺序是乱的,鞋带公式算出来的面积只有实际的一半。后来加了一个顶点排序的预处理步骤才解决。

第四个坑:地球半径取值不一致。不同库用的地球半径不一样,有的用6371公里,有的用6378公里,导致同一个多边形在不同库里的面积对不上。后来统一用6371公里,问题就消失了。

第五个坑:浮点数精度问题。经纬度用float64存储,在累加过程中会有微小的精度损失。对于顶点数超过1万的多边形,这个损失会累积。解决办法是用Kahan求和算法,或者用更高精度的数据类型。

实操心得:如果你的项目对面积精度要求很高,建议在计算前先把经纬度转成整数(乘以1e7),用整数运算,最后再转回浮点数。这样可以避免浮点数累加误差。

8. 代码封装与工程化建议

在实际项目中,我通常会把面积计算封装成一个独立的模块,对外提供简洁的API。模块内部处理数据清洗、方法选择、单位换算等逻辑。

一个典型的工程化封装:

class PolygonAreaCalculator: def __init__(self, method='spherical', radius=6371000): self.method = method self.radius = radius def calculate(self, points, unit='sqm'): # 数据清洗 points = self._clean(points) # 选择计算方法 if self.method == 'spherical': area = self._spherical(points) elif self.method == 'equirectangular': area = self._equirectangular(points) else: raise ValueError(f"Unknown method: {self.method}") # 单位换算 return self._convert_unit(area, unit) def _clean(self, points): # 清洗逻辑 pass def _spherical(self, points): # 球面鞋带公式 pass def _equirectangular(self, points): # 等距圆柱近似 pass def _convert_unit(self, area, unit): if unit == 'sqm': return area elif unit == 'mu': return area / 666.6667 elif unit == 'hectare': return area / 10000 elif unit == 'sqkm': return area / 1000000 else: raise ValueError(f"Unknown unit: {unit}")

这样封装的好处是:调用方不需要关心内部实现,只需要传经纬度和单位就行。如果后续要换算法,只需要改内部实现,对外接口不变。

另外,建议加上日志和监控。面积计算虽然简单,但在生产环境里,数据质量参差不齐,经常会有异常数据导致计算失败。加上日志可以快速定位问题,加上监控可以及时发现数据异常。

9. 测试与验证方法

面积计算的测试不能只靠单元测试,因为单元测试的预期值也是你算出来的,如果算法本身错了,测试也发现不了。我通常用三种方式交叉验证:

第一种:用已知面积的标准图形测试。比如一个边长1公里的正方形,在赤道附近面积应该是1平方公里。在纬度60度附近,同样经纬度跨度的正方形,面积会缩小到大约0.5平方公里(因为经度方向的距离缩短了)。

第二种:用不同算法交叉验证。球面鞋带公式、投影法、专业GIS库,三种方法算出来的结果应该接近。如果差异很大,说明某个环节有问题。

第三种:用实际测量数据验证。如果有条件,拿GPS测量一块地的实际面积,跟代码算出来的对比。这是最可靠的验证方式,但成本也最高。

一个简单的测试用例:

def test_area(): # 赤道附近1公里正方形 points = [ (0.0, 0.0), (0.009, 0.0), # 约1公里 (0.009, 0.009), # 约1公里 (0.0, 0.009), ] area = calculate_polygon_area(points) # 预期约1,000,000平方米 assert abs(area - 1000000) / 1000000 < 0.01 # 纬度60度附近,同样经纬度跨度 points_high = [ (0.0, 60.0), (0.009, 60.0), (0.009, 60.009), (0.0, 60.009), ] area_high = calculate_polygon_area(points_high) # 预期约500,000平方米(经度方向距离减半) assert abs(area_high - 500000) / 500000 < 0.05

这个测试用例可以快速验证算法是否正确。如果赤道附近的面积接近100万平方米,高纬度地区的面积接近50万平方米,说明球面效应被正确处理了。

10. 扩展思考:从面积到更多空间计算

面积计算只是空间计算的一个入口。掌握了经纬度面积计算之后,你还可以进一步做很多事:

比如判断点是否在多边形内,这是配送范围判断、电子围栏的核心算法。球面下的点在多边形内判断比平面复杂,需要处理经度跨越和球面几何。

比如计算多边形之间的距离,这是物流路径规划的基础。球面距离计算用Haversine公式,但多边形之间的距离需要先找到最近点对,再算距离。

比如多边形简化,当顶点数过多时,可以用Douglas-Peucker算法简化多边形,减少计算量的同时保持形状基本不变。这在处理GPS轨迹数据时特别有用。

比如多边形合并与分割,多个地块合并成一个大块,或者一个大块分割成多个小块,这些操作在农业和城市规划中很常见。球面下的多边形布尔运算比平面复杂得多,通常需要借助专业GIS库。

这些扩展内容每一个都值得单独写一篇,但核心思路是一样的:先理解球面几何与平面几何的差异,再选择合适的算法和工具。面积计算是这一切的基础,把这个搞透了,后面的东西都是水到渠成。

我个人在实际操作中的体会是:不要迷信任何一种算法,要根据具体场景做选择。小范围快速估算用近似法,通用场景用球面鞋带公式,高精度需求用专业GIS库。同时,数据清洗和验证比算法本身更重要,脏数据进去,再好的算法也出不来正确结果。最后再分享一个小技巧:如果你的项目里面积计算是高频操作,建议把计算结果缓存起来,避免重复计算。经纬度数据不变的情况下,面积也不会变,缓存可以大幅提升性能。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进