在SQL Server空间数据库中计算并解释导入ShapeFile的面积
在SQL Server中正确计算曲面面积的方法
首先得明确一个关键问题:你当前存储的GEOMETRY类型是基于平面坐标系的,而你用的SRID 4326是WGS84地理坐标系(球面),直接用GEOMETRY计算的面积是平面投影后的近似值,并非地球曲面上的真实面积。要得到准确的曲面面积,得切换到GEOGRAPHY类型来处理。
步骤1:把GEOMETRY数据转成GEOGRAPHY类型
SQL Server支持两种空间类型的转换,只要你的几何数据坐标符合WGS84的范围(经度[-180,180]、纬度[-90,90]),就能直接转换:
SELECT ID1, FID, geom, -- 转换为GEOGRAPHY类型,指定SRID为4326 CAST(geom AS GEOGRAPHY) AS geog FROM Demo1;
如果你的数据SRID不是4326,得先修正:
UPDATE Demo1 SET geom = geom.STSetSRID(4326) WHERE geom.STSrid <> 4326;
步骤2:计算曲面面积
GEOGRAPHY类型的STArea()方法会返回真实的曲面面积,单位是平方米。如果需要转换为平方公里等单位,直接做除法即可:
SELECT ID1, FID, -- 计算曲面面积(平方米) CAST(geom AS GEOGRAPHY).STArea() AS SurfaceArea_SqM, -- 转换为平方公里 CAST(geom AS GEOGRAPHY).STArea() / 1000000 AS SurfaceArea_SqKm FROM Demo1;
避坑提示
- 多边形顶点顺序:GEOGRAPHY要求北半球的多边形顶点按逆时针排列,否则可能会算出“整个地球减去该多边形”的面积。遇到这种情况,用
ReorientObject()修正:SELECT CAST(geom AS GEOGRAPHY).ReorientObject().STArea() AS CorrectedSurfaceArea_SqM FROM Demo1; - 复杂图形兼容:带孔洞的多边形等复杂地理图形,只要数据符合OGC规范,
STArea()都能正确计算。
优化方案:直接用GEOGRAPHY类型存储
如果后续频繁需要计算曲面面积,建议建表时直接用GEOGRAPHY类型,省去每次转换的麻烦:
CREATE TABLE [Demo1_Geog] ( [ID1] int IDENTITY(1,1) PRIMARY KEY CLUSTERED, [FID] bigint, [geog] GEOGRAPHY ); ALTER TABLE [Demo1_Geog] ADD CONSTRAINT [enforce_srid_geography_demo1] CHECK (geog.STSrid = 4326); -- 导入数据 INSERT INTO Demo1_Geog (FID, geog) SELECT FID, CAST(geom AS GEOGRAPHY) FROM Demo1;
内容的提问来源于stack exchange,提问作者Peter PitLock
相关产品推荐
相关产品推荐

