【问题标题】:ST_Within does not return trueST_Within 不返回真
【发布时间】:2022-01-23 11:16:14
【问题描述】:

我使用ogr2ogr 工具从 GeoPackage 导入了一些数据。我假设导入操作没有任何故障,因为ST_IsValidReason() 为导入的多面返回Valid Geometrygeom 列)。

nzstat=# \d sa2_2020
                                           Table "public.sa2_2020"
     Column      |            Type             | Collation | Nullable |                Default                
-----------------+-----------------------------+-----------+----------+---------------------------------------
 gid             | integer                     |           | not null | nextval('sa2_2020_gid_seq'::regclass)
 sa22018_v1_00   | character varying           |           |          | 
 sa22018_v1_name | character varying           |           |          | 
 land_area_sq_km | double precision            |           |          | 
 area_sq_km      | double precision            |           |          | 
 shape_length    | double precision            |           |          | 
 geom            | geometry(MultiPolygon,2193) |           |          | 
Indexes:
    "sa2_2020_pkey" PRIMARY KEY, btree (gid)
    "sa2_2020_geom_geom_idx" gist (geom)

nzstat=# select ST_IsValidReason(geom) from sa2_2020 where gid=4;
 st_isvalidreason 
------------------
 Valid Geometry
(1 row)

nzstat=# select ST_IsValidReason(ST_SetSRID(ST_MakePoint(174.77632, -41.28671), 2193));
 st_isvalidreason 
------------------
 Valid Geometry
(1 row)

nzstat=# select sa22018_v1_name from sa2_2020 where ST_Within(ST_SetSRID(ST_MakePoint(174.82726, -41.16671), 2193), geom);
 sa22018_v1_name 
-----------------
(0 rows)

nzstat=# 

我用于 ST_MakePoint() 的坐标来自另一个数据库,该数据库在 NZGD2000 坐标系 (SRID = 2193) 中给出了 xy

               full_address_ascii                | gd2000_xcoord | gd2000_ycoord        
-------------------------------------------------+---------------+---------------
 1 Willis Street, Wellington Central, Wellington |     174.77632 |     -41.28671 

坐标应该在多个多边形之一中,但我的查询没有返回任何结果。我在这里有什么遗漏吗?

我使用 PostGIS 3.2 和 PostgeSQL 13.5。

谢谢

【问题讨论】:

  • Setsrid 只是改变元数据而不是坐标,你需要使用 st_transform 来代替
  • SRID 2193 中已经给出了 x 和 y 坐标,我还需要使用 ST_Transform() 吗?

标签: postgresql geolocation gis geospatial postgis


【解决方案1】:

EPSG:2193 具有以米为单位的坐标,因此您的值(174.82726,-41.16671)不太可能在该投影中,它们更有可能以度为单位(WGS84,EPGS:4326)。因此,您需要转换您的点以将它们与 EPSG:2193 中的多边形进行比较,因此您的 SQL 应该类似于:

select sa22018_v1_name from sa2_2020 where ST_Within(ST_TRANSFORM(ST_MakePoint(174.82726, -41.16671), 2193), geom);

ST_SetSRID 仅更改点的元数据(设置 CRS),要实际更改点的坐标值,您需要重新投影该点(transform它从一个投影到另一个),因此必须使用ST_Transform

【讨论】:

  • 谢谢...看来我坐标的列名具有误导性(它们是 gd2000_xcoord 和 gd2000_ycoord,这让我认为这些值在 NZGD2000 中。使用 ST_Transform() 工作正常。我有也为geom 设置SRID(使用ST_SetSRID()
猜你喜欢
  • 2014-09-24
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
相关资源
最近更新 更多