postgres

时间:2016-12-23 17:36:34

标签: sql postgresql postgis postgresql-9.1

我在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 km(使用半径距离计算:http://andrew.hedges.name/experiments/haversine/)。有人可以帮我理解我哪里出错了。

1 个答案:

答案 0 :(得分:1)

您已按如下方式定义几何

 the_geom geometry

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

  

对于几何图形:距离以由...定义的单位指定   几何的空间参照系。为了这个功能   感觉,源几何必须都是相同的坐标   投影,具有相同的SRID。

     

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

所以你实际上是在寻找彼此相差5度的地方。学位大约等于111公里所以你正在寻找相距550公里而不是5米的地方。

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