创建错误的点值

creating wrong points values

我正在与 SRID=32636

合作

我有一个point = (2076155.32235105 4828109.18280588)

我正在使用这个 post: 创建具有不同距离的 3 个点。

我使用以下查询创建了 3 个点(源点 + 距离源点 15、30、70 米的 3 个不同点):

select st_asText(st_project('POINT(2076155.32235105 4828109.18280588)', 15, radians(30)))

我得到了:POINT(35.322429431595 30.8173112915666)

select st_asText(st_project('POINT(2076155.32235105 4828109.18280588)', 30, radians(30)))

我得到了:POINT(35.3225078132829 30.8174284630566)

select st_asText(st_project('POINT(2076155.32235105 4828109.18280588)', 70, radians(30)))

我得到了:POINT(35.3227168320474 30.8177409201211)

当我检查源点和彼此之间的距离时,我得到了不正确或奇怪的距离:

select st_distance('POINT(2076155.32235105 4828109.18280588)','POINT (2076155.32235105 4828109.18280588)')

得到:0(似乎没问题 - 源点与同一源点之间没有距离)

select st_distance('POINT(2076155.32235105 4828109.18280588)','POINT(35.322429431595 30.8173112915666)')

得到5255531.84344186(我预计得到15个)

select st_distance('POINT(2076155.32235105 4828109.18280588)','POINT(35.3225078132829 30.8174284630566)')

得到5255531.84330326(我预计得到30)

怎么了?

为什么我得到的点不给我距离源点我想要的距离的点?

我该如何解决?

您正在混合使用空间参考系统和数据类型。如果您看一下您的这个查询,您会注意到这些点显然位于两个不同的 SRS 中:

select st_distance('POINT(2076155.32235105 4828109.18280588)',
                   'POINT(35.3225078132829 30.8174284630566)')

为了获得以米为单位的 ST_Distance 的结果,您必须首先将几何图形转换为 geography - 还有其他更复杂的方法。由于我们无法将投影的 SRS 转换为 lon/lat,我们需要先将您的坐标 ST_Transform 转换为 lon/lat SRS,然后再将其转换为 geography。之后所有距离操作都将以米为单位计算。以下查询准确地显示了我在说什么:

WITH j (start_point,geo15,geo30,geo75) AS (
  VALUES (ST_Transform('SRID=32636;POINT(2076155.32235105 4828109.18280588)'::geometry,4326)::geography,
          ST_Project(ST_Transform('SRID=32636;POINT(2076155.32235105 4828109.18280588)'::geometry,4326)::geography, 15, radians(30)),
          ST_Project(ST_Transform('SRID=32636;POINT(2076155.32235105 4828109.18280588)'::geometry,4326)::geography, 30, radians(30)),
          ST_Project(ST_Transform('SRID=32636;POINT(2076155.32235105 4828109.18280588)'::geometry,4326)::geography, 75, radians(30)))
)
SELECT 
  ST_Distance(start_point,geo15),
  ST_Distance(start_point,geo30),
  ST_Distance(start_point,geo75)  
FROM j;

 st_distance | st_distance | st_distance 
-------------+-------------+-------------
          15 |          30 |          75