在我做的项目都是用的OR Model,虽然它在存取数据和生成索引的时候确实有点麻烦,但是
它在做空间分析的时候,sdo_geometry带的Geometry Functions和Spatial Operators就很
有用了。现在各种GIS平台基本都带有往Oracle转数据的小程序,比如Mapinfo EasyDataLoader,
就是一个免费地把Mapinfo格式数据转入Oracle的小程序。
我指的“简单的一条SQL语句”是在空间查询中,而不是取数据时。因为在一般项目中Oracle
Spatial的功能很少完全发挥的,顶多就是利用它的索引机制加快速度和在空间分析中使用它
的Spatial Operators(当然是指GIS方面的功能)。比如框选的VC实现:
//csSqlStatement = "Select "+ 字段名 + " From "+ 表名 +
// " Where MDSYS.SDO_RELATE(GEOMETRY, MDSYS.SDO_GEOMETRY(" +
// "3, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 3, 3), MDSYS.SDO_ORDINATE_ARRAY(" +
// str + ")), 'MASK = ANYINTERACT QueryType = Window') = 'TRUE'";
COracleRecordset* COracleDatabase::Query(CString csSqlStatement){
COracleRecordset *rs = new COracleRecordset(conn, csSqlStatement);//Connect Oracle data source
geomCursor->Open();//Open geometry cursor
geomCursor->Prepare(csSqlStatement);
geomCursor->conn->errhp,
OCIStmtExecute(geomCursor->conn->svchp,
geomCursor->stmthp,
geomCursor->conn->errhp,
(ub4)1,
(ub4)0,
(OCISnapshot*)0,
(OCISnapshot*)0,
OCI_DESCRIBE_ONLY
);
//Check possible error
//Get result
return recordset;
}
你举的电力设备开关的例子其实是一个多分辨率下空间实体的粒度问题,比如在华北电网1:1M的电子地图上,
一个电力设备开关肯定是一个点;而到了一个热电厂厂区1:500的电子地图里,它可能就变成了面。这在实际中
确实是一个很棘手的问题。在现阶段可以采用比例尺控制+类似“超级链接”的方法来接解决。
随着地图缩放比例调用不同比例尺的电子地图。在1:1M的电子地图上,一个开关就是点啦,
挂一般的属性就行了。如果用户对某个开关执行放大操作,则随比例变化逐次调入不同比例尺的电子地图,直到
一个电力开关可以完全展现为止(比如1:500)。这时如果用户还要求更详细的信息,比如
开关的图片,开关的文字介绍,可以做一个类似ARCVIEW的HOTLINK功能,往表示开关的那个POLYGON
上挂接。
我原来做电厂的AM/FM/GIS就是这样做的,把一个有上万条电缆的托盘做得纤毫毕现。
但是这样的缺点就是在大范围的空间系统(比如电网级的)中可能会准备很多套不同比例尺
的图(可能还有对应的不同属性定义),项目成本会成几何级数
增长。这是采用ORDB的技术管理空间数据的根本缺陷,只有采用纯OODB技术,在DB中去掉
TABLE的概念,在GIS中去掉LAYER的概念,才能从根本上解决这类问题。