【问题标题】:Incorrect results returned by postgrespostgres 返回的结果不正确
【发布时间】:2017-05-09 09:46:58
【问题描述】:

我在 posgresql 9.6 中运行了以下命令:

./bin/createdb testSpatial
./bin/psql -d testSpatial -c "CREATE EXTENSION postgis;"
create table test(name character varying(250), lat_long character varying(90250), the_geom geometry);
\copy test(name,lat_long) FROM 'test.csv' DELIMITERS E'\t' CSV HEADER;
CREATE INDEX spatial_gist_index ON test USING gist (the_geom );
UPDATE test SET the_geom = ST_GeomFromText(lat_long,4326);

运行时:select * from test; 我得到以下输出:

name |                                                                                          lat_long                                       
                                                   |                                                                                            
                                                  the_geom                                                                                      

------+-----------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------+--------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------
 A    | POLYGON((-0.061225 -128.427791,-0.059107 -128.428264,-0.056311 -128.428911,-0.054208 -128.426510,-0.055431 -128.426324,-0.057363 -128.42
6124,-0.059315 -128.425843,-0.061225 -128.427791)) | 0103000020E61000000100000008000000D42B6519E258AFBFBE50C076B00D60C07DE9EDCF4543AEBFBC41B456B
40D60C08063CF9ECBD4ACBFA1BC8FA3B90D60C07BF65CA626C1ABBF58AD4CF8A50D60C0BF805EB87361ACBFFFAF3A72A40D60C0B83A00E2AE5EADBF4D81CCCEA20D60C01F1153228
95EAEBF60C77F81A00D60C0D42B6519E258AFBFBE50C076B00D60C0
 B    | POINT(1.978165 -128.639779)                                                                                                             
                                                   | 0101000020E61000002D78D15790A6FF3F5D35CF11791460C0
(2 rows)

在此之后,我运行了一个查询:查找彼此相距 5 米以内的所有“名称”。为此,我编写了以下命令。

testSpatial=# select s1.name, s2.name from test s1, test s2 where ST_DWithin(s1.the_geom, s2.the_geom, 5);
 name | name 
------+------
 A    | A
 A    | B
 B    | A
 B    | B
(4 rows)

令我惊讶的是,我得到了不正确的输出,因为“A”和“B”彼此相距 227.301 公里(此处使用半正弦距离计算:http://andrew.hedges.name/experiments/haversine/)。有人可以帮我理解我哪里出错了。

【问题讨论】:

    标签: sql postgresql postgis postgresql-9.1


    【解决方案1】:

    您已按如下方式定义几何体

     the_geom geometry
    

    即,这不是地理。但是ST_DWithin docs

    对于几何:距离以定义的单位指定 几何的空间参考系统。为了使这个功能 从某种意义上说,源几何图形必须具有相同的坐标 投影,具有相同的 SRID。

    地理单位以米为单位,测量默认为 use_spheroid=true,为了更快的检查,use_spheroid=false 来测量 沿球体。

    因此,您实际上是在搜索彼此相距 5 度以内的地点。一个度数大约等于 111 公里,因此您正在寻找彼此相距约 550 公里而不是 5 米的地方。

    此外,在表中存储像POINT(1.978165 -128.639779) 这样的字符串没有多大意义。这是完全多余的。这些信息可以很容易地从地理列中生成。

    【讨论】:

    • 非常感谢。我是 postgres 的新手,如果我想搜索彼此相距 5 公里以内的所有位置,我应该怎么做。将使用“the_geom geography”而不是“the_geom geometry”
    猜你喜欢
    • 2012-04-11
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2017-11-28
    • 2014-11-03
    相关资源
    最近更新 更多