【问题标题】:using the buffer and transforming projection, PostGIS使用缓冲区和变换投影,PostGIS
【发布时间】:2020-04-22 23:28:32
【问题描述】:

我正在创建一个缓冲区并尝试将我的 SRID 转换为 geog,然后再转换回原始投影和 geom。 我的点层有我的 WKT 约定:

POINT (-73.73891083685496 40.59593727361931)

CREATE TABLE intrsct_buff AS ( 
  SELECT
    ST_Transform(ST_Buffer(ST_Transform(pt.geom,2263), 60),4326) as geom, pt.count
  FROM public.intrsct_pts as pt
);

但是当我使用这段代码时,我的新缓冲表有这个 WKT:

POLYGON ((-77.51963927750339 40.11249512168173..

我是否为地理使用了错误的 SRID? WGS84 = 4326。它需要的投影是 2263,因为这是我的点表和数据库中所有其他表的 SRID。

【问题讨论】:

    标签: sql geospatial postgis wkt


    【解决方案1】:

    对于这种情况,请拿一张纸和一支笔,写下您需要(输入)和您期望(输出)的每个步骤。

    几乎每一个假设都有一个错误。

    1) GeographyGeometry 不同。虽然两者都使用 WGS84 4326 CRS,但前者以米为单位,而后者以度为单位。前者使用大圆弧,而后者使用直线连接两点(距离计算,相交等在大距离上影响很大)

    2) 您说您的数据在 CRS 2263(纽约长岛 (ftUS))中,具有以下界限:

    WGS84 边界:-74.2700、40.4700、-71.7500、41.3100
    预计范围:909126.0155、110626.2880、1610215.3590、424498.0529

    您显示的坐标不在此 CRS 中,但更有可能在 WGS84 中。

    让我们验证这个假设:如果我们(错误地)假设您提供的坐标是 2263,如果我们将它们投影到 4326 会发生什么?

    select st_asText(st_transform(st_geomFromEWKT('SRID=2263;POINT (-73.73891083685496 40.59593727361931)'),4326));
                    st_astext
    ------------------------------------------
     POINT(-77.5198536012811 40.112488506058)
    

    Bingo,这就是你得到的结果。
    ==> 首先,要么修复你正在使用的 CRS,要么修复坐标。其中一个是错误的。

    但即使您确实有正确的 CRS,查询也不会按预期工作。

    您说您想要 1) 将点更改为地理,2) 将其缓冲 60 米,3) 转换回原始 CRS。

    您所做的是 1) 将点更改为 2263(它已经在 CRS 中,它没有效果)2) 缓冲 60 英尺 3) 转换为 WGS84(几何)

    为了实现你所描述的,宁愿是:

    SELECT ST_Transform(
         ST_Buffer(
          ST_Transform(pt.geom,4326)::geography, -- change to 4326 and cast to geography
          60), -- buffer 60 meters
        2263) as geom -- change back to original CRS
    

    【讨论】:

    • 我尝试了这个解决方案,但我在第一次转换时收到错误,说错误:函数 st_transform(geography, integer) 不存在。 CREATE TABLE intrsct_buff AS ( SELECT ST_Transform( ST_Buffer( ST_Transform(pt.geom,4326)::geography, 30.0), 2263) as geom, pt.count FROM public.intrsct_pts as pt ); 我假设这是说我在第一个 ST_Transform 函数中定义了另一个参数(___, 2263)
    • 不,这意味着您在假设中犯了另一个错误(并且它确认数据不在 2263 中)。以随机顺序尝试公式是失败的秘诀......再次停下来,看看你有什么,你想要什么,然后才能得到它必须做的事情
    • 还要记住嵌套函数是从内向外工作的。到 2263 的转换是最后一次应用的转换。
    • 我在我的积分表上使用了命令SELECT st_asText....,SRID 为 2263 和“POINT(-73.738910836855 40.5959372736193)”,当我绘图时,这些都是正确的点。所以我的原始数据是在 2263 年。
    • 我理解嵌套函数,代码是 1) 将点数据的投影转换为新的地理 SRID 2) 将地理 SRID 点在每个方向上缓冲 30 m 3) 重新投影回 2263 。我需要在 SRID 2263 之前调用地理吗?
    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 2018-10-03
    • 2010-09-15
    • 2012-02-17
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多