ArcGIS for iOS 開發系列(7) – 基礎篇-空間要素-幾何形狀

來源:互聯網
上載者:User

        只是載入資料難免乏味,更多時候需要可互動,讓使用者控制地圖的視覺效果,比如:地圖上加標籤、高亮顯示查詢到的街道、修改化學品汙染地區的渲染樣式等等,基本流程就像畫畫,先找張空白的紙,再把房子、花園、馬路什麼的用不同顏色畫上去,紙就是圖形圖層(AGSGraphicLayer),房子等地物就是空間要素(AGSGraphic)。

        圖形圖層(AGSGraphicLayer)之前已經介紹過,它是由用戶端建立的動態圖層,承載並管理其中的空間要素:


//建立新的圖形圖層AGSGraphicsLayer* myGraphicsLayer = [AGSGraphicsLayer graphicsLayer];UIView* graphicsView  = [self.mapview addMapLayer:myGraphicsLayer withName:@"Graphics Layer"]; //從現有圖層中找出圖形圖層NSDictionary<AGSLayerView> *myLayerViewDict = self.mapView.mapLayerViews;  id<AGSLayerView> myGraphicsLayerView = [myLayerViewDict objectForKey:@”Graphics Layer”];AGSGraphicsLayer* myGraphicsLayer = (AGSGraphicsLayer*)myGraphicsLayerView.agsLayer;

    

        空間要素(AGSGraphic)是對空間對象的標準描述,包括:幾何形狀(AGSGeometry)、符號(AGSSymbol)、屬性(attributes)等,因此SDK裡很多方法的輸入輸出項都是空間要素。空間要素的幾何形狀(AGSGeometry)必須要有,符號(AGSSymbol)預設是簡單符號樣式,而屬性(attributes)則是可選的。


//建立點狀符號AGSSimpleMarkerSymbol *myMarkerSymbol =     [AGSSimpleMarkerSymbol simpleMarkerSymbol]; myMarkerSymbol.color = [UIColor blueColor];  //建立點形狀AGSPoint* myMarkerPoint =    [AGSPoint pointWithX:112.2984         y:34.9409               spatialReference:self.mapView.spatialReference]; //組裝點要素AGSGraphic* myGraphic =      [AGSGraphic graphicWithGeometry:myMarkerPoint       symbol:myMarkerSymbol          attributes:nil   infoTemplateDelegate:nil];  //將點要素添加到圖形圖層[myGraphicsLayer addGraphic:myGraphic];  //重新整理該圖形圖層[myGraphicsLayer dataChanged];

1 幾何形狀

    二維幾何形狀包括點、線、面三大類,每類又有單獨和聯合(Multi)兩種,GIS資料類型裡沒有弧(Arc),為此cad使用者常開玩笑:“Arc GIS”竟然沒有Arc?!目前移動端支援以下幾何形狀:

·    點 (Point)

·    多點 (Multipoint)

·    線 (Polyline)

·    面 (Polygon)

·    最小包絡矩形 (Envelope)

    AGSGeometry是所有幾何形狀的基類,其中定義了基本屬性:最小包絡矩形envelope和空間參考(ArcGIS
Android SDK定義要素時不要求有空間參考,因此在要素參與空間運算前要指定空間參考)。因為Object-C中有Mutable變數的設計,因此每種幾何形狀也都延伸了對應的可編輯類型(Mutable)。

圖3-3-1-1 幾何形狀的繼承關係

    AGSGeometry繼承了AGSCoding,其中已經封裝好Json解析方法,當需要和其他系統進行互動時,通過encodeToJSON和AGSJSONRepresentation方法把幾何對象轉成JSON字串。

AGSPoint* point = …NSDictionary* json = [point encodeToJSON];  NSString* jsonPointAsString = [json AGSJSONRepresentation];
1.1  點 

    點(AGSPoint)由x、y和spatailReference構成,通常使用靜態方法(pointWithX:y:spatialReference:)初始化,不能修改:


圖3-3-1-2 AGSPoint主要屬性和方法

    在建立新點或要修改已有點時需要用AGSMutabelPoint聲明,提供了updateWithX:y:方法或者offsetByX:y:修改點座標。

AGSPoint* point = [AGSPoint pointWithX:114.0 y:30.0 spatialReference:[AGSSpatialReference spatialReferenceWithWKID:4326 WKT:nil]];//更新點的座標AGSMutablePoint* mutable = [point mutableCopy];  [mutable updateWithX:120.0 y:20.0];
1.2  多點

    多點(AGSMultiPoint)相當與點數組,適合儲存具有相同性質的一組點,比如一棵樹的Lidar掃描資料本身是數以萬計的點,將其匯入地理資料庫(Geodatabase)的話顯然用多點儲存更高效,numPoints屬性記錄了點數組的長度:


圖3-3-1-3 AGSMultiPoint主要屬性和方法

    在建立新多點或修改已有多點時需要用AGSMutabelMultiPoint聲明,提供了添加和修改其中點的方法。

AGSMutableMultipoint multiPoint = [[AGSMutableMultipoint alloc] initWithSpatialReference:[AGSSpatialReference spatialReferenceWithWKID:4326 WKT:nil]]; [multiPoint addPoint: [AGSPoint pointWithX:10 y:10 spatialReference:nil]];  [multiPoint addPoint: [AGSPoint pointWithX:20 y:20 spatialReference:nil]];  [multiPoint addPoint: [AGSPoint pointWithX:30 y:30 spatialReference:nil]];
1.3  線

    線(AGSPolyline)由軌跡(Paths)組成,每一條軌跡都包含數量可窮舉的連續節點(vertice),此外也需要指定spatailReference。numPointsInPath方法記錄了節點數量,通過pointOnPath:atIndex方法可以找到對應節點。


圖3-3-1-4 AGSPolyLine主要屬性和方法

    在建立新的線或修改已有線時需要用AGSMutabelPolyline聲明,提供了添加和修改其中點的方法。

AGSMutablePolyline* poly = [[AGSMutablePolyline alloc] initWithSpatialReference:[AGSSpatialReference spatialReferenceWithWKID:4326 WKT:nil]];  //添加軌跡[poly addPathToPolyline]; //往軌跡中添加節點[poly addPointToPath:[AGSPoint pointWithX:10 y:10 spatialReference:nil]]; [poly addPointToPath:[AGSPoint pointWithX:30 y:10 spatialReference:nil]]; [poly addPointToPath:[AGSPoint pointWithX:30 y:30 spatialReference:nil]];
1.4  面

    “一生二、二生三、三生萬物…”,面(Polygon)由閉合環(rings)組成,每一個環包含若干連續的節點(vertice),其中首尾兩個節點相同,保證閉合性。閉合環彼此之間如果是內含項目關聯性,就能構建出中空的面。注意環之間拓撲關係不允許相接(touch)或相交(intersect)。


圖3-3-1-5 AGSPolygon主要屬性和方法

    在建立新的面或修改已有面時需要用AGSMutabelPolygon聲明,提供了添加和修改其中點的方法。

AGSMutablePolygon* poly = [[AGSMutablePolygon alloc] initWithSpatialReference:[AGSSpatialReference spatialReferenceWithWKID:4326 WKT:nil]];  //添加環[poly addRingToPolygon];  //添加節點[poly addPointToRing:[AGSPoint pointWithX:10 y:10 spatialReference:nil]];  [poly addPointToRing:[AGSPoint pointWithX:30 y:10 spatialReference:nil]];  [poly addPointToRing:[AGSPoint pointWithX:30 y:30 spatialReference:nil]];  [poly addPointToRing:[AGSPoint pointWithX:10 y:30 spatialReference:nil]];  [poly addPointToRing:[AGSPoint pointWithX:10 y:10 spatialReference:nil]];
1.5  包絡矩形

        包絡矩形(AGSEnvelope)是幾何形狀的矩形外框,可以表示小到一條線的外框,大到一副地圖的範圍(Extent),提供了中心點、高寬、四角座標等屬性,同樣也有一個可編輯版(AGSMutableEnvelope)。


圖3-3-1-6 AGSEnvelope主要屬性和方法

AGSEnvelope env = [AGSEnvelope envelopeWithXmin:10 ymin:10 xmax:30 ymax:30 spatialReference:[AGSSpatialReference spatialReferenceWithWKID:4326 WKT:nil]];

推薦閱讀:ArcGIS
Runtime SDK for iOS開發系列教程(5)——要素資訊的繪製:http://www.cnblogs.com/esrichina/archive/2012/11/05/2753087.html
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.