时间:2016-8-5 作者:悬浮的青春 分类: dbbase
利用st_geometry查询包含在某个多边形内部的点。即所谓的缓冲区查询或者多边形查询,周边查询等。
利用st_geometry一般会写出以下两种方式查询
1、select * from RAINSTATION t where st_contains(
sde.st_geometry('POLYGON ((110.131461 20.444913,110.628593 34.453972,117.743949 20.940567,110.131461 20.444913))',
t.shape.srid),shape) = 1
面包含点。st_contains方法是一种全表扫描的查询方式超级慢。
2、select * from RAINSTATION t where sde.st_intersects(shape,
sde.st_geometry('POLYGON ((130.131461 45.444913,130.628593 34.453972,117.743949 45.940567,130.131461 45.444913))',
t.shape.srid)) = 1
点在面中。st_intersects是一种空间查询方式,会比上面的方法快很多,利用空间索引查询。
但是当点很多的时候。比如成千上万的时候,第2种的效率也感觉特别差。
下面是解决办法
select * from RAINSTATION t where sde.st_intersects(shape,
(select sde.st_geometry('POLYGON ((130.131461 45.444913,130.628593 34.453972,117.743949 45.940567,130.131461 45.444913))',
t.shape.srid) from dual)) = 1
原来构建几何对象(st_geometry)也会消耗性能和时间,如果把st_geometry放在一个select里,查询速度就正常了,比原来快很多。