php

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

dafenqi
2023-08-08 / 0 评论 / 9 阅读 / 正在检测是否收录...

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

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);
0

Deprecated: strtolower(): Passing null to parameter #1 ($string) of type string is deprecated in /www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php on line 1032

评论 (0)

取消