1. 程式人生 > >ArcGIS Runtime SDK for iOS開發地圖圖層-圖形圖層

ArcGIS Runtime SDK for iOS開發地圖圖層-圖形圖層

       建立圖形圖層

       圖形圖層可以使你在地圖上動態的展示圖形。圖形圖層可以用來儲存使用者繪製的多邊形、線條,或者展示例如查詢或是地理編碼結果的屬性資訊。下圖中,圖形圖層用於突出展示每平方里超過200人的人口密度狀態:

      

       當你想在地圖中新增一個圖形圖層,可以利用AGSGraphicsLayer 類來建立圖層。該類的例項包含了一系列圖形和可選性的渲染器(AGSRender)。同時,也包含了新增、刪除和重繪圖形的方法。

       符號定義了圖形表面的非地理方面屬性,主要包括圖形的顏色、邊框寬度、透明度等等。ArcGIS Runtime SDK for iOS中包含了許多符號類,每個類都可以使你以獨特的方式指定符號。每個符號型別同時也是特定於某一類幾何型別(點、線、面)。

       渲染器定義了應用於圖形的符號集。應用在每個圖形的符號取決於圖形的屬性。渲染器指定了什麼樣的屬性值對應哪一種符號。

       新增圖形圖層

       下面是新增圖層的方法:

AGSGraphicsLayer* myGraphicsLayer = [AGSGraphicsLayer graphicsLayer];
[self.mapview addMapLayer:myGraphicsLayer withName:@"Graphics Layer"];
       需要注意的是,在addMapLayer方法中你給圖形圖層賦予的名字在地圖檢視中必須是唯一的。

       新增圖形屬性

       圖形是AGSGraphic類的一個例項,圖形和幾何體(geometry)相關聯,幾何體定義了在地圖中圖形的位置和形狀。圖形同時又跟符號相關聯,符號定義了圖形如何被展示。另外,圖形圖層可以跟渲染器相關聯,渲染器定義了圖層中的所有圖形如何被展示。你還可以將一些屬性跟圖形相關聯,這些屬性是鍵-值對,它可以表徵圖形所代表的實體的資訊。

        在多數情況下,你在地圖上所展示的圖形將會被返回並作為執行任務的結果,例如請求地圖服務、地理編碼一個地址、或者是進行地理處理分析操作。在這些例子中,圖形將包含了描述它們位置和形狀的幾何體。所以你要做的就是定義這些圖形該如何被展示,是通過為每個圖形賦一個符號?或是給圖形圖層賦一個渲染器。

        下面的程式碼建立了一個圖層,並給它賦予一個符號和幾何體,並將它新增到已存在的圖形圖層中去:

//create a marker symbol to be used by our Graphic
AGSSimpleMarkerSymbol *myMarkerSymbol =
	[AGSSimpleMarkerSymbol simpleMarkerSymbol];
myMarkerSymbol.color = [UIColor blueColor];

//Create an AGSPoint (which inherits from AGSGeometry) that
//defines where the Graphic will be drawn
AGSPoint* myMarkerPoint =
	[AGSPoint pointWithX:-93.2984
		y:44.9409
		spatialReference:self.mapView.spatialReference];

//Create the Graphic, using the symbol and
//geometry created earlier
AGSGraphic* myGraphic =
	[AGSGraphic graphicWithGeometry:myMarkerPoint
		symbol:myMarkerSymbol
		attributes:nil];

//Add the graphic to the Graphics layer
[myGraphicsLayer addGraphic:myGraphic];

         作為任務結果返回的圖形是一個幾何圖形,但是沒有符號,所以你在將在將這些圖形新增到地圖中去前,需要給其賦予一個符號或是一個渲染器。程式碼如下:

//create a simple fill symbol
AGSSimpleFillSymbol *fillSymbol =
	[AGSSimpleFillSymbol simpleFillSymbol];
fillSymbol.color =
	[[UIColor purpleColor] colorWithAlphaComponent:0.25];
fillSymbol.outline.color = [UIColor darkGrayColor];

//featureSet.features is the result of a Query task.
//It is an array of AGSGraphic objects containing
//geometries, but not symbols.
for (AGSGraphic *graphic in featureSet.features) {
	//set the graphics’s symbol to fillSymbol
	graphic.symbol = fillSymbol;

	//add the graphic to the layer
	[myGraphicsLayer addGraphic:graphic];

}
     使用符號

    常用的符號和其使用的幾何體總結如下表:

Symbol Geometry Description Symbol class
Simple Marker Point Symbolizes points with simple shapes AGSSimplemarkerSymbol
Picture Marker Point Symbolizes points with images AGSPictureMarkerSymbol
Simple Line Polyline Symbolizes lines with pre-defined styles AGSSimpleLineSymbol
Composite Point,Polyline,orPolygon Symbolizes geometry with an array of symbols AGSCompositeSymbol
Simple Fill Polygon Fills Polygons with a variety of patterns AGSSimpleFillSymbol
Text Point,Polyline,orPolygon Displays text labels for geometries AGSTextSymbol

        所有的這些符號類都繼承自AGSSymbol

       下面的這些程式碼建立了AGSSimpleMarkerSymbol,其以藍寶石的形式、三個畫素寬的輪廓繪製。

//Create the AGSSimpleMarker Symbol and set some properties
AGSSimpleMarkerSymbol* myMarkerSymbol = [AGSSimpleMarkerSymbol simpleMarkerSymbol];
myMarkerSymbol.color = [UIColor blueColor];
myMarkerSymbol.style = AGSSimpleMarkerSymbolStyleDiamond;
myMarkerSymbol.outline.color = [UIColor whiteColor];
myMarkerSymbol.outline.width = 3
    下面的程式碼建立了AGSSimpleFillSymbol,其以半透明的紅色填充,紅色的輪廓線進行繪製。
//Create the AGSSimpleFillSymbol and set it’s color
AGSSimpleFillSymbol* myFillSymbol = [AGSSimpleFillSymbol simpleFillSymbol];
myFillSymbol.color = [UIColor colorWithRed:0.7 green:0.1 blue:0.1 alpha:0.5];

//Create the AGSSimpleLineSymbol used for the outline
AGSSimpleLineSymbol* myOutlineSymbol = [AGSSimpleLineSymbol simpleLineSymbol];
myOutlineSymbol.color = [UIColor redColor];
myOutlineSymbol.width = 2;

//set the outline property to myOutlineSymbol
myFillSymbol.outline = myOutlineSymbol;
       使用渲染器

       渲染器定義了應用於圖層中圖形的符號集。你可以利用渲染器,根據圖形的屬性值,以不同的顏色或是尺寸大小來符號化特徵。要使用渲染器,你先要建立它,定義符號,然後為圖層設定渲染特性。

myGraphicsLayer.renderer = myRenderer;
       建立一個簡單的渲染器

       一個簡單的渲染器將相同的符號應用在每一個圖形上。所有你需要所做的就是利用滿足要求的符號建立渲染器,然後將其作為圖形圖層的渲染屬性。

AGSSimpleRenderer* mySimpleRenderer = [AGSSimpleRenderer
simpleRendererWithSymbol:myMarkerSymbol];
myGraphicsLayer.renderer = mySimpleRenderer;
       在AGSSimplerenderer中的符號屬性是隻讀的。利用簡單的渲染器來使用符號,你必須利用符號要求的符號來建立渲染器。同時,符號的型別需要與屬性特徵相匹配。

       建立分類間隔渲染器

       分類間隔渲染器根據圖形的數值屬性來為每個圖形符號化。具有相似的屬性值的圖形獲得相同的符號。“間隔”定義了符號發生變化時的數值。

       符號和數值的對映關係定義在AGSClassBreak 物件的陣列中,AGSClassBreaksrenderer將這種關係儲存在它的classBreaks的屬性中。AGSClassBreak的物件包含了用來繪製圖形的符號、最小值和最大值。

      下面的程式碼根據城市的大小,建立了一個AGSClassBreaksRenderer來符號化城市。共有三個分類:第一個是從DB_MIN到50000,第二個是從50000到250000,最後一級是從250000到DBL_MAX。

//create the renderer with a default simple marker symbol  
//and an attribute field.  
AGSClassBreaksRenderer *cityRenderer = [[[AGSClassBreaksRenderer alloc] init] autorelease];  
cityRenderer.field = @"POP1990";  
cityRenderer.minValue = DBL_MIN;      

//create three AGSClassBreak objects, one each for  
//low, medium and high populations and the appropriate  
//symbol (for clarity, the symbol creation has been omitted)  
AGSClassBreak* lowClassBreak = [AGSClassBreak classBreakInfoWithLabel:@"Low" description:@"" maxValue:50000 symbol:lowMarkerSymbol];    
AGSClassBreak* mediumClassBreak =[AGSClassBreak classBreakInfoWithLabel:@"Medium" description:@"" maxValue:250000 symbol:mediumMarkerSymbol];    
AGSClassBreak* highClassBreak = [AGSClassBreak classBreakInfoWithLabel:@"High" description:@"" maxValue:DBL_MAX symbol:highMarkerSymbol];    

//add the AGSClassBreak objects to the renderer         
cityRenderer.classBreaks = @[lowClassBreak, mediumClassBreak, highClassBreak];


//add the renderer to the graphics layer  
citiesGraphicsLayer.renderer = cityRenderer;

       建立單值渲染器

       單值渲染器符號化一組具有屬性匹配的圖形,這在標準化資料和字串資料中很常用。例如,你可以利用單值渲染器來標識區域名稱:黃色為住宅區、紫色為工廠區、紅色為商業區等等。你也可以將單值渲染器用在編碼值上,或者是有序的屬性值上如一、二、三等。

      下面的程式碼建立了AGSUniqueValueRenderer來為城市的三個值來符號化:VILLAGE、CITY、TOWN,每種型別都用單一的符號來表達TYPE屬性欄位。

//create the renderer  
//specify the attribute field whose values will decide the symbol 
//we need to provide a default symbol for unmatched values
AGSUniqueValueRenderer *cityRenderer = [[[AGSUniqueValueRenderer alloc] init] autorelease];  
cityRenderer.defaultSymbol = defaultMakerSymbol;  
cityRenderer.field1 = @"TYPE";      

//create three AGSUniqueValue objects, one each for  
//CITY, TOWN, and VILLAGE 
AGSUniqueValue* village = [[AGSUniqueValue alloc] initWithValue:@"VILLAGE" label:@"village" description:nil symbol:villageSymbol];  
AGSUniqueValue* city = [[AGSUniqueValue alloc] initWithValue:@"CITY" label:@"city" description:nil symbol:citySymbol];  
AGSUniqueValue* town = [[AGSUniqueValue alloc] initWithValue:@"TOWN" label:@"town" description:nil symbol:townSymbol];    

//add the AGSUniqueValue objects to the renderer
cityRenderer.uniqueValues = @[village, city, town];
 

//add the renderer to the graphics layer  
citiesGraphicsLayer.renderer = cityRenderer;