APEX开发实践(22):APEX地图进阶开发(三)地图上显示物流轨迹

在物流信息系统获取到的物流信息在APEX的地图上显示。

数据样本:

image

shipmentXid:物流单号

lon:经度

lat:维度

creationDateStr:经纬度更新时间,坐标点每5分钟更新一次。

达到的效果:

image

 

在本例中,会使用APEX地图的“线”类型的地图图层。由于APEX的“线”类型只支持Oracle地理信息数据类型(sdo_geometry),所以,首先要把表中的坐标经纬度转换成sdo_geometry。通过下面这个函数进行转换。

create or replace FUNCTION convert_to_line(
    xid IN VARCHAR2
) RETURN mdsys.sdo_geometry
IS
    l_ordinates mdsys.sdo_ordinate_array := mdsys.sdo_ordinate_array(); -- 初始化集合
BEGIN
    FOR i IN (
        SELECT LON, LAT -- 经纬度
        FROM track -- 表名
        WHERE SHIPMENTXID = xid
        ORDER BY CREATIONDATESTR --为了避免路径混乱,按坐标点采集时间排序。
    )
    LOOP
        l_ordinates.EXTEND(1);
        l_ordinates(l_ordinates.COUNT) := i.LON;
        l_ordinates.EXTEND(1);
        l_ordinates(l_ordinates.COUNT) := i.LAT;
    END LOOP;

    RETURN mdsys.sdo_geometry(
        2002, -- 2D的线型
        4326, -- WGS84标准
        NULL,
        mdsys.sdo_elem_info_array(1, 2, 1), --从第一个坐标点开始,用默认方式画线
        l_ordinates --本函数中定义的SDO_GEO变量
    );
END convert_to_line;

 

这里详细讲解一下SDO_GEOMETRY()和SDO_ELEM_INFO_ARRAY()。

 

---以下内容较枯燥,没有耐心研究的可跳过---

SDO_GEOMETRY()

SDO_GEOMETRY 是 Oracle Spatial 和 Graph 数据库中的一个专有数据类型,用于存储空间数据,例如点、线、多边形等地理信息。这种类型允许在数据库中存储复杂的几何形状,并能够进行地理空间的查询和分析。SDO_GEOMETRY 主要用于 GIS(地理信息系统)应用程序。

SDO_GEOMETRY 的结构

SDO_GEOMETRY 类型的定义非常灵活,允许存储不同类型的几何对象。它的主要结构如下:

SDO_GEOMETRY(
  SDO_GTYPE   NUMBER,     -- 几何类型
  SDO_SRID    NUMBER,     -- 空间参照系
  SDO_POINT   SDO_POINT_TYPE, -- 点坐标(如果是点类型几何对象)
  SDO_ELEM_INFO  SDO_ELEM_INFO_ARRAY, -- 几何对象的元素信息
  SDO_ORDINATES  SDO_ORDINATE_ARRAY   -- 几何对象的坐标信息
)

1. SDO_GTYPE(几何类型)是一个四位数的数字,用于定义几何对象的类型。它是一个四位数,第一位表示维度(2 表示二维,3 表示三维),后面三位表示几何类型。常见的几何类型如下:

  • 2001: 点(2D)
  • 2002: 线(2D)
  • 2003: 多边形(2D)
  • 3001: 点(3D)
  • 3002: 线(3D)
  • 3003: 多边形(3D)

2. SDO_SRID(空间参照系标识符)是一个数字,用于指定该几何对象使用的空间参照系(Spatial Reference System)。它用于定义坐标系,比如 WGS 84(广泛用于 GPS 的参考系统)。如果不指定空间参照系,可以设置为 NULL

注:本例中用到的4326表示WGS 84(World Geodetic System 1984.)。使用经度和纬度的地理坐标系,基于地球的全球标准参考系。其它的标准参考Oracle数据库文档或ChatGPT。

3. SDO_POINT(点类型):如果几何对象是一个点,可以使用 SDO_POINT 存储 X、Y 和 Z 坐标。它是一个结构体类型 SDO_POINT_TYPE,具有以下三个属性:

  • X:点的 X 坐标。
  • Y:点的 Y 坐标。
  • Z:点的 Z 坐标(可选)。

4. SDO_ELEM_INFO(元素信息数组)是一个数组,定义几何对象的组成结构,解释了如何从坐标信息中构建几何形状。数组由多个元素组成,每组 3 个值,分别表示:

  • 起始坐标的索引。
  • 元素类型(如简单线、多边形等)。
  • 解释方式(如环的定义)。

注:本例中用到SDO_ELEM_INFO_ARRAY( )函数来定义坐标元素信息数组。下面会详细解释。

5. SDO_ORDINATES(坐标数组)是一个数组,存储几何对象的坐标。该数组按顺序包含几何对象的所有坐标。对于 2D 对象,每个坐标由一对 (X, Y) 值表示;对于 3D 对象,增加 Z 值。

 

SDO_ELEM_INFO_ARRAY( )

SDO_ELEM_INFO_ARRAY 是 Oracle 中 SDO_GEOMETRY 对象的一部分,它提供了一个用于解释空间几何形状的结构化数组。SDO_ELEM_INFO_ARRAY 定义了几何对象的元素类型及其在坐标数组中的具体位置和解释方式。它与 SDO_ORDINATES(坐标数组)紧密配合,帮助数据库理解如何从这些坐标中构建出几何图形。

SDO_ELEM_INFO_ARRAY 的结构

SDO_ELEM_INFO_ARRAY 是一个三元组的数组。它的结构如下:

SDO_ELEM_INFO_ARRAY(
  STARTING_OFFSET, 
  ELEMENT_TYPE, 
  INTERPRETATION)
  1. STARTING_OFFSET(起始位置):指定几何对象在 SDO_ORDINATES 坐标数组中的起始点索引(从 1 开始)。SDO_ORDINATES 数组中提取坐标时,以该位置为起点;
  2. ELEMENT_TYPE(元素类型):指定几何对象的类型(例如点、线、多边形等);
  • 1001:点(Point)
  • 1002:线(Line)
  • 1003:多边形(Polygon)
  • 2003:带有孔的多边形(带内环的多边形)
  • 2005:复合对象(集合体)
  1. INTERPRETATION(解释方式):主要用于多边形,定义外环、内环及如何解释环。常见的值包括:
  • 1:默认的解释方式(外环、顺时针方向)
  • 2:内环(逆时针方向)
  • 3:复合元素的子元素

注:本例中用到SDO_ELEM_INFO_ARRAY( 1,2,1)指的是从第一个坐标点开始,画线,默认方式。

 

----------此处为华丽的分割线----------

接下来就简单了。直接创建一个APEX的地图应用,把物流轨迹在APEX地图上显示。

image

图层类型:线;

SQL查询:这里只是为了演示,简单做了个函数的调用。实际使用可以根据具体的应用需求做调用;

几何结构数据类型:SDO_GEO;

几何结构列:选函数的输出。

简单的设置就可以如本文开头的图例,在地图上显示物流轨迹。

 

另外,为了在地图显示时,自动把中国地图居中,可以在地图的属性的初始位置和缩放里做以下设置。

image

posted @ 2026-01-08 14:28  搬砖的徐大爷  阅读(1)  评论(0)    收藏  举报