Loading... # [用 thinkphp 查询 Oracle Spatial 的空间数据,实现LBS应用](https://blog.p2hp.com/archives/1500) 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 查询此字段坐标语句为 ```php $sql = "select id,NAME, t.x, t.y from tablename , table(sdo_util.getvertices(tablename.POSITION)) t'"; $result=M()->query($sql); ``` 输出x,y为坐标。 查询附近500米内的目标为 ```php $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); ``` 最后修改:2023 年 08 月 08 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏