我有一个将近200万行的PostgreSQL表,表的形式是coordinates,是一个较长的POINT(-73.4938 33.2405)字段。

假设该字段上有地理空间索引,那么在任意边界框内选择所有行的最有效,最快的方法是什么?

盒子就像SW long-lat: -74.0042 40.7688NE long-lat: -73.8809 40.7984

#1 楼

假定给定的边界框限制与所存储的坐标在同一空间参考系统中,并且您知道需要哪个空间算符(相交或包含在其中):

SELECT *
FROM   my_table
WHERE  coordinates 
    && -- intersects,  gets more rows  -- CHOOSE ONLY THE
    @ -- contained by, gets fewer rows -- ONE YOU NEED!
    ST_MakeEnvelope (
        xmin, ymin, -- bounding 
        xmax, ymax, -- box limits
        my_srid)


或者,如果您更喜欢“包含”(而不是“包含于”的声音),则应将WHERE子句翻转:上面的文章)记录是简单的点,我认为“相交”和“包含”之间的差异变得非常微妙,仅影响边界框边缘上的点。

评论


那是个很好的观点。包含应该没问题,因为如果地图标记位于边界上(例如,浏览器镶边),您将实际上看不到它。

– Avishai
2014年1月20日18:36

什么是最快的...? :OP

– Magno C
16年12月12日在15:53

请注意:与多边形Geometry相交时,&&和@似乎不起作用。在这种情况下,请使用ST_Intersects(latlng_column,ST_GeomFromText('Polygon((...))',4326))或使用ST_Contains

– Alex
18年2月1日,11:50



#2 楼

SELECT ST_Y(the_geom) AS latitude, ST_X(the_geom) as longitude
from units u where the_geom && ST_MakeEnvelope(left, bottom, right, top, 4326)


#3 楼

我尝试了ST_MakeEnvelope和数学比较“ x> min_x和x min_y和y
因此空间搜索ST_MakeEnvelope应该比数学比较快!

评论


实际上,如果创建正确的索引min_x,max_x,min_y和max_y会更快。我有一个非常大的数据集(超过300万个多边形),并且对ST_MakeEnvelope和(ST_XMax,ST_XMin,ST_YMax,ST_YMin)都进行了INDEX处理,两者之间的差异极大地促进了数学运算。数学花费了我不到20秒的时间(索引+查询),而信封交集花费了2分钟的时间(当到达2分钟时我放弃了,只有40秒才用于空间索引)

– caiohamamura
17年7月3日在18:15