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