国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

輕量數(shù)據(jù)庫(kù)Spatialite在AutoCAD中的應(yīng)用

2013-03-06 05:43:50柳華橋王光昇
城市勘測(cè) 2013年5期
關(guān)鍵詞:多邊形入庫(kù)語(yǔ)句

柳華橋,王光昇

(天津市測(cè)繪院,天津 300381)

輕量數(shù)據(jù)庫(kù)Spatialite在AutoCAD中的應(yīng)用

柳華橋?,王光昇

(天津市測(cè)繪院,天津 300381)

一般的GIS軟件都支持幾何對(duì)象的空間分析處理,如Within、Intersect、Contain、Overlap等,而AutoCAD缺少像GIS那樣的空間分析功能,但可以借助于輕量級(jí)空間數(shù)據(jù)庫(kù)Spatialite實(shí)現(xiàn)對(duì)AutoCAD對(duì)象的空間操作。本文討論了如何將Spatialite空間數(shù)據(jù)庫(kù)模塊嵌入到AutoCAD平臺(tái)中以及如何實(shí)現(xiàn)對(duì)AutoCAD對(duì)象的空間處理和運(yùn)算。

Spatialite;空間數(shù)據(jù)庫(kù);AutoCAD

1 引 言

在當(dāng)今的測(cè)繪行業(yè)中,AutoCAD軟件一直是數(shù)據(jù)采集加工的主流軟件。AutoCAD在要素表現(xiàn)上靈活多樣,命令定制方便快捷。但是在實(shí)際應(yīng)用中,一般的CAD數(shù)據(jù)都要轉(zhuǎn)成GIS數(shù)據(jù),以滿足于不同專業(yè)的信息管理系統(tǒng)、電子地圖、空間數(shù)據(jù)庫(kù)等的需要??梢哉f,操作上的方便,使得AutoCAD成為數(shù)據(jù)采集理想平臺(tái),而在信息承載、空間數(shù)據(jù)的分析和處理方面,GIS數(shù)據(jù)更能滿足信息化的需要。此外,AutoCAD軟件對(duì)幾何對(duì)象的空間運(yùn)算處理能力的不足也影響了其向GIS數(shù)據(jù)轉(zhuǎn)換的質(zhì)量。本文闡述了如何將輕量級(jí)空間數(shù)據(jù)庫(kù)Spatialite嵌入到AutoCAD中,實(shí)現(xiàn)對(duì)AutoCAD對(duì)象的空間操作。Spatialite在AutoCAD與GIS之間架起了一座橋梁,將兩者有機(jī)地融合在一起。

2 Spatialite空間數(shù)據(jù)庫(kù)

2.1 簡(jiǎn)介

SQLite是一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù),簡(jiǎn)單、穩(wěn)定、可移植性好、支持跨平臺(tái)操作。Spatialite是SQLite數(shù)據(jù)庫(kù)的空間數(shù)據(jù)引擎,能夠支持幾何數(shù)據(jù)類型操作擴(kuò)展的SQL函數(shù)。Spatialite是對(duì)SQLite的擴(kuò)展,遵循OGC空間數(shù)據(jù)規(guī)范。主要功能包括:①借助于GEOS庫(kù),實(shí)現(xiàn)了對(duì)OpenGIS空間函數(shù)集的完全支持,如:Overlaps、Touches、Union、Buffer等;②遵循OpenGIS規(guī)范完全支持空間元數(shù)據(jù)格式;③采用PROJ.4和EPSG支持坐標(biāo)系的投影變換;④采用GNU的libiconv支持多語(yǔ)言字符編碼;⑤基于SQLite的R?Tree擴(kuò)展真正實(shí)現(xiàn)了空間索引,極大地提高了空間查詢和空間分析;⑥用戶可以對(duì)外部的Shape文件、CSV/TXT文件進(jìn)行SQL查詢。

2.2 Spatialite支持的幾何類型

Spatialite支持的基本的幾何類型包括:POINT、LINESTRING和POLYGON,還支持很多復(fù)雜的類型,如MULTIPOINT、MULTILINESTRING、MULTIPOLYGON等??梢酝ㄟ^WKT(Well Known Text)表達(dá)式來描述每一個(gè)幾何對(duì)象,如:

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是輕量級(jí)的,可以作為程序的一個(gè)模塊來直接使用。我們建立一個(gè)ObjectARX工程,將SQLite源程序添加進(jìn)來,然后編寫操作數(shù)據(jù)庫(kù)的ADS函數(shù)提供給LISP程序調(diào)用。該方法需要以下兩個(gè)文件:

sqlite-amalgamation-3071000.zip、

SQLiteLsp[1[1]2.17.1].zip

其中,第一個(gè)文件是SQLite的源程序,可以從www. sqlite.org網(wǎng)站上找到;第二個(gè)文件是www.theswamp.org網(wǎng)站上由Daniel提供的開源的ObjectARX工程,用于操作SQLite數(shù)據(jù)庫(kù)。編譯時(shí),首先將sqlite-amalgamation源程序編譯成一個(gè)靜態(tài)庫(kù)SQLite.lib,然后將它鏈接到SQLiteLsp工程中,生成SQLiteLsp18x32.arx,加載到AutoCAD中,就可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作了。

需要注意的是,默認(rèn)情況下,sqlite-amalgamation并沒有開啟所有功能擴(kuò)展模塊,需要在編譯SQLite.lib的工程屬性設(shè)置中開啟所需的設(shè)置,如在“C/C++”→“預(yù)處理器”→“預(yù)處理器定義”中添加SQLITE_ENABLE_COLUMN_METADATA和SQLITE_ENABLE_RTREE兩個(gè)宏定義,使SQLITE支持對(duì)元數(shù)據(jù)和R?Tree的操作。

第二步,鏈接Spatialite空間數(shù)據(jù)庫(kù)擴(kuò)展模塊。

另外在Spatialite網(wǎng)站上下載以下兩個(gè)文件:

libspatialite-win-x86-2.4.0.zip

dependencies-win-x86.zip

其中,第一個(gè)文件包含Spatialite的空間擴(kuò)展模塊libspatialite-2.dll,第二個(gè)文件是它的Windows依賴文件。

通過以上兩步的準(zhǔn)備工作,得到以下三部分可以在AutoCAD中使用的應(yīng)用程序模塊,如表1所示。

應(yīng)用程序模塊 表1

第三步,需要作如下兩步配置:首先,將SQLiteL-sp18x32.arx應(yīng)用程序加載到AutoCAD中;然后,再將libspatialite-2.dll和它的所有依賴文件放到AutoCAD搜索路徑中,這樣,我們就可以在AutoCAD中應(yīng)用Spatialite空間數(shù)據(jù)庫(kù)了。

3 應(yīng)用方法及實(shí)例

3.1 創(chuàng)建空間數(shù)據(jù)庫(kù)

通過以下LISP語(yǔ)句,創(chuàng)建一個(gè)空間數(shù)據(jù)庫(kù):

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

;打開或新建數(shù)據(jù)庫(kù)

(DSQL_OPEN DB)

;加載空間擴(kuò)展模塊

(setq DLL"libspatialite-2.dll")

(setq res(DSQL_LOADEXT DB DLL))

;初始化空間元數(shù)據(jù)

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

;創(chuàng)建表

(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');"))

;創(chuàng)建空間索引

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

;關(guān)閉數(shù)據(jù)庫(kù)

(DSQL_CLOSE DB)

運(yùn)行以上代碼,就創(chuàng)建了一個(gè)空的空間數(shù)據(jù)庫(kù)文件,使用spatialite_gui工具查看其文件結(jié)構(gòu)如圖1~圖3所示。代碼中語(yǔ)句(setq res(DSQL_LOADEXT DB DLL))負(fù)責(zé)裝載"libspatialite-2.dll空間擴(kuò)展模塊,其返回值res為T時(shí)表明裝載成功,只有裝載成功后,后面的空間查詢語(yǔ)句才能生效。InitSpatialMetaData、AddGeometryColumn、CreateSpatialIndex都是Spatialite的SQL查詢語(yǔ)句,分別用于初始化空間元數(shù)據(jù)、創(chuàng)建幾何字段、創(chuàng)建空間索引,而且我們注意到這些函數(shù)在運(yùn)行時(shí)都是以SELECT查詢的方式來執(zhí)行的。

圖1 空間數(shù)據(jù)庫(kù)文件結(jié)構(gòu)

圖2 空間元數(shù)據(jù)表

圖3 空間索引表

3.2 空間元數(shù)據(jù)和空間索引

像其他空間數(shù)據(jù)庫(kù)一樣,Spatialite也通過元數(shù)據(jù)機(jī)制來管理空間數(shù)據(jù),所以在創(chuàng)建數(shù)據(jù)庫(kù)文件之后,且在調(diào)用空間SQL函數(shù)之前需要調(diào)用語(yǔ)句

SELECT InitSpatialMetaData();

來建立元數(shù)據(jù)表。

Spatialite的空間索引依賴于SQLite的R?Tree模型,我們通過調(diào)用語(yǔ)句

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

建立空間索引表,當(dāng)向數(shù)據(jù)庫(kù)中INSERT、UPDATE或DELETE記錄時(shí),Spatialite會(huì)通過觸發(fā)器自動(dòng)更新空間索引??臻g索引對(duì)于大數(shù)據(jù)量的查詢檢索操作非常有效。

成年曼加利察豬的體形較大,一身綿羊毛般的卷毛讓它們看起來非常特別。曼加利察豬是目前世界上唯一擁有長(zhǎng)毛的豬,喜歡吃玉米、土豆、胡蘿卜、牧草、野山果等。

3.3 入庫(kù)操作

圖4為天津市區(qū)的DWG格式的分區(qū)結(jié)合表,每個(gè)分區(qū)要素獨(dú)立閉合,分區(qū)號(hào)存儲(chǔ)在擴(kuò)展屬性中,我們將其入到空間數(shù)據(jù)庫(kù)spatial.db中。

圖4 分區(qū)結(jié)合表

主要的入庫(kù)步驟為:

①打開或新建空間數(shù)據(jù)庫(kù);

②加載空間擴(kuò)展模塊;

③建立選擇集,遍歷每個(gè)分區(qū)要素,將每個(gè)要素寫入庫(kù)中;

實(shí)現(xiàn)的基本過程類似于3.1,主要的區(qū)別在于第③步,如何按照Spatialite的要求將幾何對(duì)象寫入庫(kù)中。例如,我們要將3個(gè)點(diǎn)的多邊形:(0,0)、(2,0)、(1,1)寫入庫(kù)中:

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

以上代碼實(shí)現(xiàn)了將一個(gè)POLYGON寫入到空間數(shù)據(jù)庫(kù)中。需要注意的是,用程序構(gòu)成POLYGON點(diǎn)表字符串時(shí)要讓起點(diǎn)和終點(diǎn)重合,表明是閉合的多邊形;當(dāng)入庫(kù)的數(shù)據(jù)量比較大時(shí),應(yīng)該采用事務(wù)的方式,即:

;開啟事務(wù)

(DSQL_DML DB"begin transaction;")

;入庫(kù)

;提交事務(wù)

(DSQL_DML DB"commit transaction;")

3.4 空間查詢示例

例如我們要在CAD中選擇一個(gè)多邊形,然后在空間數(shù)據(jù)庫(kù)中查詢與它相交的對(duì)象,如圖5所示。

圖5 空間查詢

實(shí)現(xiàn)步驟如下:

①在CAD中選擇多邊形,然后通過GeomFromText構(gòu)建一個(gè)多邊形幾何對(duì)象geom(如3.3中代碼與示);

②打開空間數(shù)據(jù)庫(kù);

③加載空間擴(kuò)展模塊;

④執(zhí)行空間查詢操作;

⑤關(guān)閉空間數(shù)據(jù)庫(kù)。

空間查詢代碼:

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

查詢返回的結(jié)果為:

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

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

_$

除了Intersects函數(shù)外,Spatialite支持的空間關(guān)系函數(shù)還包括:Equal、Disjoint、Touches、Within、Overlaps、Crosses、Contains、Relate等。

3.5 AutoCAD對(duì)象的空間運(yùn)算

從前面的例子可以得知,AutoCAD的對(duì)象并不一定要寫入到空間數(shù)據(jù)庫(kù)以后才能進(jìn)行空間運(yùn)算。我們可以通過GeomFromText函數(shù)先把WKT表達(dá)式構(gòu)造成空間幾何對(duì)象,再通過空間數(shù)據(jù)庫(kù),進(jìn)行空間分析運(yùn)算。

例如,如圖6所示,如果我們要用g2剪切g(shù)1,得到結(jié)果g3,實(shí)現(xiàn)方法為:

g3=Difference(g1,g2)

圖6 多邊形剪切

LISP的執(zhí)行代碼為:

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

返回值中包含結(jié)果多邊形g3的WKT表達(dá)式信息,我們要得到g3,只需要解析出點(diǎn)坐標(biāo)信息,新建多邊形即可。

上面語(yǔ)句中,DB參數(shù)是空間數(shù)據(jù)庫(kù),它只是g1和g2進(jìn)行空間運(yùn)算的環(huán)境,而g1和g2并沒有寫入到數(shù)據(jù)庫(kù)中,所有的AutoCAD對(duì)象都可以以這種方式直接進(jìn)行空間運(yùn)算。

4 結(jié) 語(yǔ)

將Spatialite輕量空間數(shù)據(jù)庫(kù)嵌入到AutoCAD中,可以實(shí)現(xiàn)對(duì)AutoCAD對(duì)象的空間分析運(yùn)算,有效彌補(bǔ)AutoCAD空間分析處理能力不足的問題。將其合理地應(yīng)用于AutoCAD平臺(tái)的數(shù)據(jù)采集、檢查、GIS轉(zhuǎn)換數(shù)據(jù),可以最大限度地保證數(shù)據(jù)質(zhì)量。從實(shí)踐結(jié)果來看,Spatialite為CAD與GIS兩個(gè)平臺(tái)的統(tǒng)一提供了良好的解決方案。

[1] 李玲,王慶,王慧青.基于Spatialite輕量級(jí)空間數(shù)據(jù)庫(kù)的GIS數(shù)據(jù)管理[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開發(fā)指南[R].1999.

[6] 陳伯雄,馮偉.VisualLISP程序設(shè)計(jì)-技巧與范例[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—),男,工程師,注冊(cè)測(cè)繪師,主要從事工程測(cè)量及應(yīng)用程序開發(fā)工作。

猜你喜歡
多邊形入庫(kù)語(yǔ)句
多邊形中的“一個(gè)角”問題
重磅!廣東省“三舊”改造標(biāo)圖入庫(kù)標(biāo)準(zhǔn)正式發(fā)布!
中國(guó)食品品牌庫(kù)入庫(kù)企業(yè)信息公示①
重點(diǎn):語(yǔ)句銜接
多邊形的藝術(shù)
解多邊形題的轉(zhuǎn)化思想
多邊形的鑲嵌
精彩語(yǔ)句
身臨其境探究竟 主動(dòng)思考完任務(wù)——《倉(cāng)儲(chǔ)與配送實(shí)務(wù)》入庫(kù)作業(yè)之“入庫(kù)訂單處理”教學(xué)案例
人間(2015年8期)2016-01-09 13:12:42
批量地籍圖入庫(kù)程序設(shè)計(jì)方法
东乡县| 万山特区| 渭南市| 武安市| 雷山县| 丽水市| 沧州市| 临澧县| 扎赉特旗| 盐池县| 彭山县| 晋中市| 炎陵县| 天水市| 田东县| 阜康市| 手游| 武乡县| 昭平县| 兴文县| 饶平县| 临桂县| 汤阴县| 睢宁县| 江源县| 汽车| 奇台县| 茂名市| 新巴尔虎左旗| 丽水市| 德昌县| 伊金霍洛旗| 宝坻区| 天等县| 都安| 顺昌县| 江安县| 五河县| 平邑县| 万盛区| 嘉峪关市|