当前位置: 首页 > 知识库问答 >
问题:

PostGIS使用epsg 5186将表转换为度数

宰坚
2023-03-14

我有几个关于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中的一些问题,但仍然得到了这三个问题。谢谢你们的帮助。

    1. 我的空间数据的列是几何图形(点,5186),因此表定义如下。请注意,在计算时不将其转换为几何(点,4326)不是几何(点,5186)。我是否应该将数据存储在几何学中(点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
    

    似乎第二个的查询给了我度,而第一个给了我米。请问我在查询中做错什么了吗?

    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的单位(度数)有多远。

  • 共有1个答案

    郑松
    2023-03-14

    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
    

    关于何时使用几何学地理学文档指出:

    “您选择的类型应该取决于您正在构建的应用程序的预期工作区域。您的数据是横跨全球还是一个大的大陆地区,还是一个州、县或自治市?”

    需要考虑的事情:

      null
    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文件中手动输

    • 问题内容: 我已经搜索过了,但是不幸的是,我没有得到正确的答案。 测试一下: 但是有一个错误抛出: 如何解决呢? 更新 我需要此方法,因为有时代码中的类型太长: 我希望致电: 最后 创建这样的方法似乎是不可能的,非常感谢大家! 问题答案: 您可以调用而不用担心自己实现它,但是正如aioobe所说,由于类型擦除,您不能创建通用类型的数组。如果需要返回该类型,则需要自己创建一个类型化实例并将其传递。