【问题标题】:PostGIS: Linestring lengthPostGIS:线串长度
【发布时间】:2019-09-27 20:12:42
【问题描述】:

我正在使用 PostGIS 来计算用户定义的线串的长度。该列定义为geography(LineString,4326)。 线串由这个 GeoJSON 表示:

"track": {
  "type": "LineString",
  "coordinates": [
    [
      49.364325571013,
      16.785549033597
    ],
    [
      49.363254969491,
      16.642149334451
    ]
  ]
}

SELECT ST_Length("geography") FROM table; 返回 15945.7486086962,但在 Google 地图上测量的长度约为 10 公里。

我做错了什么?如何测量长度以获得与谷歌地图相同的值?

【问题讨论】:

  • 嘿安德烈。您能否也展示一下您是如何使用谷歌地图获得 10 公里的长度的?

标签: postgresql google-maps postgis


【解决方案1】:

我相信这是切换x,y位置的经典问题。

考虑到x,y

SELECT 
    ST_Length(
      ST_GeogFromText('SRID=4326;LINESTRING(49.364325571013 16.785549033597,49.363254969491 16.642149334451)'),true);

    st_length     
------------------
 15869.9069442778

和“相同”的 LineString 切换到 y,x ..

SELECT 
   ST_Length(
     ST_GeogFromText('SRID=4326;LINESTRING(16.785549033597 49.364325571013,16.642149334451 49.363254969491)'),true)

    st_length     
------------------
 10416.8606521809

【讨论】:

    【解决方案2】:

    找出问题所在。

    我使用ST_GeomFromText('LINESTRING(lat lon, lat lon)') 来创建线路。正确的顺序是lon lat,所以是ST_GeomFromText('LINESTRING(lon lat, lon lat)')

    GeoJSON 使用相同的坐标顺序:49.363254969491 = 纬度,16.642149334451 = 经度。

    我没有意识到这一点的原因是因为我使用 Leaflet 来画线。我基本上是通过geoJSON.getLayers()[0].feature.geometry.coordinates 获得积分并将它们传递给折线对象。它通过将 GeoJSON 中的第一个坐标作为 Lat,将第二个坐标作为 Lng 创建了折线点。这样它第二次反转并正确渲染。

    所以在查询中切换 lon lat 后,我​​必须使用 L.GeoJSON.coordsToLatLngs() 函数来正确渲染线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多