使用EPSG5186将米转换为度 [英] PostGIS convert meters to degree using epsg 5186
问题描述
我有几个关于PostGIS中的几何和地理的问题。
我当前使用的是PostGIS和PostgreSQL。
我的大部分空间数据来自韩国,基本上是纬度和经度。
为了测试,我创建了两个具有相同纬度和经度数据但数据类型不同的表,一个用于地理的SRID 4326,另一个用于几何的SRID 5186。
create table geometry_stores
(
id serial primary key,
location geometry(POINT, 5186) not null
);
create table geography_stores
(
id serial primary key,
location geography(POINT, 4326) not null
);
您可以在此链接上找到EPSG 5186的更多详细信息https://epsg.io/5186
以下是我收到的问题列表:
PostGIS有此方法
ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
distance_of_srid
是EPSG的单位吗?有没有什么方法可以用EPSG 5186将米(例如1公里)转换为distance_of_srid
?我知道,地理计算将点之间的距离度量为球面上的真实路径,而几何计算将点之间的距离度量为笛卡尔平面上的真实路径。那么,如果我给下面的查询提供完全相同的距离,它们应该产生不同的结果还是相同的结果?因为我的理解是,SRID为5186的几何体已经投影了地球的变形,那么它们应该产生相同的结果?
select * from geography_stores where st_dwithin(location, st_setsrid(st_point(126.970769, 37.555479), 4326), same_distance_meter)
select * from geometry_stores where st_dwithin(location, st_setsrid(st_point(126.970769, 37.555479), 5186), same_distance_degree)
当我使用以下查询在几何表上计算距离时,它给出的是度,而不是米。有没有办法在考虑地球变形的情况下将这个度转换成米?
select st_distance(location, st_setsrid(st_point(126.970769, 37.555479), 5186)) from geometry_stores where id = 1;
我已尝试使用此查询,但遇到错误
Only lon/lat coordinate systems are supported in geography. Where: SQL function "st_distancesphere" during inlining
select st_distancesphere(location, st_setsrid(st_point(126.970769, 37.555479), 5186)) from geometry_stores where id = 1;
我已经阅读了PostGIS网站上的文档和StackOverflow中的一些问题,但仍然有这三个问题。感谢你们的帮助。
-更新-----------------------------------------
- 我的空间数据列是GEOMETRY(POINT,5186),因此表定义如下。请注意,在计算时不将其转换为几何图形(点5186)不是几何图形(点4326)。我应该将我的数据存储在几何图形(点4326)中并在计算时转换它吗?
create table geometry_stores
(
id serial primary key,
location geometry(POINT, 5186) not null
);
- 我执行了以下查询,得到的结果如下:
select st_distance(st_setsrid(st_makepoint(126.808183, 37.463557), 4326)::geography,
st_setsrid(st_makepoint(126.970769, 37.555479), 4326)::geography);
st_distance
--------------
17627.3138509
select st_distance(st_setsrid(st_makepoint(126.808183, 37.463557), 5186)::geometry,
st_setsrid(st_makepoint(126.970769, 37.555479), 5186)::geometry)
st_distance
--------------
0.186772218169622
第二个查询似乎给了我学位,而第一个查询给了我米。我是不是在查询中做错了什么?
- 对于st_in,我在GEOMETRY_STORES表中填充了3M数据,空间数据分布在至少10公里的范围内。我执行了以下查询。
select *
from users
where st_dwithin(location, st_setsrid(st_point(126.970769, 37.555479), 5186), 0.001)
此查询显示158行,几何查看器如下图所示。
让我们以距离1而不是0.0001来执行相同的查询
select *
from users
where st_dwithin(location, st_setsrid(st_point(126.970769, 37.555479), 5186), 1)
此查询给我32792923行,这是表中的所有数据。
考虑到空间数据分布在至少10千米的范围内,因此st_in查询似乎是以EPSG5186而不是米为单位计算两个几何图形之间的距离。那么,我想知道我是否可以将米转换为EPSG5186的单位(度),因为我想用米来查询,而不是度,因为我不知道EPSG5186的单位(度)有多远。
推荐答案
Distance_of_sRID是EPSG的单位吗?
是的。使用geometry
类型几何图形的距离是使用相应空间参考系的测量单位计算的。
有没有什么方法可以用EPSG 5186将米(例如1公里)转换为距离_of_sRID?
根据documentation
,EPSG:5186
的单位已经是米,因此您不必转换任何内容。请记住,使用geography
类型几何的距离也是使用metres
计算的,例如
SELECT
ST_Distance(
'SRID=4326;POINT(127.49 36.65)'::geometry,
'SRID=4326;POINT(128.06 36.43)'::geometry) AS geometry_distance,
ST_Distance(
'SRID=4326;POINT(127.49 36.65)'::geography,
'SRID=4326;POINT(128.06 36.43)'::geography) AS geography_distance
;
geometry_distance | geography_distance
-------------------+--------------------
0.610982814815612 | 56578.57823391
(1 Zeile)
那么,如果我给以下查询提供完全相同的距离,它们应该产生不同的结果还是相同的结果?因为我的理解是,SRID为5186的几何体已经投影了地球的变形,那么它们应该产生相同的结果?
结果会有所不同。它们可能有相同的测量单位,但它们不会投影在同一表面上。下面的示例将坐标从4326
转换为5186
并计算距离:
SELECT
ST_Distance(
'SRID=4326;POINT(127.49 36.65)'::geography,
'SRID=4326;POINT(128.06 36.43)'::geography),
ST_Distance(
ST_Transform('SRID=4326;POINT(127.49 36.65)'::geometry,5186),
ST_Transform('SRID=4326;POINT(128.06 36.43)'::geometry,5186));
st_distance | st_distance
----------------+------------------
56578.57823391 | 56582.0899018353
(1 Zeile)
当我使用以下查询在几何表上计算距离时,它给出的是度,而不是米。有没有办法在考虑地球变形的情况下将这个度转换成米?
数据类型geography
不是您要查找的类型吗?正如文档所说:
无论您使用哪种空间参考系统,测量返回的单位(ST_Distance、ST_Long、ST_Perieter、ST_Area)和ST_DWiThin的输入单位都是米。
为了好玩,下面的查询使用ST_DistanceSpheroid
计算显式定义4326
椭球体的两点之间的距离,并将坐标从geometry
转换到geography
,这基本上也是这样做的:
SELECT
ST_DistanceSpheroid(
'POINT(127.49 36.65)',
'POINT(128.06 36.43)',
'SPHEROID["WGS 84",6378137,298.257223563]'),
ST_Distance(
'SRID=4326;POINT(127.49 36.65)'::geography,
'SRID=4326;POINT(128.06 36.43)'::geography);
st_distancespheroid | st_distance
---------------------+----------------
56578.5782339123 | 56578.57823391
关于何时使用geometry
或geography
,documentation
表示:
注意事项:
- 用例覆盖区域较小:坚持
geometry
,使用更适合您所在区域的SRS。 - 用例覆盖大片区域(国家/大陆):使用
geography
--尽管可能会慢一点。 - 您要使用的函数是否支持
geography
?大多数PostGIS功能不支持!有关详细信息,请查看matrix
。如果您想使用的功能不支持geography
,您只能使用geometry
;-)由于您的用例大多覆盖韩国,我认为使用EPSG 5186
没有问题。
编辑:关于问题更新。
您不能简单地更改几何的SRID
来将其转换到另一个参考系!您所做的是获得一个WGS84
坐标对并简单地交换它的SRID
,这不是它的工作方式。为此,您必须始终使用ST_Transform
。请看一下应用后的坐标:
SELECT
ST_AsText(ST_Transform('SRID=4326;POINT(126.808183 37.463557)'::geometry,5186));
st_astext
------------------------------------------
POINT(183030.248454493 540476.713582621)
(1 Zeile)
这意味着POINT(183030.248454493 540476.713582621)
和POINT(126.808183 37.463557)
是相同的坐标对,但在不同的参考系中。下面的查询将清楚地表明,geography
和5186
都以米为单位返回结果:
SELECT
--Transforming from 4326 to 5186 and calculating the distance
ST_Distance(
ST_Transform('SRID=4326;POINT(126.808183 37.463557)'::geometry, 5186),
ST_Transform('SRID=4326;POINT(126.970769 37.555479)'::geometry, 5186)),
-- Distance using geography
ST_Distance(
'SRID=4326;POINT(126.808183 37.463557)'::geography,
'SRID=4326;POINT(126.970769 37.555479)'::geography);
st_distance | st_distance
------------------+---------------
17627.3383377316 | 17627.3138509
这篇关于使用EPSG5186将米转换为度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!