如何使用PHP或MySQL计算多边形的平方米面积?解决MySQL中ST_Area计算结果异常并转换为平方米或平方千米
你遇到的核心问题是没有考虑坐标系统的单位——你输入的是经纬度(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,步骤如下:
- 安装库:
composer require phayes/geophp - 编写代码转换坐标系并计算面积:
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




