我有几个关于PostGIS中几何和地理的问题。
我目前正在使用PostGIS和PostgreSQL。
我的大部分空间数据来自韩国,基本上是经纬度。
为了进行测试,我创建了两个具有相同经纬度数据但数据类型不同的表,一个是使用SRID4326的地理表,另一个是使用SRID5186的几何表。
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
);
您可以在以下链接https://EPSG.io/5186上找到EPSG5186的更多详细信息
以下是我得到的一系列问题:
>
PostGIS有这种方法
st_dinner(几何g1,几何g2,srid的双精度距离);
distance_of_srid
是EPSG的一个单位吗?我有没有办法用EPSG 5186将米(例如1km)转换为distance_of_srid
?
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;
select st_distancesphere(location, st_setsrid(st_point(126.970769, 37.555479), 5186))
from geometry_stores
where id = 1;
我阅读了PostGIS网站上的文档和StackOverflow中的一些问题,但仍然得到了这三个问题。谢谢你们的帮助。
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
似乎第二个的查询给了我度,而第一个给了我米。请问我在查询中做错什么了吗?
select *
from users
where st_dwithin(location, st_setsrid(st_point(126.970769, 37.555479), 5186), 0.001)
select *
from users
where st_dwithin(location, st_setsrid(st_point(126.970769, 37.555479), 5186), 1)
这个查询为我提供了32792923行,这是表中的所有数据。
考虑到空间数据至少分布在10km,st_winner查询似乎是用EPSG5186而不是米的单位(degeree)计算两个几何图形之间的距离。然后,我想知道我是否可以把米转换成EPSG5186的单位(度数),因为我想用米查询,而不是度数,我不知道EPSG5186的单位(度数)有多远。
srid的distance_of_srid是EPSG的一个单位吗?
是的。使用几何图形
类型几何图形的距离是使用来自相应空间参考系的测量单位计算的。
我有没有办法用EPSG 5186把米(例如1km)转换成srid的距离?
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)
结果会有所不同。它们可能有相同的测量单位,但它们不投影在相同的表面上。下面的示例将坐标从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_Length,ST_Perimeter,ST_Area)返回的单位和输入ST_Dinner的单位都以米为单位。
为了好玩,下面的查询计算显式定义4326
球体的两点之间的距离,使用st_distancespheroid
,并将坐标从geomethy
转换为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
关于何时使用几何学
或地理学
,文档
指出:
“您选择的类型应该取决于您正在构建的应用程序的预期工作区域。您的数据是横跨全球还是一个大的大陆地区,还是一个州、县或自治市?”
需要考虑的事情:
SELECT
ST_AsText(ST_Transform('SRID=4326;POINT(126.808183 37.463557)'::geometry,5186));
st_astext
------------------------------------------
POINT(183030.248454493 540476.713582621)
(1 Zeile)
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
当我在地理专栏中使用st_dwithin和GIST索引时,解释计划显示索引扫描上的缩小条件变为 解释计划中没有索引的条件为 但解释计划表示,当列有GIST索引时,将其更改为以下内容 地理列有一个自定义的空间参照系,在转换为 设置代码如下所示 将st_dwithin距离从3增加到230000将返回所有三个预期行,因为在srid 4326中这是它们的距离。 当列上存在索引时,如何让PostGIS在查询
问题内容: 在模块中,我只能找到带有cos / sin / tan / acos / asin / atan的。这将返回以弧度为单位的答案。如何获得度数的答案? 这是我的代码: 我的度数计算器为我提供: 问题答案: Python在包中包括两个函数;将度数转换为弧度,并将弧度转换为度。 要匹配计算器的输出,您需要: 请注意,所有的三角函数都在角度和三角形两侧的比率之间转换。cos,sin和tan以弧
问题内容: 我正在尝试将此代码转换为代码,但我不知道该代码应该是什么? 我用Google搜索并找到了这个 但是我不明白如何在Swift中转换它? 问题答案: Xcode 11•Swift 5.1或更高版本 操场 如果要使二进制整数返回浮点类型而不是始终返回CGFloat,则可以使通用方法代替计算属性:
我试图使用lambda中的函数创建一个映射。现在我面临的问题是我无法将列表转换为特定情况下的映射 我需要在这里使用方法引用吗? 下面是方法
XML输入文件: XML输入文件转换为XML输出文件。将XML输入文件的firstName、middleName和lastName标签合并为XML Ouput文件的name标签,将XML输入文件的address1、address2、city、state和pincode标签合并为XML Ouput文件的address标签。 我几乎转换了代码,但我在这里与empId作斗争。我已经在XSLT文件中手动输
我的javascript代码中有一个字符串列表,我通过JQuery将其发送到基于REST的服务,如下所示: 如您所见,我将javascript数组转换为JSON数组。 现在,在服务器端,我使用Spring MVC和Jackson来接收和解析输入JSON: 但我总是得到: 我尝试从JSON对象中删除引号,还尝试使用,但没有成功。 根据OQJF建议进行更新: 我修改了我的帖子请求如下: 现在调用了我的