亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于NetTopologySuite在AutoCAD中實(shí)現(xiàn)拓?fù)涠噙呅蔚臉?gòu)建

        2014-06-26 07:39:48王光昇周奎
        城市勘測 2014年1期
        關(guān)鍵詞:弧段多邊形圓弧

        王光昇 ,周奎

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

        1 引 言

        AutoCAD 軟件是國內(nèi)地形圖數(shù)據(jù)采集加工的主流軟件,它為開發(fā)人員提供了豐富的開發(fā)接口,便于我們定制開發(fā)滿足專業(yè)應(yīng)用需求的應(yīng)用程序。為了滿足國家新版地形圖圖式、數(shù)據(jù)字典的要求,天津市測繪院開發(fā)了基于AutoCAD Map3D 的地形圖采集編輯軟件,該軟件實(shí)現(xiàn)了局部拓?fù)錁?gòu)面功能,即通過已有的邊界自動生成多邊形。最初,我們通過Map3D 的Clean、Topology 等功能來實(shí)現(xiàn),但經(jīng)過應(yīng)用測試,發(fā)現(xiàn)這種方法存在弊端,首先,Clean 操作會生產(chǎn)中間數(shù)據(jù),對于最終結(jié)果而言,這些數(shù)據(jù)是沒有用的;其次,Map3D 的Clean、Topology 功能沒有完全釋放選擇集,在同一繪圖環(huán)境下多次應(yīng)用會產(chǎn)生“超出選擇集數(shù)量的最大范圍”的問題,而采集軟件中的拓?fù)錁?gòu)面功能應(yīng)該是能夠與用戶交互的反復(fù)調(diào)用的工具,所以這種構(gòu)建多邊形的方法是不可取的。本文闡述了在AutoCAD 中引入符合OpenGIS 標(biāo)準(zhǔn)的GIS 分析、操作類庫NetTopology-Suite,通過GIS 解決方案對AutoCAD 中的線狀對象進(jìn)行空間分析,生成拓?fù)涠噙呅?。這種方法的優(yōu)點(diǎn)是:采用完全的幾何運(yùn)算,不產(chǎn)生中間數(shù)據(jù),速度快;不依賴于Map3D 軟件,降低了對CAD 軟件平臺的要求。

        2 NetTopologySuite 簡介

        NetTopologySuite(以下簡稱NTS)是著名的JTS Topology Suite 的C#/.NET 版本,NTS 項(xiàng)目的目的是提供一個基于.NET,快速、穩(wěn)定的GIS 解決方案,以應(yīng)用于所有.NET 平臺,包括各類嵌入式設(shè)備。

        JTS Topology Suite 是一個OpenGIS 標(biāo)準(zhǔn)的GIS 分析、操作類庫,它實(shí)現(xiàn)了OGC(Open Geospatial Consortium)定義在SFS(Simple Features Specification)中的簡單對象模型,提供了完整的二元比較集合,支持的空間關(guān)系包括:equals、disjoint、touches、crosses、within、contains、overlaps;JTS 支持基本的空間分析方法,包括:Intersection、Union、Difference、Symmetric Difference、Convex hull、Buffer。同時,JTS API 支持用戶自定義精度模型。

        3 程序流程

        程序?qū)崿F(xiàn)的基本流程如圖1所示。

        圖1 程序基本流程

        3.1 輸入數(shù)據(jù)

        用戶輸入的數(shù)據(jù)主要包括3 項(xiàng):線狀邊界、精度模型比例尺、多邊形內(nèi)一點(diǎn)。

        3.2 建立精度模型

        NTS 允許用戶指定一個明確的精度模型,即輸入坐標(biāo)值精確的位數(shù)。實(shí)現(xiàn)方法如下:

        PrecisionModel _precisionModel;

        GeometryFactory _geometryFactory;

        _precisionModel.Scale=in_scale;

        _geometryFactory = new GeometryFactory(_precisionModel,0);

        在后續(xù)的步驟中,用_geometryFactory 的CreateLineString 方法建立的LineString 對象都受到精度模型_precisionModel 的約束,如:

        ILineString lstr=_geometryFactory.CreateLineString(

        cl.ToCoordinateArray());

        3.3 分析、處理、存儲邊界數(shù)據(jù)

        分如下幾步:

        第一,用AutoCAD 的幾何類型存儲每條邊界線的每一段。如果是直線段(Line),用LineSegment2d 類型存儲,如果是弧段,用CircularArc2d 存儲,如果是多段線(Polyline),由于它是由多個直線段(或弧段)組成的,所以可以將其存儲為LineSegment2d 與CircularArc2d 的集合。使用幾何類型存儲后,后續(xù)的坐標(biāo)信息讀取、幾何運(yùn)算就不用再讀取CAD 對象了,可以有效地提高運(yùn)算速度。

        第二,建立LineString 集合。將直線段直接創(chuàng)建LineString 對象并存入集合中;對于弧段,首先計算與其他所有線段的交點(diǎn),然后對交點(diǎn)排序,再分割弧段為子弧段,最后,對子弧段進(jìn)行加密、創(chuàng)建LineString 對象存入集合。

        分割弧段時,首先要對弧上所有分割點(diǎn)按照相對起始點(diǎn)的參數(shù)(或距離)進(jìn)行排序,如圖2所示:

        圖2 分割圓弧

        排序方法為:

        其中,MyCompare 是自定義的比較器:

        然后取得相鄰兩個分割點(diǎn)之間子弧段,方法如下:

        分割子弧段后,還需要按4.2 所述的方法加密子弧段。

        3.4 打斷交叉對象

        通過上面的分析處理,我們已經(jīng)準(zhǔn)備好了用于拓?fù)浞治龅脑牧希碙ineString 集合,在生成多邊形之前,需要進(jìn)行圖形規(guī)范化,其中最主要的是打斷交叉對象,如圖3所示:

        圖3 打斷交叉對象

        實(shí)現(xiàn)方法如下:

        3.5 生成多邊形

        NTS 提供了Polygonizer 類,可以對規(guī)范化之后的LineString 集合進(jìn)行處理,獲取多邊形,方法為:

        Polygonizer polygonizer=new Polygonizer();

        polygonizer.Add(nodedLineStrings);

        IList <IGeometry >polys=polygonizer.GetPolygons()as IList <IGeometry >;

        遍歷所有多邊形,包含用戶輸入的區(qū)域內(nèi)一點(diǎn)的多邊形即為目標(biāo)多邊形。

        3.6 將加密點(diǎn)解析成圓弧

        上述目標(biāo)多邊形點(diǎn)表中如果包含子弧段加密點(diǎn),那么我們必須對加密弧段信息進(jìn)行解析,復(fù)原弧段信息,才能得到最終的結(jié)果,詳見4.2。

        3.7 輸出結(jié)果多邊形

        程序整個過程,僅僅在用戶輸入邊界數(shù)據(jù)之后,我們讀取了一次AutoCAD 線狀邊界數(shù)據(jù),并保存到幾何類型中,之后所有的運(yùn)算都是通過幾何運(yùn)算來實(shí)現(xiàn)的,最大限度地減少了對AutoCAD 對象的直接操作。這樣既提高了運(yùn)算速度,又增強(qiáng)了程序的穩(wěn)定性。

        基于此設(shè)計思想,在輸出結(jié)果多邊形時,我們并不直接創(chuàng)建具體的AutoCAD 閉合多段線,而是通過ResultBuffer 類型返回多邊形點(diǎn)表及凸度信息,然后由調(diào)用函數(shù)完成具體對象的創(chuàng)建。

        4 關(guān)鍵問題處理

        通過NTS 在AutoCAD 實(shí)現(xiàn)拓?fù)涠噙呅蔚臉?gòu)建,需要解決兩個關(guān)鍵的問題:

        4.1 精度模型

        剛開始研究本課題的時候,沒有用到精度模型,很快就遇到了一些奇怪的問題:在CAD 中明明是能夠形成閉合的邊界,但在NTS 中卻得不到多邊形。如圖4所示,a、b、c 是由不同的邊界圍成的閉合區(qū)域,用NTS構(gòu)面時,可能只能得到a、b 兩個多邊形。

        圖4 NTS 構(gòu)面

        經(jīng)過研究發(fā)現(xiàn),NTS 在處理坐標(biāo)精度時,默認(rèn)情況下使用精密精確度模型,即用雙精度表示,自從Java使用IEEE-754 浮點(diǎn)標(biāo)準(zhǔn)以來,它就提供了53 位的精確度。過高的精度設(shè)置使得NTS 在比較兩個雙精度浮點(diǎn)數(shù)是否相等時過于嚴(yán)格,導(dǎo)致我們無法得到期望的結(jié)果。圖4中區(qū)域c 中邊l1的終點(diǎn)和邊l2的起點(diǎn)由于精度要求過高,使得NTS 認(rèn)為它們并不重合,所以無法構(gòu)建多邊形。

        為了解決這一問題,我們先后測試了兩種方法:

        第一種,在AutoCAD 中,先將所選的線狀邊界對象放大一定的比例(相當(dāng)于精度模型中的比例尺),分析處理以后,再恢復(fù)對象比例。這種方法雖然解決了精度問題,但是需要修改CAD 對象,并不是最理想的方案。

        第二種,NTS 中精度模型的設(shè)計很好地解決了這一難題。精度模型包括三種類型:固定精度、浮點(diǎn)精度、精密精確度。這里使用固定精度模型,替代了前一種方法,程序編寫起來更簡單、結(jié)構(gòu)更清晰、代碼更易于維護(hù)。

        4.2 圓弧處理

        如圖5所示,只有分割圓弧后再進(jìn)行圓弧加密,最終生成的多邊形才能解析出弧段信息。圓弧的分割點(diǎn)1、2 是多邊形的特征點(diǎn),是解析子弧段信息的重要依據(jù),是不能遺失的。而在(a)中只是粗略地對整個圓弧進(jìn)行加密,遺失了特征點(diǎn),所以不能再解析子弧段了;(b)中先對整個圓弧進(jìn)行分割,然后對每個子弧段進(jìn)行加密,生成的多邊形中不僅包含了特征點(diǎn),而且包含了完整的子弧段加密信息,所以能夠解析出子弧段的信息。

        圖5 圓弧分割、加密與解析

        圓弧的分割方法3.3 中已經(jīng)提到,子弧段加密的方法如下:

        Point2d[]pts=sub_arc.GetSamplePoints(20);

        即對所有圓弧的采樣點(diǎn)取固定的數(shù)值,這里取值20。采樣點(diǎn)僅僅是為處理圓弧而使用的臨時點(diǎn),所以選取數(shù)量可以自己設(shè)定,但要前后統(tǒng)一,考慮到效率問題,也不宜選取太多的點(diǎn)。

        解析子弧段的方法:

        遍歷所有子弧段,每個子弧段取采樣點(diǎn)20 個,將采樣點(diǎn)集合與多邊形上的點(diǎn)進(jìn)行比較,如果都落在多邊形上,則該子弧段的圓弧信息就應(yīng)該映射到多邊形上,作如下處理:保留多邊形上與采樣點(diǎn)集合中首尾點(diǎn)重合的點(diǎn),移除與中間的點(diǎn)重合的點(diǎn),然后計算凸度值,即可恢復(fù)子弧段信息。如圖5中(b)、(c)所示。

        計算3 點(diǎn)圓弧凸度的方法為:

        // s_pt 是起點(diǎn),e_pt 是終點(diǎn),i_pt 是弧上一點(diǎn)

        private static double GetBulgeBy3Pt(Point2d s_pt,Point2d e_pt,Point2d i_pt)

        {

        //i_pt 到e_pt 的角度

        double angle1 =i_pt.GetVectorTo(e_pt).Angle;

        //s_pt 到i_pt 的角度

        double angle2 =s_pt.GetVectorTo(i_pt).Angle;

        double bulge=Math.Tan((angle1 - angle2)/ 2.0);

        return bulge;

        }

        5 應(yīng)用測試

        如圖6所示,拓?fù)涞玫降亩噙呅螢橐粋€帶有內(nèi)環(huán)的多邊形,經(jīng)過圓弧處理,所有的弧段信息都正確地解析出來了。在NTS 中,讀取Polygon 對象的坐標(biāo)時,用ExteriorRing 屬性獲得外環(huán)坐標(biāo),用InteriorRings 獲得所有內(nèi)環(huán)信息,如:

        圖6 環(huán)狀拓?fù)涠噙呅?/p>

        Coordinate[]pts1 =poly.ExteriorRing.Coordinates;

        foreach (LineString ls in poly.InteriorRings){

        Coordinate[]pts2 =ls.Coordinates;

        }

        6 結(jié) 語

        目前,很多開源的GIS 軟件都將NTS 作為其空間幾何對象運(yùn)算、處理的插件。本文討論了如何在AutoCAD 中引入NTS GIS 分析、操作類庫,實(shí)現(xiàn)拓?fù)涠噙呅蔚臉?gòu)建。其中,對精度模型的建立和圓弧信息的處理兩個關(guān)鍵問題進(jìn)行了深入的論述,并提出了解決方案。

        總之,NTS 的很多功能都可以移植到CAD 平臺,為CAD 的數(shù)據(jù)處理提供更豐富的空間分析手段,具有很強(qiáng)的實(shí)用價值。

        [1]JTS Topology Suite Developer’s Guide[R].2003,9 ~12.

        [2]JTS Topology Suite Technical Specification[R].2003.

        [3]Nagel.C.C#高級編程[M].北京:清華大學(xué)出版社,2008.

        [4]Charles McAuley.AutoCAD 2000 ObjectARX 編 程 指 南[M].北京:機(jī)械工業(yè)出版社,2000.

        [5]李冠億.深居淺出AutoCAD 二次開發(fā)[M].北京:中國建筑工業(yè)出版社,2012.

        [6]王文波,鄒清源,張斯珩等.AutoCAD 2010 二次開發(fā)實(shí)例教程(ObjectARX)[M].北京:機(jī)械工業(yè)出版社,2013.

        猜你喜歡
        弧段多邊形圓弧
        一種航天測控冗余跟蹤弧段處理方法
        上海航天(2024年1期)2024-03-08 02:52:28
        基于改進(jìn)弧段切點(diǎn)弦的多橢圓檢測
        多邊形中的“一個角”問題
        淺析圓弧段高大模板支撐體系設(shè)計與應(yīng)用
        面向工業(yè)復(fù)雜場景的合作靶標(biāo)橢圓特征快速魯棒檢測
        多邊形的藝術(shù)
        外圓弧面銑削刀具
        解多邊形題的轉(zhuǎn)化思想
        多邊形的鑲嵌
        淺談如何將多段線中的弧線段折線化
        四川建筑(2015年4期)2015-06-24 14:08:40
        亚洲高清无码第一| 国产精品一区二区久久毛片| 少妇人妻字幕一区二区| 国产在线精彩自拍视频| 日韩视频午夜在线观看| 亚洲av人片在线观看| 国产精品久久精品第一页| 人妻饥渴偷公乱中文字幕| 97久久香蕉国产线看观看| 亚洲乱妇老熟女爽到高潮的片| 亚洲最新版无码AV| 一本色道久久综合亚洲精品蜜臀| 亚洲人妻av在线播放| 少妇又色又爽又高潮在线看| 亚洲一区二区三区影院| 国产裸体美女永久免费无遮挡| 无码视频在线观看| 伊人久久大香线蕉综合网站| 国产在线精品一区二区三区不卡| AV无码一区二区三区国产| 女同性恋亚洲一区二区| 国产午夜三级精品久久久| 日产一区二区三区免费看| 久久精品亚洲精品国产色婷| 国产又a又黄又潮娇喘视频| 妇女性内射冈站hdwwwooo| 久久与欧美视频| 日韩有码中文字幕第一页| 国产内射一级一片高清内射视频| 99e99精选视频在线观看| 午夜精品久久久久久久99热| 性一交一乱一伦a片| 日本中文字幕不卡在线一区二区| 精品人妻一区二区蜜臀av| 国产一区二区不卡av| 国产日产久久高清ww| 手机看黄av免费网址| 国产精品久久久久久婷婷| 中文字幕一区二区三区四区在线 | 一本色道久久亚洲av红楼| 亚洲av成人片色在线观看高潮|