專題地圖(Thematic Map)是着重表示一種或數種天然要素特徵或社會經濟現象的地圖數組
專題地圖的內容由兩部分構成:dom
一、專題內容——圖上突出表示的天然或社會經濟現象及其有關特徵ssh
二、地理基礎——用以標明專題要素空間位置與地理背景的普通地圖內容,主要有經緯網、水系、境界、居民地等。函數
專題地圖製做依據要素的一個或多個不一樣的屬性字段,根據字段值賦予地理對象不一樣的符號樣式或者顏色,以區分不一樣屬性值的地理要素。字體
ArcGIS Engine提供了8種標準的着色方案,每一種方案都對應了一類特徵渲染器(Renderer)。spa
特徵渲染器是繪製專題地圖的入口。設計
特徵渲染器使用專題地圖的通常性表示方法,如質底法、點值法、分級比例法等,以目標要素類圖層的某個字段做爲渲染依據,合理渲染不一樣字段值的要素,直至一個要素類中的全部要素都被渲染。完成渲染工做,配上製圖要素——比例尺、指北針、圖名、圖例等後輸出,便可完成一幅專題圖的製做。其中,IGeoFeatureLayer的Renderer屬性提供了專題圖渲染的入口。簡言之,經過對目標圖層的Renderer屬性進行渲染便可完成專題圖的渲染工做。code
下面將介紹五種渲染器的實現方法對象
一、簡單符號法渲染器blog
二、分等級法渲染器
三、惟一值法渲染器
四、比例符號法渲染器
五、點狀密度法渲染器
還剩下三種渲染器之後再實現
六、圖表渲染器
七、分級惟一值法渲染器
八、依比例法渲染器
各種專題圖均用的函數
getRGB(int r, int g, int b)
getGeoLayer(string layerName)
#region 各種專題圖均用的函數 /// <summary> /// 得到顏色的函數 /// </summary> /// <param name="r">紅色Red</param> /// <param name="g">綠色Green</param> /// <param name="b">藍色Blue</param> /// <returns>返回顏色</returns> private IRgbColor getRGB(int r, int g, int b) { IRgbColor pColor = new RgbColorClass(); pColor.Red = r; pColor.Green = g; pColor.Blue = b; return pColor; } /// <summary> /// 獲取渲染圖層 /// </summary> /// <param name="layerName">圖層名字</param> /// <returns>圖層</returns> private IGeoFeatureLayer getGeoLayer(string layerName) { ILayer pLayer; //定義圖層 IGeoFeatureLayer pGeoFeatureLayer; //定義要素圖層 Geo? //遍歷圖層 for (int i = 0; i < axMapControl1.LayerCount; i++) { pLayer = axMapControl1.get_Layer(i); //若當前圖層不爲空且與與layerName的值相同 if (pLayer != null && pLayer.Name == layerName) { //強轉成IGeoFeatureLayer pGeoFeatureLayer = pLayer as IGeoFeatureLayer; //返回pGeoFeatureLayer對象 return pGeoFeatureLayer; } } return null; //返回null } #endregion
一、簡單符號法渲染器
簡單符號法渲染(SimpleRenderer), 用同一個符號繪製全部特徵
①設置簡單填充符號(SimpleFillSymbol)的顏色、樣式、外邊界線等參數
②設置簡單線型符號(SimpleLineSymbol)的樣色和樣式等參數
③實例化簡單渲染(SimpleRender)對象並設置Symbol、Lable、Description等相關參數
④對指定圖層的Render屬性賦值, 完成專題圖製做
⑤刷新主地圖
/// <summary> /// 簡單符號法渲染器(SimpleRenderer), 用同一個符號繪製全部特徵 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 簡單符號法渲染ToolStripMenuItem_Click(object sender, EventArgs e) { //實例化ISimpleFillSysmbol變量, 提供簡單的填充符號類型 ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbolClass(); //設置填充符號的樣式——爲呈45度的交叉線(xxx) ///Horizontal and vertical crosshatch ++++++. pSimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSCross; //設置填充符號的顏色——紅色 pSimpleFillSymbol.Color = getRGB(96, 96, 96); //建立邊線符號變量, 提供簡單的線條符號類型 ISimpleLineSymbol pSimpleLineSymbol = new SimpleLineSymbolClass(); //設置線符號樣式——線呈交替虛線和雙點(_.._.._) //The line has alternating dashes and double dots _.._.._. pSimpleLineSymbol.Style = esriSimpleLineStyle.esriSLSDashDotDot; //設置線符號顏色——綠色 pSimpleLineSymbol.Color = getRGB(255, 0, 0); //設置線符號寬度——1.5 pSimpleLineSymbol.Width = 1.5; //將線符號強轉成ISymbol符號變量 ISymbol pSymbol = pSimpleLineSymbol as ISymbol; //設置符號屬性ROP2爲二元柵格esriROPNotXOrPen pSymbol.ROP2 = esriRasterOpCode.esriROPNotXOrPen; //設置填充符號外邊界的樣式爲pSimpleLineSymbol pSimpleFillSymbol.Outline = pSimpleLineSymbol; //實例化簡單渲染變量 ISimpleRenderer pSimpleRender = new SimpleRendererClass(); //設置pSimpleRender的符號樣式 pSimpleRender.Symbol = pSimpleFillSymbol as ISymbol; //設置標籤名稱, 用於設置圖例 pSimpleRender.Label = "北部灣"; //設置符號描述, 用於設置圖例 pSimpleRender.Description = "簡單渲染"; //定義IGeoFeatureLayer變量, 提供一個要素圖層對成員控制地理特徵渲染的入口, 即Renderer屬性 IGeoFeatureLayer pGeoFeatureLayer; //調用函數獲取渲染圖層 pGeoFeatureLayer = getGeoLayer("北部灣"); if (pGeoFeatureLayer != null) { //調用Renderer屬性, 具體說明如何經過圖層要素渲染器渲染圖層 pGeoFeatureLayer.Renderer = pSimpleRender as IFeatureRenderer; } axMapControl1.Refresh(); //刷新axMapControl1 axTOCControl1.Update(); //更新axTOCControl1 }
二、分等級法渲染器
分等級法渲染器(ClassBreakRenderer), 能夠用分級的顏色和符號來繪製
①得到目標圖層的屬性表後賦值到ITableHistogram對象
②利用IBasicHistogram的GetHistogram方法對屬性表內數據進行統計
③利用IClassifyGEN分級
④實例化分級渲染器(ClassBreakRenderer),渲染全部地圖
⑤賦值目標圖層的Renderer, 完成渲染
⑥刷新地圖
/// <summary> /// 分等級法渲染器(ClassBreakRenderer), 能夠用分級的顏色和符號來繪製 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 分等級法渲染ToolStripMenuItem_Click(object sender, EventArgs e) { //數據分紅10個等級 int classCount = 10; //聲明一個ITableHistogram變量 //該變量用於控制從表格中生成的直方圖的樣式 ITableHistogram pTableHistogram; //聲明一個IBasicHistogram變量 //該變量用於控制從不一樣數據源中生成的直方圖 IBasicHistogram pBasicHistogram; //實例化表格對象 ITable pTable; //獲取生成分級專題圖的目標圖層 IGeoFeatureLayer pGeoFeatureLayer; //獲取渲染圖層 pGeoFeatureLayer = getGeoLayer("北部灣"); //將pGeoFeatureLayer強轉成ILayer ILayer pLayer = pGeoFeatureLayer as ILayer; //將目標圖層(要素類)的屬性表強轉成ITable pTable = pLayer as ITable; //實例化 //BasicTableHistogram採用表對象輸入數據的結構(如天然斷點、分位數)生成直方圖。 pTableHistogram = new BasicTableHistogramClass(); //賦值pTableHistogram的Table屬性字段 pTableHistogram.Table = pTable; //肯定分級字段 pTableHistogram.Field = "年"; //pTableHistogram強制轉換爲IBasicHistogram pBasicHistogram = pTableHistogram as IBasicHistogram; //先統計每一個值出現的次數, 輸出結果賦予values, frequencys object values; object frequencys; //out參數能夠在一個方法中返回多個不一樣類型的值 pBasicHistogram.GetHistogram(out values, out frequencys); //建立平均分級對象 IClassifyGEN pClassifyGEN = new QuantileClass(); //用統計結果(values——值, frequences——出現頻率)進行分級, 級別數目爲classCount pClassifyGEN.Classify(values, frequencys, ref classCount); double[] classes; classes = pClassifyGEN.ClassBreaks as double[]; //得到分級結果, 是個雙精度類型數組 //注意:得到雙精度數組記錄條數出現不可修復性錯誤, 故使用如下代碼修復該錯誤 double[] myclasses; myclasses = new double[classCount]; //當classes不爲null時 if (classes != null) { //遍歷classes, 從後往前移一位 for (int j = 0; j < classCount; j++) { myclasses[j] = classes[j + 1]; } } //定義一個顏色枚舉變量, 經過函數獲取顏色帶 IEnumColors pEnumColors = CreateAlgorithmicColorRamp(myclasses.Length).Colors; IColor color; //聲明並實例化分級渲染器對象類 //該變量提供成員控制漸變色、漸變符號專題圖的製做 IClassBreaksRenderer classBreaksRenderer = new ClassBreaksRendererClass(); //肯定分級渲染的屬性字段 classBreaksRenderer.Field = "年"; //分級數量 classBreaksRenderer.BreakCount = classCount; //指示該專題圖是否按升序顯示 classBreaksRenderer.SortClassesAscending = true; //簡單填充符號(ISimpleFillSymbol) //該變量提供對成員的訪問, 控制簡單的填充符號 ISimpleFillSymbol simpleFillSymbol; //經過一個循環, 給全部渲染的等級附上渲染顏色 for (int i = 0; i < myclasses.Length; i++) { color = pEnumColors.Next(); simpleFillSymbol = new SimpleFillSymbolClass(); simpleFillSymbol.Color = color; //設置填充的樣式(Style)爲實體填充 simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid; //指定分級渲染的符號(Symbol) classBreaksRenderer.set_Symbol(i, simpleFillSymbol as ISymbol); //按照分級進行渲染 classBreaksRenderer.set_Break(i, myclasses[i]); } if (pGeoFeatureLayer != null) { //調用Renderer屬性, 具體說明如何經過圖層要素渲染器繪製圖層 pGeoFeatureLayer.Renderer = classBreaksRenderer as IFeatureRenderer; } axMapControl1.Refresh(); //刷新axMapControl1 axTOCControl1.Update(); //更新axTOCControl1 }
須要用到的函數:CreateAlgorithmicColorRamp(int count)
/// <summary> /// 建立規則的顏色帶 /// </summary> /// <param name="count"></param> /// <returns></returns> private IColorRamp CreateAlgorithmicColorRamp(int count) { //建立一個新漸變色帶(AlgorithmicColorRampClass)對象 IAlgorithmicColorRamp algColorRamp = new AlgorithmicColorRampClass(); IRgbColor fromColor = new RgbColorClass(); IRgbColor toColor = new RgbColorClass(); //建立其實顏色對象, 採用三原色定律 fromColor.Red = 255; fromColor.Green = 235; fromColor.Blue = 214; //建立終止顏色對象 toColor.Red = 196; toColor.Green = 10; toColor.Blue = 10; //設置AlgorithmicColorRampClass的起止顏色屬性 algColorRamp.ToColor = toColor; algColorRamp.FromColor = fromColor; //設置梯度類型 algColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm; //設置顏色帶顏色數量 algColorRamp.Size = count; //建立顏色帶 bool bture = true; algColorRamp.CreateRamp(out bture); return algColorRamp; }
注:out參數能夠在一個方法中返回多個不一樣類型的值
三、惟一值法渲染器
惟一值法渲染器(UniqueValueRender)——根據特徵的某不一樣屬性值來繪製該特徵的符號
①遍歷要素類
②得到渲染字段下的值
③使用IUniqueValueRenderer所提供的Addvalue方法渲染各個值
④賦值目標圖層的Renderer屬性, 完成渲染
⑤刷新地圖
/// <summary> /// 惟一值法渲染器(UniqueValueRender)——根據特徵的某不一樣屬性值來繪製該特徵的符號 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 惟一值法渲染ToolStripMenuItem_Click(object sender, EventArgs e) { //定義IGeoFeatureLayer變量, 提供一個要素圖層對成員控制地理特徵的入口 IGeoFeatureLayer geoFeatureLayer = getGeoLayer("北部灣"); //使用查詢的方式, 得到參與渲染的記錄條數 int get_Count = geoFeatureLayer.FeatureClass.FeatureCount(null); //提供操做惟一值的相關成員 IUniqueValueRenderer uniqueValueRenderer = new UniqueValueRendererClass(); //設置渲染的字段個數範圍:0~3個 //這裏僅設置1個字段 uniqueValueRenderer.FieldCount = 1; //設置渲染字段, 並制定到索引處 //索引從0開始; 設定渲染字段爲"地市名" uniqueValueRenderer.set_Field(0, "地市名"); //簡單填充符號 ISimpleFillSymbol simpleFillSymbol; //得到指向渲染要素的遊標 IFeatureCursor pFtCursor = geoFeatureLayer.FeatureClass.Search(null, false); IFeature pFeature; if (pFtCursor != null) { //定義枚舉顏色帶, 調用函數, 生成隨機顏色帶 IEnumColors enumColors = CreateRandomColorRamp(get_Count).Colors; //查找到"地市名"字段的索引(index) int fieldIndex = geoFeatureLayer.FeatureClass.Fields.FindField("地市名"); while ((pFeature = pFtCursor.NextFeature()) != null) { //獲取要素值 string nameValue = pFeature.get_Value(fieldIndex).ToString(); //實例化填充符號 //使用填充符號來賦值地圖的背景值 simpleFillSymbol = new SimpleFillSymbolClass(); //給要素附上樣式 simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid; //給要素附上顏色 simpleFillSymbol.Color = enumColors.Next() as IColor; //值和符號對應 uniqueValueRenderer.AddValue(nameValue, "地市", simpleFillSymbol as ISymbol); } } //賦值目標圖層的渲染器屬性 geoFeatureLayer.Renderer = uniqueValueRenderer as IFeatureRenderer; axMapControl1.Refresh(); //刷新axMapControl1 axTOCControl1.Update(); //更新axTOCControl1 }
須要用到的函數:CreateRandomColorRamp(int Number)
/// <summary> /// 建立隨機的顏色條帶 /// </summary> /// <param name="Number"></param> /// <returns></returns> private IColorRamp CreateRandomColorRamp(int Number) { //請注意色度、飽和度、最大值、最小值、隨機種子數等參數的設定 //參數不一樣, 所產生的色帶也不一樣 IRandomColorRamp pRandomColorRamp = new RandomColorRampClass(); pRandomColorRamp.StartHue = 0; //開始色度 pRandomColorRamp.EndHue = 360; pRandomColorRamp.MinValue = 99; pRandomColorRamp.MaxValue = 100; pRandomColorRamp.MinSaturation = 15; //最小飽和度 pRandomColorRamp.MaxSaturation = 30; //最大飽和度 pRandomColorRamp.Size = Number; //設置顏色帶數量 pRandomColorRamp.Seed = 23; //隨機數種子 bool bture = true; pRandomColorRamp.CreateRamp(out bture); return pRandomColorRamp; }
四、比例符號法渲染器
比例符號法渲染器(ProportionalSymbolRenderer)——用不一樣大小的符號繪製要素, 其大小對應某一字段值的比例。
①統計目標字段, 得到相關統計值
②設計標記符號
③補充完整ProportionalSymbolRenderer對象的重要屬性值
④賦值目標圖層的Renderer屬性, 完成渲染
⑤刷新地圖
/// <summary> /// 比例符號法渲染器(ProportionalSymbolRenderer)——用不一樣大小的符號繪製要素, 其大小對應某一字段值的比例。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 比例符號法渲染ToolStripMenuItem_Click(object sender, EventArgs e) { //聲明IGeoFeatureLayer變量, 提供一個要素圖層對成員控制地理特徵的入口 IGeoFeatureLayer geoFeatureLayer; //聲明要素圖層 IFeatureLayer pFtLayer; //聲明專題圖變量 //在利用該方法進行着色時, 需得到最大和最小標識符號所表明的字段及其各個數值, 還須要肯定每一個字段數值所匹配的着色符號。 IProportionalSymbolRenderer proportionalSymbolRenderer; //聲明表格 ITable table; //聲明遊標 ICursor cursor; //用於統計變量 IDataStatistics dataStatistics; //用於存放統計結果 IStatisticsResults statisticsResults; //聲明一個字體對象 stdole.IFontDisp fontDisp; //獲取圖層 geoFeatureLayer = getGeoLayer("北部灣"); //強轉爲要素圖層 pFtLayer = geoFeatureLayer as IFeatureLayer; //圖層類型轉換成表 table = geoFeatureLayer as ITable; //獲取遊標 cursor = table.Search(null, true); //實例化數據統計對象 dataStatistics = new DataStatisticsClass(); //賦遊標給數據統計對象的遊標 dataStatistics.Cursor = cursor; //獲取圖層要素中進行專題地圖製圖的字段名稱, 此實例中所用的數據中字段名爲"年"(2010年GDP增加速率) dataStatistics.Field = "年"; //存放統計結果爲統計對象的統計數據 statisticsResults = dataStatistics.Statistics; //若是統計結果不爲空 if (statisticsResults != null) { //簡單填充符號 IFillSymbol fillSymbol = new SimpleFillSymbolClass(); //設置顏色 fillSymbol.Color = getRGB(195, 255, 255); //設置簡單線型符號 ISimpleLineSymbol SLS = new SimpleLineSymbolClass(); SLS.Color = getRGB(196, 196, 196);//顏色 SLS.Width = 1.5;//寬度 fillSymbol.Outline = SLS;//外邊界線 //利用ESRI特殊符號調用成員進行填充 ICharacterMarkerSymbol characterMarkerSymbol = new CharacterMarkerSymbolClass(); fontDisp = new stdole.StdFontClass() as stdole.IFontDisp; //調用指定子庫(ESRI Default Marker是子庫名稱) fontDisp.Name = "ESRI Default Marker"; //對characterMarkerSymbol的font屬性 characterMarkerSymbol.Font = fontDisp; //特徵標記符號(Character Marker Symbol)的索引值 //0xB6是C#特殊的16進製表示方法, 換算爲十進制值182 characterMarkerSymbol.CharacterIndex = 0xB6; //特徵標記符號的顏色 characterMarkerSymbol.Color = getRGB(253, 191, 110); //設計特徵標記符號的尺寸 characterMarkerSymbol.Size = 18; //實例化一個比例符號渲染器 proportionalSymbolRenderer = new ProportionalSymbolRendererClass(); proportionalSymbolRenderer.ValueUnit = esriUnits.esriUnknownUnits; //獲取渲染字段 proportionalSymbolRenderer.Field = "年"; //是否啓用顏色補償(默認爲否) proportionalSymbolRenderer.FlanneryCompensation = false; //賦值統計數據(比例符號渲染器) //MinDataValue獲取數據中最小值 proportionalSymbolRenderer.MinDataValue = statisticsResults.Minimum; //獲取數據中最大值 proportionalSymbolRenderer.MaxDataValue = statisticsResults.Maximum; //在多邊形特徵上繪製比例標記符號時使用的背景填充符號 proportionalSymbolRenderer.BackgroundSymbol = fillSymbol; //用於繪製具備規格化最小數據值的特徵的符號。 proportionalSymbolRenderer.MinSymbol = characterMarkerSymbol as ISymbol; //目錄和圖例中顯示的符號數爲3 proportionalSymbolRenderer.LegendSymbolCount = 3; //建立圖例, 設置完全部屬性後調用。 proportionalSymbolRenderer.CreateLegendSymbols(); //賦值目標圖層的渲染器屬性 geoFeatureLayer.Renderer = proportionalSymbolRenderer as IFeatureRenderer; } axMapControl1.Refresh(); //刷新axMapControl1 axTOCControl1.Update(); //更新axTOCControl1 }
五、點狀密度法渲染器
點狀密度法渲染器(DotDensityRenderer)——在多邊形特徵中繪製不一樣密度的點
①製做點符號
②使用IDotDensityFillSymbo包裝製做好的符號
③賦值點密度渲染(dotDensityRenderer)的點密度符號(DotDensitySymbol)屬性
④賦值其它參數
⑤賦值目標圖層的Renderer屬性, 完成渲染
⑥刷新地圖
/// <summary> /// 點狀密度法渲染器(DotDensityRenderer)——在多邊形特徵中繪製不一樣密度的點 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 點狀密度法渲染ToolStripMenuItem_Click(object sender, EventArgs e) { //聲明IGeoFeatureLayer變量, 提供一個要素圖層對成員控制地理特徵的入口 IGeoFeatureLayer geoFeatureLayer; //定義點密度填充符號變量, 控制點符號的屬性 IDotDensityFillSymbol dotDensityFillSymbol; //定義點密度渲染對象 IDotDensityRenderer dotDensityRenderer; //獲取渲染圖層 geoFeatureLayer = getGeoLayer("北部灣"); //實例化點密度渲染對象 dotDensityRenderer = new DotDensityRendererClass(); //強轉點密度渲染對象並強轉成渲染字段對象 IRendererFields rendererFields = dotDensityRenderer as IRendererFields; //設置渲染字段 string field1 = "年"; //向渲染器添加字段(字段名、別名) rendererFields.AddField(field1, field1); //實例化點密度填充符號 dotDensityFillSymbol = new DotDensityFillSymbolClass(); dotDensityFillSymbol.DotSize = 4;//設置點的大小 dotDensityFillSymbol.Color = getRGB(0, 255, 0);//設置點的顏色 //將點密度填充符號強轉爲符號數組成員 ISymbolArray symbolArray = dotDensityFillSymbol as ISymbolArray; //實例化簡單標記符號 ISimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbolClass(); //設置點的符號爲圓圈 simpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSCircle; simpleMarkerSymbol.Size = 4;//設置大小 simpleMarkerSymbol.Color = getRGB(0, 255, 0);//設置顏色 //點符號的外邊不填充顏色 simpleMarkerSymbol.OutlineColor = getNoRGB(); //將簡單標記符號樣式增長到符號數組成員中 symbolArray.AddSymbol(simpleMarkerSymbol as ISymbol); //賦值點密度渲染(dotDensityRenderer)的點密度符號(DotDensitySymbol)屬性 dotDensityRenderer.DotDensitySymbol = dotDensityFillSymbol; //設置渲染密度 dotDensityRenderer.DotValue = 0.003; //設置點密度填充符號的背景色 dotDensityFillSymbol.BackgroundColor = getRGB(255, 255, 255); //建立圖例 dotDensityRenderer.CreateLegend(); //賦值目標圖層的渲染器屬性 geoFeatureLayer.Renderer = dotDensityRenderer as IFeatureRenderer; axMapControl1.Refresh(); //刷新axMapControl1 axTOCControl1.Update(); //更新axTOCControl1 }
須要用到的函數:getNoRGB()
/// <summary> /// 不填充顏色 /// </summary> /// <returns></returns> private IColor getNoRGB() { IRgbColor pColor = new RgbColorClass(); //.NullColor指示此顏色是否爲空。true代表顏色爲空 pColor.NullColor = true; return pColor;//返回pColor }
謝謝觀看!本人初學GIS二次開發,若是有不對的地方,請多多包涵!