【问题标题】:I tried all ways, but still my area is calculated wrongly in Postgis我尝试了所有方法,但我的面积仍然在 Postgis 中计算错误
【发布时间】:2014-05-14 07:33:59
【问题描述】:

我在德国中部创建了一个非常简单的多边形来演示我的问题。

您可以使用以下 GeoJSON 在 geojsonlint 中对其进行可视化

{"type":"Polygon","coordinates":[[
[10.439844131469727,51.17460781257472],
[10.430574417114258,51.1753073564544],
[10.429565906524658,51.17179607723465],
[10.438792705535889,51.170706315523866],
[10.439372062683105,51.17267055874809],
[10.43975830078125,51.17439256616884],
[10.439844131469727,51.17460781257472]]]G}

使用在线工具计算表面时(例如http://www.daftlogic.com/projects-google-maps-area-calculator-tool.htm,但我尝试了几个), 我得到以下数字(这些数字基于多边形的类似绘图,但不完全相同,因为我无法将其复制到这些工具中):

  • 276583.39 平方米
  • 0.28 平方公里
  • 68.35 英亩
  • 27.66 公顷
  • 2977118.86 英尺²
  • 0.08 平方海里

现在我想使用 POSTGIS 计算这些区域,但我总是会出错,而且数字不匹配。

首先我使用此处给出的示例不进行转换:

http://postgis.net/docs/ST_Area.html

 SELECT ST_Area(the_geom) As sqft, ST_Area(the_geom)*POWER(0.3048,2) As sqm
 FROM (SELECT ST_GeomFromText('
 POLYGON ((51.17460781257472  10.439844131469727,
 51.1753073564544 10.430574417114258, 
 51.17179607723465 10.429565906524658,
 51.170706315523866 10.438792705535889,
 51.17267055874809 0.439372062683105,
 51.17439256616884 10.43975830078125,
 51.17460781257472 10.439844131469727))',4326) ) As foo(the_geom);

--> sqft = 3.52643124351653e-05 和 sqm = 3.27616182873666e-06

如何解释这些数字? 然后我尝试将其转换为 WGS 84 / UTM zone 33N 32633

SELECT ST_Area(the_geom) As sqft, ST_Area(the_geom)*POWER(0.3048,2) As sqm
FROM (SELECT ST_Transform(ST_GeomFromText('
POLYGON ((51.174661624019286 10.440187454223633,
51.17067940750161 10.438899993896484,
51.17197097486416 10.429544448852539, 
51.17536116708255 10.430488586425781,
51.174661624019286 10.440187454223633))',4326),32633) ) As foo(the_geom);

--> sqft = 662918.939349234 和 sqm = 61587.1847391195

但即使是这些数字也不接近。

【问题讨论】:

  • 你应该再读一遍那个例子。它说它使用 sqft 只是因为它使用以英尺为单位的 SRID。你得到平方度数。

标签: postgis geojson wgs84


【解决方案1】:

多边形的坐标被意外加载为 lat,lon 而不是 lon, lat。

http://postgis.net/2013/08/18/tip_lon_lat

在空间数据库中,空间坐标是 x = 经度,y = 纬度

【讨论】:

    【解决方案2】:

    我将坐标转换为 EPSG:31467,请参阅 epsg:31467,它被投影到米并适用于您的几何图形所覆盖的德国区域。

    select st_area(st_transform(st_setsrid(st_geomfromtext('POLYGON((10.439844131469727    
      51.17460781257472,10.430574417114258 51.1753073564544,10.429565906524658
      51.17179607723465,10.438792705535889 51.170706315523866, 10.439372062683105 
      51.17267055874809, 10.43975830078125 51.17439256616884, 10.439844131469727 
      51.17460781257472))'),4326),31467));
    

    并得到答案:274442.27 m2,与您的原始答案相差 0.007%。

    在使用适合该区域的大地水准面的投影坐标系中,测量通常更准确。如果您在 Postgis 中对该投影的空间参考系统表运行此查询:

     select * from spatial_ref_sys where srid=31467;
    

    您会看到更多细节,例如它使用 Bessel 1841 椭球体。

    编辑:您的原始 geojson 在 x/y 中具有坐标,但由于某种原因,您在将它们放入 Postgis 时翻转了它们。

    【讨论】:

    • 哇!非常感谢你,约翰。我不知道我需要重新设置 SRID。
    • @user3633854 不客气——看看postgis.org/docs/ST_Transform.html。也欢迎来到 SO。如果这解决了您的问题,您是否可以考虑接受答案?它可以帮助其他人知道它是正确的,并为投入的时间表示赞赏:-)
    • 抱歉,我仍然有问题,我深入研究了这个问题,发现你翻转了 x/y 坐标。因此,我的问题的根源是我用纬度/经度存储了多边形,而不是用经度/纬度存储了多边形。感谢您指出正确的方向!
    • @user3633854。哦,是的,我在回答中翻了它们,忘了提。这是一个常见的问题,正如人们所说的纬度/经度,实际上它应该是经度/纬度。此外,你原来的 geojson 是正确的方式。
    • @user3633854。使用 UTM 进行区域测量也会不准确,因为 UTM 区域覆盖了如此大的区域,它们会受到高比例失真的影响。我建议的 SRS 31467 会给德国带来更好的结果。
    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2019-07-22
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多