ArcGIS Runtime SDK for iOS之符號和渲染
本篇文章翻譯自與點擊開啟連結,有不妥之處還請大家多多指正!
符號定義了圖形外觀的非地理方面。它包括了圖形的顏色、線寬、透明度等等。ArcGIS Runtime SDK for iOS包含了許多符號類,其中的每個類可以讓你以獨特的方式指定符號。每個符號的類型也是特定於一個幾何類型(即點、線、面)。
渲染器定義了適用於圖形層的符號集。應用於每個圖層的符號取決於圖形的屬性。渲染器指定哪些屬性值對應於哪個符號。
符號類型
可用的符號和所適用的幾何符號總結在下表中:
符號 |
幾何形狀 |
描述 |
符號類 |
簡單標記 |
點 |
用簡單圖形符號化點 |
AGSSimpleMarkerSymbol |
圖形標記 |
點 |
用映像來符號化點 |
AGSPictureMakerSymbol |
簡單線 |
線 |
用預定義類型來符號化線 |
AGSSimpleLineSymbol |
組合 |
點、線、面 |
用一組符號來符號化幾何圖形 |
AGSCompositeSymbol |
簡單填充 |
面 |
用一系列形式填充面 |
AGSSimpleFillSymbol |
文本 |
點、線、面 |
為幾何形狀展示文本 |
AGSTextSymbol |
上述所有提到的符合類都繼承自AGSSymbol。
建立符號
在許多應用中,相同的符號將多次應用。例如,利用“尋找任務”可以允許使用者搜尋縣。在這種情況下,每次任務被執行時,將相同的符號應用到任務的結果中是很有意義的。在這種情況下,你應該以執行個體變數/屬性類的形式儲存該對象的引用。
下面的代碼建立了用AGSSimpleMakerSymbol繪製一個藍色鑽石,輪廓為白色,且有三個像素寬。
//Create the AGSSimpleMarker Symbol and set some propertiesAGSSimpleMarkerSymbol* myMarkerSymbol = [AGSSimpleMarkerSymbol simpleMarkerSymbol];myMarkerSymbol.color = [UIColor blueColor];myMarkerSymbol.style = AGSSimpleMarkerSymbolStyleDiamond;myMarkerSymbol.outline.color = [UIColor whiteColor];myMarkerSymbol.outline.width = 3;
下面的代碼用半透明的紅色填充和紅色輪廓(兩個像素寬)建立了AGSSimpleFillSymbol。一個簡單填充符號的輪廓是AGSSimpleLineSymbol
//Create the AGSSimpleFillSymbol and set it’s colorAGSSimpleFillSymbol* myFillSymbol = [AGSSimpleFillSymbol simpleFillSymbol];myFillSymbol.color = [UIColor colorWithRed:0.7 green:0.1 blue:0.1 alpha:0.5];//Create the AGSSimpleLineSymbol used for the outlineAGSSimpleLineSymbol* myOutlineSymbol = [AGSSimpleLineSymbol simpleLineSymbol];myOutlineSymbol.color = [UIColor redColor];myOutlineSymbol.width = 2;//set the outline property to myOutlineSymbolmyFillSymbol.outline = myOutlineSymbol;
現在符號已經被聲明,你可以將它跟一個圖形聯絡或在渲染器中使用。
渲染器
渲染器定義了一組符號集,將被用於圖形層中的圖形。你可以用渲染器以不同的顏色和尺寸,基於圖形的屬性值來符號化屬性。要使用渲染,你可以建立它,定義符號,然後設定一個圖形層的渲染特性。
myGraphicsLayer.renderer = myRenderer;
建立一個簡單的渲染
一個簡單的渲染器是指為每個圖形使用相同的符號。所有你需要做的是用要求的符號建立渲染器,然後為圖形層設定渲染特性。
AGSSimpleRenderer* mySimpleRenderer = [AGSSimpleRenderersimpleRendererWithSymbol:myMarkerSymbol];myGraphicsLayer.renderer = mySimpleRenderer;
AGSSimpleRenderer的符號屬性是唯讀。用簡單的渲染器使用一個符號,你必須用需要的符號建立渲染器。此外,符號類型必須於屬性類型匹配(點要素和標記符號、線要素和線符號、面要素和填充符號)。
建立一個層級間隔渲染器
一個層級間隔渲染器是指基於一些數值屬性的值來符號化每個圖形。具有相似屬性值的圖形獲得相同的符號。“間隔”定義了符號發生變化時的屬性值。
符號和值之間的映射被定義在AGSClassBreak對象的數組裡。AGSClassBreaksRenderer 用它的classBreaks屬性儲存區這些映射以作為AGSClassBreak 對象。AGSClassBreak 對象包括用來繪製圖形的的符號、最小值和最大值。任何大於或等於最小值,和小於最大值的值將會用類間斷符號繪製。
下面的代碼建立AGSClassBreaksRenderer並根據大小來符號化城市。總共有3個層級間隔:第一層級是從DBL_MIN到5000,第二基本是從5000到250,000,第三層級是從250,000到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 NSMutableArray* classBreaks = [NSMutableArray array];[classBreaks addObject:lowClassBreak]; [classBreaks addObject:mediumClassBreak];[classBreaks addObject:highClassBreak]; cityRenderer.classBreaks = classBreaks;//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 valuesAGSUniqueValueRenderer *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 addObject:village]; [cityRenderer.uniqueValues addObject:city]; [cityRenderer.uniqueValues addObject:town]; //add the renderer to the graphics layer citiesGraphicsLayer.renderer = cityRenderer;
改變渲染動態圖層
在ArcGIS server 10.1或是更高版本中,動態圖層提供了在用戶端上改變渲染來自ArcGIS Server(非緩衝)地圖服務的能力。在動態圖層上設定圖層定義和繪製選項使得你可以控制在服務中子圖層的內容和顯示方式。
在伺服器上建立渲染器
對於在ArcGIS Server10.1或更高版本中的圖層,你可以用GenerateRendererTask 來建立和返回一個層級間隔或是一個唯一值渲染器。所產生的渲染器然後可以被應用到你地圖中相應的動態圖層中去。
使用任務建立一個唯一值渲染器使得你具備了指定一個色彩坡形過程,從而在渲染器中每一個唯一的符號都可以獲得唯一的一個y顏色。使用GenerateRendererTask,利用一些唯一值為屬性圖層產生一個渲染器,比寫代碼明確定義每個類更有效。
使用任務建立一個類別間隔渲染器可以使你具備用統計分類的方法來確定你的分類範圍的能力。不是用手工來編碼類別間隔最小值和最大值,而是你可以指定所需要的分類數目並應用以下的分類方法之一來確定每一個分類的間隔值:自然分割、等間距、分位元、或是標準差。你也可以選擇利用總的百分比來標準化你的資料、另一個欄位的值或是通過日誌。