轻量数据库Spatialite在AutoCAD中的应用

2013-03-06 05:43:50柳华桥王光昇
城市勘测 2013年5期
关键词:多边形入库语句

柳华桥,王光昇

(天津市测绘院,天津 300381)

轻量数据库Spatialite在AutoCAD中的应用

柳华桥∗,王光昇

(天津市测绘院,天津 300381)

一般的GIS软件都支持几何对象的空间分析处理,如Within、Intersect、Contain、Overlap等,而AutoCAD缺少像GIS那样的空间分析功能,但可以借助于轻量级空间数据库Spatialite实现对AutoCAD对象的空间操作。本文讨论了如何将Spatialite空间数据库模块嵌入到AutoCAD平台中以及如何实现对AutoCAD对象的空间处理和运算。

Spatialite;空间数据库;AutoCAD

1 引 言

在当今的测绘行业中,AutoCAD软件一直是数据采集加工的主流软件。AutoCAD在要素表现上灵活多样,命令定制方便快捷。但是在实际应用中,一般的CAD数据都要转成GIS数据,以满足于不同专业的信息管理系统、电子地图、空间数据库等的需要。可以说,操作上的方便,使得AutoCAD成为数据采集理想平台,而在信息承载、空间数据的分析和处理方面,GIS数据更能满足信息化的需要。此外,AutoCAD软件对几何对象的空间运算处理能力的不足也影响了其向GIS数据转换的质量。本文阐述了如何将轻量级空间数据库Spatialite嵌入到AutoCAD中,实现对AutoCAD对象的空间操作。Spatialite在AutoCAD与GIS之间架起了一座桥梁,将两者有机地融合在一起。

2 Spatialite空间数据库

2.1 简介

SQLite是一个轻量级的数据库,简单、稳定、可移植性好、支持跨平台操作。Spatialite是SQLite数据库的空间数据引擎,能够支持几何数据类型操作扩展的SQL函数。Spatialite是对SQLite的扩展,遵循OGC空间数据规范。主要功能包括:①借助于GEOS库,实现了对OpenGIS空间函数集的完全支持,如:Overlaps、Touches、Union、Buffer等;②遵循OpenGIS规范完全支持空间元数据格式;③采用PROJ.4和EPSG支持坐标系的投影变换;④采用GNU的libiconv支持多语言字符编码;⑤基于SQLite的R∗Tree扩展真正实现了空间索引,极大地提高了空间查询和空间分析;⑥用户可以对外部的Shape文件、CSV/TXT文件进行SQL查询。

2.2 Spatialite支持的几何类型

Spatialite支持的基本的几何类型包括:POINT、LINESTRING和POLYGON,还支持很多复杂的类型,如MULTIPOINT、MULTILINESTRING、MULTIPOLYGON等。可以通过WKT(Well Known Text)表达式来描述每一个几何对象,如:

POINT(123.45 543.21)

LINESTRING(100.0 200.0,201.5 102.5,1234.56 123.89) POLYGON((101.23 171.82,201.32 101.5,215.7 201.953,101.23 171.82))

2.3 在AutoCAD中嵌入Spatialite

第一步,我们将SQLite嵌入到AutoCAD中。

SQLite是轻量级的,可以作为程序的一个模块来直接使用。我们建立一个ObjectARX工程,将SQLite源程序添加进来,然后编写操作数据库的ADS函数提供给LISP程序调用。该方法需要以下两个文件:

sqlite-amalgamation-3071000.zip、

SQLiteLsp[1[1]2.17.1].zip

其中,第一个文件是SQLite的源程序,可以从www. sqlite.org网站上找到;第二个文件是www.theswamp.org网站上由Daniel提供的开源的ObjectARX工程,用于操作SQLite数据库。编译时,首先将sqlite-amalgamation源程序编译成一个静态库SQLite.lib,然后将它链接到SQLiteLsp工程中,生成SQLiteLsp18x32.arx,加载到AutoCAD中,就可以对数据库进行操作了。

需要注意的是,默认情况下,sqlite-amalgamation并没有开启所有功能扩展模块,需要在编译SQLite.lib的工程属性设置中开启所需的设置,如在“C/C++”→“预处理器”→“预处理器定义”中添加SQLITE_ENABLE_COLUMN_METADATA和SQLITE_ENABLE_RTREE两个宏定义,使SQLITE支持对元数据和R∗Tree的操作。

第二步,链接Spatialite空间数据库扩展模块。

另外在Spatialite网站上下载以下两个文件:

libspatialite-win-x86-2.4.0.zip

dependencies-win-x86.zip

其中,第一个文件包含Spatialite的空间扩展模块libspatialite-2.dll,第二个文件是它的Windows依赖文件。

通过以上两步的准备工作,得到以下三部分可以在AutoCAD中使用的应用程序模块,如表1所示。

应用程序模块 表1

第三步,需要作如下两步配置:首先,将SQLiteL-sp18x32.arx应用程序加载到AutoCAD中;然后,再将libspatialite-2.dll和它的所有依赖文件放到AutoCAD搜索路径中,这样,我们就可以在AutoCAD中应用Spatialite空间数据库了。

3 应用方法及实例

3.1 创建空间数据库

通过以下LISP语句,创建一个空间数据库:

(setq DB"C:\spatial.db")

;打开或新建数据库

(DSQL_OPEN DB)

;加载空间扩展模块

(setq DLL"libspatialite-2.dll")

(setq res(DSQL_LOADEXT DB DLL))

;初始化空间元数据

(setq res(DSQL_QUERY DB"SELECT InitSpatialMetaData ();"))

;创建表

(setq SQL(strcat"CREATE TABLE MyPoly(name TEXT NOTNULL);"))

(DSQL_DML DB SQL)

;添加几何字段

(setq res(DSQL_QUERY DB"SELECT AddGeometryColumn ('MyPoly','geom',4326,'POLYGON','XY');"))

;创建空间索引

(setq res(DSQL_QUERY DB"SELECT CreateSpatialIndex(' MyPoly','geom');"))

;关闭数据库

(DSQL_CLOSE DB)

运行以上代码,就创建了一个空的空间数据库文件,使用spatialite_gui工具查看其文件结构如图1~图3所示。代码中语句(setq res(DSQL_LOADEXT DB DLL))负责装载"libspatialite-2.dll空间扩展模块,其返回值res为T时表明装载成功,只有装载成功后,后面的空间查询语句才能生效。InitSpatialMetaData、AddGeometryColumn、CreateSpatialIndex都是Spatialite的SQL查询语句,分别用于初始化空间元数据、创建几何字段、创建空间索引,而且我们注意到这些函数在运行时都是以SELECT查询的方式来执行的。

图1 空间数据库文件结构

图2 空间元数据表

图3 空间索引表

3.2 空间元数据和空间索引

像其他空间数据库一样,Spatialite也通过元数据机制来管理空间数据,所以在创建数据库文件之后,且在调用空间SQL函数之前需要调用语句

SELECT InitSpatialMetaData();

来建立元数据表。

Spatialite的空间索引依赖于SQLite的R∗Tree模型,我们通过调用语句

SELECT CreateSpatialIndex('MyPoly','geom');

建立空间索引表,当向数据库中INSERT、UPDATE或DELETE记录时,Spatialite会通过触发器自动更新空间索引。空间索引对于大数据量的查询检索操作非常有效。

成年曼加利察猪的体形较大,一身绵羊毛般的卷毛让它们看起来非常特别。曼加利察猪是目前世界上唯一拥有长毛的猪,喜欢吃玉米、土豆、胡萝卜、牧草、野山果等。

3.3 入库操作

图4为天津市区的DWG格式的分区结合表,每个分区要素独立闭合,分区号存储在扩展属性中,我们将其入到空间数据库spatial.db中。

图4 分区结合表

主要的入库步骤为:

①打开或新建空间数据库;

②加载空间扩展模块;

③建立选择集,遍历每个分区要素,将每个要素写入库中;

实现的基本过程类似于3.1,主要的区别在于第③步,如何按照Spatialite的要求将几何对象写入库中。例如,我们要将3个点的多边形:(0,0)、(2,0)、(1,1)写入库中:

setq poly"POLYGON((0.0 0.0,2.0 0.0,1.0 1.0,0.0 0. 0))")

(setq geom(strcat"GeomFromText('"poly"',4326)"))

(setq res(DSQL_DML DB"INSERT INTO MyPoly(name,geom)VALUES('%s',%s);"name geom))

以上代码实现了将一个POLYGON写入到空间数据库中。需要注意的是,用程序构成POLYGON点表字符串时要让起点和终点重合,表明是闭合的多边形;当入库的数据量比较大时,应该采用事务的方式,即:

;开启事务

(DSQL_DML DB"begin transaction;")

;入库

;提交事务

(DSQL_DML DB"commit transaction;")

3.4 空间查询示例

例如我们要在CAD中选择一个多边形,然后在空间数据库中查询与它相交的对象,如图5所示。

图5 空间查询

实现步骤如下:

①在CAD中选择多边形,然后通过GeomFromText构建一个多边形几何对象geom(如3.3中代码与示);

②打开空间数据库;

③加载空间扩展模块;

④执行空间查询操作;

⑤关闭空间数据库。

空间查询代码:

(setq res(DSQL_ASSOCQUERY DB"SELECT name FROM MyPoly WHERE Intersects(MyPoly.geom,%s);"geom))

查询返回的结果为:

_$(mapcar'(lambda(x)(cdr(assoc"name"x)))res)

("C31""C30""C29""C28""C27""C25""C24"" C23")

_$

除了Intersects函数外,Spatialite支持的空间关系函数还包括:Equal、Disjoint、Touches、Within、Overlaps、Crosses、Contains、Relate等。

3.5 AutoCAD对象的空间运算

从前面的例子可以得知,AutoCAD的对象并不一定要写入到空间数据库以后才能进行空间运算。我们可以通过GeomFromText函数先把WKT表达式构造成空间几何对象,再通过空间数据库,进行空间分析运算。

例如,如图6所示,如果我们要用g2剪切g1,得到结果g3,实现方法为:

g3=Difference(g1,g2)

图6 多边形剪切

LISP的执行代码为:

(setq res(DSQL_ASSOCQUERY DB"SELECT AsText (Difference(%s,%s));"g1 g2))

返回值中包含结果多边形g3的WKT表达式信息,我们要得到g3,只需要解析出点坐标信息,新建多边形即可。

上面语句中,DB参数是空间数据库,它只是g1和g2进行空间运算的环境,而g1和g2并没有写入到数据库中,所有的AutoCAD对象都可以以这种方式直接进行空间运算。

4 结 语

将Spatialite轻量空间数据库嵌入到AutoCAD中,可以实现对AutoCAD对象的空间分析运算,有效弥补AutoCAD空间分析处理能力不足的问题。将其合理地应用于AutoCAD平台的数据采集、检查、GIS转换数据,可以最大限度地保证数据质量。从实践结果来看,Spatialite为CAD与GIS两个平台的统一提供了良好的解决方案。

[1] 李玲,王庆,王慧青.基于Spatialite轻量级空间数据库的GIS数据管理[J].地理信息世界,2010(4).

[2] Alessandro Furieri.Spatialite Cookbook[R].2011.

[3] http://www.gaia-gis.it/gaia-sins/spatialite-tutorial-2.3.1. html#mbr_cache[EB/OL].

[4] http://www.gaia-gis.it/gaia-sins/spatialite-sql-4.0.0.html.[EB/OL].

[5] Autodesk.ObjectARX开发指南[R].1999.

[6] 陈伯雄,冯伟.VisualLISP程序设计-技巧与范例[M].北京:人民邮电出版社,2002.

The Application of the lightweight database-Spatialite in AutoCAD

Liu Huaqiao,Wang Guangsheng
(Tianjin Institute of Surveying and Mapping,Tianjin 300381,China)

The general GIS software support geometric objects spatial analysis,such asWithin,Intersects,Contains,Overlaps and so on,while AutoCAD lacks these functions,but we can use lightweight spatial database-Spatialite to achieve AutoCAD object space operation.This article discusses how to embed the Spatialite space database module into AutoCAD platform,aswell as how to realize the AutoCAD object spatial processing and operation.

spatialite;spatial database;AutoCAD

1672-8262(2013)05-46-04

P208.1

B

2012—12—18

柳华桥(1980—),男,工程师,注册测绘师,主要从事工程测量及应用程序开发工作。

猜你喜欢
多边形入库语句
多边形中的“一个角”问题
重磅!广东省“三旧”改造标图入库标准正式发布!
中国食品品牌库入库企业信息公示①
中国食品(2021年2期)2021-02-24 03:55:35
重点:语句衔接
多边形的艺术
解多边形题的转化思想
多边形的镶嵌
趣味(数学)(2019年11期)2019-04-13 00:26:32
精彩语句
身临其境探究竟 主动思考完任务——《仓储与配送实务》入库作业之“入库订单处理”教学案例
人间(2015年8期)2016-01-09 13:12:42
批量地籍图入库程序设计方法
吉林地质(2014年4期)2014-03-11 16:48:17