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