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

Postgres使用距离连接查询返回不正确的结果

方奕
2023-03-14

我创建了一个表,其中包含位置及其空间坐标(纬度、经度(度数)),以postgres表示。我用于相同用途的命令有:

我在postgres中插入了空间坐标(经度、纬度)

我创建了一个表,其中包含位置及其空间坐标(纬度、经度(度数)),以postgres表示。我用于相同用途的命令有:

CREATE TABLE spatialTest(
  name character varying(100),
  the_geo geography
);
\copy spatialTest(name,the_geo) FROM 'testSpatial.csv' DELIMITERS E'\t' CSV;

testSpatial。csv包含以下值:

A   SRID=4326;POLYGON((0.178773 -127.681841,0.178711 -127.681962,0.179125 -127.682083,0.179176 -127.682006,0.179153 -127.681986,0.179143 -127.681962,0.179147 -127.681935,0.179166 -127.681913,0.179195 -127.681897,0.179244 -127.681886,0.179284 -127.681887,0.179336 -127.681904,0.179464 -127.681757,0.179489 -127.681736,0.179429 -127.681680,0.179370 -127.681516,0.179221 -127.681331,0.179184 -127.681185,0.179051 -127.681264,0.178822 -127.681499,0.178761 -127.681698,0.178796 -127.681703,0.178839 -127.681721,0.178857 -127.681736,0.178861 -127.681740,0.178871 -127.681756,0.178873 -127.681782,0.178859 -127.681809,0.178843 -127.681825,0.178812 -127.681839,0.178773 -127.681841))
B   SRID=4326;POINT(0.628912 -127.700922)

现在,我想找到彼此距离在50公里以内的所有空间位置。为此,我使用了以下命令:

select s1.name, s2.name  from spatialTest s1, 
     spatialTest s2  where ST_DWithin(s1.the_geo, s2.the_geo, 50000);

然而,令我惊讶的是,我发现尽管A和B彼此之间的距离大于50公里(精确地说是50.0995公里),但使用Chris Venese的大地测量公式发现的​ (以经纬度计算点和线段之间的距离)),但结果由postgres返回。有人能帮我弄清楚我到底错在哪里吗。

我使用的是PostgreSQL 9.6devel和Postgis版本,我使用的是:POSTGIS="2.2.1 r14555"

共有1个答案

公子昂
2023-03-14

正如其他人所说,这是你的负担。。

NOTICE:  Coordinate values were coerced into range [-180 -90, 180 90] for GEOGRAPHY
CONTEXT:  COPY spatialtest, line 2, column the_geo: "SRID=4326;POINT(0.628912 -127.700922)"

很可能,您正在尝试加载(lat, long),而PostgreSQL需要(long, lat)。但是,我们可以绕过输入列的顺序。我们要做的就是,

>

  • 创建一个临时表asgeometry`。

    CREATE TEMP TABLE foo(name text, the_geo geometry);
    

    切断SRID位(EKWT),在导入时失去SRID。

    sed -i -e's/SRID=4326;//' ./foo.csv
    

    加载输入。

    \copy foo(name,the_geo) FROM 'foo.csv' DELIMITERS E'\t' CSV;
    

    复制到主表中。

    INSERT INTO spatialTest(name, the_geo)
    SELECT
      name,
      ST_Union(
        ST_SetSRID(
          ST_MakePoint(st_y(geom), st_x(geom))
        ,4326)
      )::geography
    FROM foo
    CROSS JOIN ST_DumpPoints(foo.the_geo) AS t
    GROUP BY name
    ORDER BY name;
    

    作为旁注:不要使用varchar作为名称。只需将其保留为TEXT。除非你有很好的理由设定角色限制。

    然后跑你的距离...

    SELECT ST_Distance(
      (SELECT the_geo FROM spatialtest WHERE name='A'), (SELECT the_geo FROM spatialtest WHERE name='B')
    );
      st_distance   
    ----------------
     49740.52214618
    (1 row)
    

  •  类似资料:
    • 以下是我的疑问.... 我没有结果。 另外,我正在使用这个插件来生成请求正文。 我的查询如下所示.. null 感谢您到目前为止的阅读,如果有人能帮助我找出如何使这一工作,我将非常感谢。

    • 我想查询表A中每个点(id)到表B中每个多边形(id)的距离。对于距离计算,我使用ST_距离。但是,ST_Distance(显然)返回到每个多边形的距离。但我只需要每个点的“最接近”结果。到目前为止,我尝试了下面的查询,它返回了正确的结果,但是(当然)只返回了一个点。 结果应该是这样的: 你有什么提示吗?非常感谢你。 更新1 运行上述查询(3h 24m)后,返回的结果为空。然而,应该有一个结果。括

    • 问题内容: 简而言之,当不使用_geo_distance排序时,是否有一种方法可以返回地理距离? 更新:为澄清起见,我希望结果按随机顺序排列并包含距离。 问题答案: 是的,您可以使用脚本字段。 例如,假设您的文档具有一个名为的地理位置字段,则可以使用以下内容: (请注意,只是一个转义的单引号,所以真的是) 如果还希望返回该字段,则可以如下指定:

    • 我正在使用postgis计算两个地理坐标之间的距离。 它返回给我53536.743496517米,大约等于54公里,但实际距离是103公里,我通过http://boulter.com/gps/distance/ 我在询问中是否做错了什么?

    • 我正在尝试在代码中使用NSPredicate搜索名称。搜索工作正常,但不会返回适当的结果。当我搜索一个名称(例如“Colin”)时,它会返回表中的所有其他名称或另一个名称(例如“Mike”),但如果我输入一个不存在的随机字符串,它会返回:“找不到结果”。当我在搜索栏中键入一个名字(例如Lisa)时,我希望它能找到这个名字(Lisa)并返回它,但它没有这样做 这是我的代码: 自己name返回表中的所

    • 不确定我是不是漏掉了什么。 如有任何建议,将不胜感激。