在我看来,这似乎是一个简单的问题(可能是),但我似乎找不到能给我答案的例子。使用PostGIS,我只想选择不在多边形范围内的点。最终,据我所知,这是ST_Intersects的反函数。我假设我应该使用ST_Intersects,但是如何告诉它进行反向选择?我以为可能在下面的代码前添加一个NOT语句,但这没有用。

评论

我有相同的思考过程,以为NOT也会像其他任何有条件的情况一样发挥作用

#1 楼

它不适用于“不相交”的原因是您只能成对比较几何;脱节将存在相同的问题。即使每个房屋点与一个地块相交,它们也将不相交。

Underdark的建议没有这个问题。还有另一个技巧可能会更有效地使用索引: 。

这里需要的索引是空间索引和宗地中gid的索引(假设宗地表中的id也称为gid)。

评论


非常感谢你! Nicklas完全正确,因为ST_Disjoint将不会产生正确的结果。正如他指出的那样,ST_Disjoint返回所有要素,因为每个点都与表中的某些宗地多边形分离,而此代码段给了我希望的结果。

– RyanKDalton
2010-12-17在0:16

该查询的计划与此gis.stackexchange.com/a/136177/6052相同,因此,这纯粹是您喜欢的样式问题。 =)对于那些购物答案。

–埃文·卡洛尔(Evan Carroll)
18年1月5日在18:00

#2 楼

您可能正在寻找ST_Disjoint


ST_Disjoint —如果几何不“空间
相交”-如果它们不共享任何空间,则返回TRUE。 br />

评论


尽管ST_Disjoint这样做,但是它不使用空间索引。您将要等待很长一段时间

–尼克
15年6月12日在13:19

#3 楼

如果没有专门功能:

CREATE table t_intersect AS
SELECT 
  hp.gid, 
  hp.st_address, 
  hp.city, 
  hp.st_num,
  hp.the_geom
FROM
  public.housepoints as hp
WHERE
  hp.gid NOT IN 
  (
    SELECT 
      h.gid
    FROM 
      public.parcel as p,
      public.housepoints as h
    WHERE 
      ST_Intersects(h.the_geom,p.the_geom)
  ) AS foo


#4 楼

在这里我们使用NOT EXISTSCREATE TABLE AS SELECT(CTAS)

CREATE table t_intersect
AS
  SELECT 
    hp.gid,
    hp.st_address,
    hp.city, hp.st_num,
    hp.the_geom
  FROM public.housepoints AS hp
  WHERE NOT EXISTS (
    SELECT 1
    FROM public.parcel AS par 
    WHERE ST_Intersects(hp.the_geom,par.the_geom)
  );


#5 楼

ST_Disjoint怎么样? —如果几何不“空间相交”-如果它们不共享任何空间,则返回TRUE。

评论


糟糕-在回答之前需要刷新页面:-)

–伊恩·特顿♦
2010-12-16 22:07

#6 楼

在某些情况下使用LATERAL JOIN非常有用,它可以非常快
它看起来应该像

SELECT * FROM houses h
LEFT JOIN LATERAL (
   SELECT True t FROM parcels p
   WHERE ST_Intersects(p.geom, h.geom)
   LIMIT 1
) p ON True
WHERE p.t IS NULL;


#7 楼

只需在ST_Intersects之前使用NOT即可完成操作:

这将获取不在#62邻域内的所有地址:的几何列-多边形第一,第二点,这与ST_Intersects的通常用法相反。一直想知道如何正确执行此操作!

评论


还为“ NOT ST_Within”工作。我的查询在〜30.0秒内完成了NOT ST_Within和使用外部联接的操作,然后在右侧检查Null,因此似乎没有任何性能损失。谢谢!

–内特·万纳(Nate Wanner)
17年1月26日在17:57

@NateWanner很高兴认识!我不敢相信那是多么容易和快捷!

– DPSSpatial
17年1月26日在18:22

这实际上是一个非常糟糕的主意,因为您正在获得笛卡尔积

–埃文·卡洛尔(Evan Carroll)
18年1月3日,下午2:05

@EvanCarroll是什么意思?

– DPSSpatial
18年5月5日在16:46

这意味着,如果您不仅获得1个denver.address,还为每个不匹配的denver.neighborhood获得一个。

–埃文·卡洛尔(Evan Carroll)
18年1月5日在17:07

#8 楼

这可能不是最快的解决方案...但是我通常只是通过结合其他表的所有功能来作弊。

如果not_in_here表不是没那么复杂。

评论


那从来都不是活泼的。如果not_in_here很复杂,它不会变得那么卑鄙。 ;)

–埃文·卡洛尔(Evan Carroll)
18年1月5日在17:17