Oracle Spatial是Oracle公司推出的空间数据库组件,通过Oracle数据库系统存储和管理空间数据。

ORACLE SPATIAL将所有的地理空间数据类型(矢量、栅格、网格、影像、网络、拓扑)统一在单一、开放的、基于标准的数据管理环境中, 这就减少了管理单独、分离的专用系统的成本、复杂性和开销

原空间字段POSITION数据为:MDSYS.SDO_GEOMETRY(2001, null, MDSYS.SDO_POINT_TYPE(116.307111, 39.963784, null), null, null)

此字段一定要建空间索引,SDO_WITHIN_DISTANCE 函数需要.

建立空间索引语句: Create INDEX idxname on tablename(POSITION) Indextype is MDSYS.SPATIAL_INDEX;

红色为SDO_SRID :几何的空间参考坐标系,不能为null,所有要改为8307.

最终字段数据改为:MDSYS.SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(116.307111, 39.963784, null), null, null)

更新语句:update  tablename  a set a.POSITION.sdo_srid=8307 where a.POSITION is not null

查询此字段坐标语句为

$sql = "select id,NAME, t.x, t.y
from tablename ,
table(sdo_util.getvertices(tablename.POSITION)) t'";
$result=M()->query($sql);

输出x,y为坐标。

查询附近500米内的目标为

$u_lon=116.3059818

$u_lat=39.963784

$sql="
SELECT
id,NAME,rentcar,t.x, t.y,
SDO_GEOM.SDO_DISTANCE (
POSITION,
MDSYS.SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE($u_lon,$u_lat, null), null, null),
0.1
) as meters
FROM
rablename, table(sdo_util.getvertices(tablename.POSITION)) t
WHERE
SDO_WITHIN_DISTANCE(POSITION,MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE($u_lon,$u_lat,NULL),NULL,NULL),'DISTANCE=500 unit=M') = 'TRUE'
ORDER BY

SDO_GEOM.SDO_DISTANCE (
POSITION,
MDSYS.SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE($u_lon,$u_lat, null), null, null),
0.1
)

";
$list = M()->query($sql);

要注意不能用 M()->find 或select 一定要用原生sql语句查询 。

原创,转载请注明

来自lenix的博客 http://blog.p2hp.com/archives/1500

用 thinkphp 查询 Oracle Spatial 的空间数据,实现LBS应用。
标签: