You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用PHP或MySQL计算多边形的平方米面积?解决MySQL中ST_Area计算结果异常并转换为平方米或平方千米

解决MySQL/PHP计算多边形平方米面积的问题

你遇到的核心问题是没有考虑坐标系统的单位——你输入的是经纬度(WGS84,EPSG:4326),属于地理坐标系(角度单位:度),而MySQL默认用ST_PolyFromText创建的是Geometry类型,计算的是平面上的平方度,这个数值没有实际物理面积意义,所以结果看起来完全不对。

下面给你两种靠谱的解决方案,以及原理说明:

方案一:用MySQL地理空间类型直接计算球面面积(推荐)

从MySQL 5.7.6开始,支持地理空间类型(Geography),只要你在创建几何对象时指定SRID为4326(WGS84的标准编码),ST_Area就会自动基于WGS84椭球计算球面面积,结果直接是平方米

修改你的查询语句如下:

SELECT ST_Area(ST_GeomFromText(
    'MULTIPOLYGON(((2.2498939 50.7500442,2.2500789 50.7500817,2.250089 50.7500838,2.2500375 50.7501895,2.2498874 50.7501631,2.2498701 50.7501374,2.2498939 50.7500442)))',
    4326 -- 指定SRID为WGS84
)) AS area_square_meters;

执行后得到的结果就是该多边形的实际平方米面积,除以1000000就能转换成平方千米。

方案二:转换到平面坐标系计算面积(兼容旧版MySQL)

如果你的MySQL版本低于5.7.6,不支持地理空间类型,可以先把经纬度转换成基于米的平面坐标系(比如UTM投影),再计算面积。

你的多边形位于经度2.25、纬度50.75,属于UTM 31N投影(EPSG编码:32631),用ST_Transform完成坐标转换后再计算面积:

SELECT ST_Area(ST_Transform(
    ST_GeomFromText(
        'MULTIPOLYGON(((2.2498939 50.7500442,2.2500789 50.7500817,2.250089 50.7500838,2.2500375 50.7501895,2.2498874 50.7501631,2.2498701 50.7501374,2.2498939 50.7500442)))',
        4326
    ),
    32631 -- 转换到UTM 31N坐标系(单位:米)
)) AS area_square_meters;

这个方法的结果也是平方米,精度和球面计算几乎一致,适合小范围的多边形。

方案三:用PHP计算面积

如果需要在PHP端处理,可以使用第三方地理空间库,比如phayes/geoPHP,步骤如下:

  1. 安装库:composer require phayes/geophp
  2. 编写代码转换坐标系并计算面积:
require_once 'vendor/autoload.php';

use geoPHP\geoPHP;

// 多边形WKT字符串
$wkt = 'MULTIPOLYGON(((2.2498939 50.7500442,2.2500789 50.7500817,2.250089 50.7500838,2.2500375 50.7501895,2.2498874 50.7501631,2.2498701 50.7501374,2.2498939 50.7500442)))';

// 加载WKT并转换到UTM 31N坐标系
$geom = geoPHP::load($wkt, 'wkt');
$utmGeom = $geom->transform('EPSG:4326', 'EPSG:32631');

// 获取平方米面积
$area = $utmGeom->area();
echo "多边形面积:{$area} 平方米";

补充说明

你之前得到的0.00000002145686295307314平方度,如果要手动转换的话,可以用近似公式:

1平方度 ≈ (111319.9米)² × cos(纬度)

代入你的纬度50.75°,cos(50.75)≈0.632,计算下来1平方度≈7.83×10⁹平方米,乘以你得到的平方度数值,结果和上面两种方案的结果一致,大概168平方米左右,符合小地块的实际面积。

内容的提问来源于stack exchange,提问作者Vince

火山引擎 最新活动