地图加载和显示控制
图层
ILayer:所有图层 ILayer:所有图层 IFeatureLayer:矢量要素图层,继承ILayer IFeatureLayer:矢量要素图层,继承ILayer IGeoFeatureLayer:提供矢量要素图层的符 IGeoFeatureLayer:提供矢量要素图层的符 号化和标注支持,继承IFeatureLayer 号化和标注支持,继承IFeatureLayer IRasterLayer:栅格图层,继承ILayer IRasterLayer:栅格图层,继承ILayer
MapControl的图层管理 MapControl的图层管理
AddLayer(layer, index) AddLayerFromFile(path, index) AddShapeFile(path, filename) DeleteLayer(index) MoveLayerTo(fromIndex, toIndex) get_Layer(index) LayerCount
添加ShapeFile图层 添加ShapeFile图层
void AddShapeFileToMap(string shapeFolder, string shapeFile) { m_mapControl. AddShapeFile(shapeFolder, AddShapeFile(shapeFolder, shapeFile) shapeFile) ; }
void AddShapeFileToMap(string shapeFolder, string shapeFile) { IWorkspaceFactory wsf = new ShapefileWorkspaceFactoryClass(); IFeatureWorkspace ws = wsf.OpenFromFile(shapeFolder, 0) as IFeatureWorkspace; IFeatureClass fc = ws.OpenFeatureClass(shapeFile); IFeatureLayer layer = new FeatureLayerClass(); layer.FeatureClass = fc; layer.Name = (fc as IDataset).Name; m_mapControl.AddLayer(layer, 0); }
添加栅格图层
void AddRasterFileToMap(string rasterFolder, string rasterFile) { IRasterLayer layer = new RasterLayerClass(); layer.CreateFromFilePath(rasterFolder + "\\" + "\ rasterFile); layer.Name = rasterFile; m_mapControl.AddLayer(layer, 0); }
void AddRasterFileToMap (string folderName, string datasetName) { IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass(); IRasterWorkspace rasterWorkspace = (IRasterWorkspace)workspaceFactory.OpenFromFile(folderName, 0); IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(datasetName); IRasterLayer rasterLayer = new RasterLayerClass(); rasterLayer.CreateFromDataset(rasterDataset); m_mapControl.AddLayer(layer, 0); }
地图缩放的控制
修改m_mapControl.Extent可达到缩放效果。 修改m_mapControl.Extent可达到缩放效果。 缩放到任意范围:构建一个Envelope 缩放到任意范围:构建一个Envelope 缩放到图层:ILayer. 缩放到图层:ILayer. AreaOfInterest 缩放到某地物:IGeometry.Envelope 缩放到某地物:IGeometry.Envelope 缩放到选择集:合并选择集中所有 Geometry的 Geometry的Envelope
图层的Visible控制 图层的Visible控制
ILayer.Visible
几何图形
IGeometry:几何图形 IGeometry:几何图形 IPoint:点状图形,继承IGeometry IPoint:点状图形,继承IGeometry IEnvelope:矩形,继承IGeometry IEnvelope:矩形,继承IGeometry IPolygon:多边形,继承IGeometry IPolygon:多边形,继承IGeometry IPolyline:线,继承IGeometry IPolyline:线,继承IGeometry
符号
ISymbol:符号 ISymbol:符号 IMarkerSymbol:点状符号 IMarkerSymbol:点状符号 ILineSymbol:线状符号(线型) ILineSymbol:线状符号(线型) IFillSymbol:填充符号(填充图案) IFillSymbol:填充符号(填充图案)
SimpleMarkerSymbol
ISimpleMarkerSymbol CreateSimpleMarkerSymbol(IRgbColor rgbColor, esriSimpleMarkerStyle inputStyle) { if(rgbColor == null || inputStyle == null) { return null; } ISimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbolClass(); simpleMarkerSymbol.Color = rgbColor; simpleMarkerSymbol.Style = inputStyle; return simpleMarkerSymbol; }
SimpleLineSymbol
public ISimpleLineSymbol CreateSimpleLineSymbol(IRgbColor rgbColor, double inWidth, esriSimpleLineStyle inStyle) { if(rgbColor == null) { return null; } ISimpleLineSymbol simpleLineSymbol = new SimpleLineSymbolClass(); simpleLineSymbol.Style = inStyle; simpleLineSymbol.Color = rgbColor; simpleLineSymbol.Width = inWidth; return simpleLineSymbol; }
SimpleFillSymbol
public ISimpleFillSymbol CreateSimpleFillSymbol(IRgbColor fillColor, esriSimpleFillStyle fillStyle, IRgbColor borderColor, esriSimpleLineStyle borderStyle, double borderWidth) { if(fillColor == null || fillStyle == null || borderColor == null || borderStyle == null) { return null; } ISimpleLineSymbol simpleLineSymbol = new SimpleLineSymbolClass(); simpleLineSymbol.Width = borderWidth; simpleLineSymbol.Color = borderColor; simpleLineSymbol.Style = borderStyle; ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass(); simpleFillSymbol.Outline = simpleLineSymbol; simpleFillSymbol.Style = fillStyle; simpleFillSymbol.Color = fillColor; return simpleFillSymbol; }
矢量图层渲染
矢量图层: IFeatureRenderer IGeoFeatureLayer.Renderer; 设置新的Renderer后刷新 设置新的Renderer后刷新 layer.Renderer = renderer; m_mapControl.ActiveView.Refresh(); m_tocControl.Update();
IFeatureRenderer
ISimpleRenderer:简单渲染(所有要素采 ISimpleRenderer:简单渲染(所有要素采 用相同的渲染方式) IUniqueValueRenderer:唯一值分类渲染 IUniqueValueRenderer:唯一值分类渲染 IClassBreaksRenderer:连续值分级渲染 IClassBreaksRenderer:连续值分级渲染
SimpleRenderer
所有要素采用相同的渲染方式 根据图层的要素类型创建一个Symbol 根据图层的要素类型创建一个Symbol
void SetFeatureLayerSimpleRenderer(IFeatureLayer layer, IColor outlineColor, outlineColor, IColor fillColor) fillColor) { ISimpleRenderer pRender = new SimpleRendererClass(); ISimpleFillSymbol symd = new SimpleFillSymbolClass(); symd.Style = esriSimpleFillStyle.esriSFSSolid; symd.Color = fillColor; fillColor; pRender.Symbol = symd as ISymbol; (layer as IGeoFeatureLayer).Renderer = pRender as IFeatureRenderer; }
UniqueValueRenderer
字段:至少一个,离散类型,一般式整数 或字符串 有限的字段值 每个字段值对应的Symbol 每个字段值对应的Symbol 每个字段值对应的Label 每个字段值对应的Label DefaultSymbol
private static void SetFeatureLayerUniqueValueRenderer(IFeatureLayer layer, string field, string[] values, IColor[] colors) { IUniqueValueRenderer pRender = new UniqueValueRendererClass(); ISimpleFillSymbol symd = new SimpleFillSymbolClass(); symd.Style = esriSimpleFillStyle.esriSFSSolid; symd.Outline.Width = 0.4; pRender.FieldCount = 1; pRender.set_Field(0, field); pRender.DefaultSymbol = symd as ISymbol; pRender.UseDefaultSymbol = true; for (int i = 0; i < values.Length; i++) { ISimpleFillSymbol symx = new SimpleFillSymbolClass(); symx.Style = esriSimpleFillStyle.esriSFSSolid; symx.Outline.Width = 0.4; symx.Color = colors[i]; pRender.AddValue(values[i], field, symx as ISymbol); pRender.set_Label(values[i], values[i]); } pRender.ColorScheme = "Custom"; pRender.set_FieldType(0, true); // 表明字段是否为string类型 表明字段是否为string类型 (layer as IGeoFeatureLayer).Renderer = pRender as IFeatureRenderer; }
ClassBreaksRenderer
字段:必须是数值类型 MinimumBreak:最小分段值 MinimumBreak:最小分段值 Breaks:分段值(不含MinimumBreak), Breaks:分段值(不含MinimumBreak), 需要n 需要n个 每段对应的Symbol 每段对应的Symbol 每段对应的Label 每段对应的Label 可用AlgorithmicColorRamp来设置渐变颜色 可用AlgorithmicColorRamp来设置渐变颜色
IClassBreaksRenderer CreateClassBreaksRenderer(string field, double[] breaks, IColor[] breaks, colors) colors) { IClassBreaksRenderer pRender = new ClassBreaksRendererClass(); pRender.Field = field; pRender.BreakCount = breaks.Length-1; breaks.LengthpRender.MinimumBreak = breaks[0]; for (int i = 0; i < breaks.Length-1; i++) breaks.Length{ pRender.set_Break(i, breaks[i + 1]); pRender.set_Label(i, string.Format("{0} - {1}", breaks[i], breaks[i + 1])); IFillSymbol pSimpleFillSym = new SimpleFillSymbolClass(); pSimpleFillSym.Color = colors[i]; colors[i]; pRender.set_Symbol(i, pSimpleFillSym as ISymbol); } return pRender; }
用AlgorithmicColorRamp获得渐变颜色 AlgorithmicColorRamp获得渐变颜色
IAlgorithmicColorRamp pColorRamp = new AlgorithmicColorRamp(); pColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm; IRgbColor pColor1 = new RgbColorClass() ; IRgbColor pColor2 = new RgbColorClass(); pColor1.Red = 255; pColor1.Green = 210; pColor1.Blue = 210; pColor2.Red = 190; pColor2.Green = 0; pColor2.Blue = 170; pColorRamp.FromColor = pColor1; pColorRamp.ToColor = pColor2; pColorRamp.Size = breaks.Length; bool ok; pColorRamp.CreateRamp(out ok); IEnumColors pEnumColors = pColorRamp.Colors; pEnumColors.Reset(); 。。。 pSimpleFillSym.Color = pEnumColors.Next(); 。。。
栅格图层渲染
栅格图层 IRasterRenderer IRasterLayer.Renderer; 设置新的Renderer后刷新 设置新的Renderer后刷新 renderer.Update(); layer.Renderer = renderer; m_mapControl.ActiveView.Refresh(); m_tocControl.Update();
IRasterRenderer
IRasterUniqueValueRenderer:唯一值分类 IRasterUniqueValueRenderer:唯一值分类 渲染 IRasterClassifyColorRampRenderer:连续 IRasterClassifyColorRampRenderer:连续 值分级渲染 IRasterRGBRenderer:RGB渲染,指定R IRasterRGBRenderer:RGB渲染,指定R、 G、B波段
RasterUniqueValueRenderer
一般针对有RasterAttributeTable的栅格 一般针对有RasterAttributeTable的栅格 RAT: OID、VALUE、COUNT、用户字段(optional) OID、VALUE、COUNT、用户字段(optional) Raster:IRasterLayer.Raster、 Raster:IRasterLayer.Raster、 IRasterDataset.CreateDefaultRaster() 字段 字段值:从RAT来 字段值:从RAT来 每个字段值对应的符号(FillSymbol) 每个字段值对应的符号(FillSymbol) 每个字段值对应的Label 每个字段值对应的Label 可用RandomColorRamp获得随机颜色 可用RandomColorRamp获得随机颜色
public IRasterRenderer UnqueValueRenderer(IRasterLayer rasterLayer) { IRaster2 raster = (IRaster2)rasterLayer.Raster; ITable rasterTable = raster.AttributeTable; if (rasterTable == null) return null; int tableRows = rasterTable.RowCount(null); IRgbColor[] colors = new RgbColorClass[tableRows]; RgbColorClass[tableRows]; 。。。 IRasterUniqueValueRenderer uvRenderer = new RasterUniqueValueRendererClass(); IRasterRenderer rasterRenderer = (IRasterRenderer)uvRenderer; rasterRenderer.Raster = rasterLayer.Raster; rasterRenderer.Update(); uvRenderer.set_ClassCount(0, tableRows); uvRenderer.Field = "Value"; //Or any other field in the table. IRow row; ISimpleFillSymbol fillSymbol; for (int i = 0; i < tableRows; i++) { row = rasterTable.GetRow(i); uvRenderer.AddValue(0, i, Convert.ToByte(row.get_Value(1))); // Assuming the raster is 88bit. uvRenderer.set_Label(0, i, Convert.ToString(row.get_Value(1))); fillSymbol = new SimpleFillSymbolClass(); fillSymbol.Color = color[i]; olor[ uvRenderer.set_Symbol(0, i, (ISymbol)fillSymbol); } return rasterRenderer; }
用RandomColorRamp获得随机颜色 RandomColorRamp获得随机颜色
int tableRows = rasterTable.RowCount(null); IRandomColorRamp colorRamp = new RandomColorRampClass(); colorRamp.Size = tableRows; colorRamp.Seed = 100; bool createColorRamp; colorRamp.CreateRamp(out createColorRamp); … fillSymbol.Color = colorRamp.get_Color(i); …
RasterClassifyColorRampRenderer
针对连续值的栅格 Raster:IRasterLayer.Raster、 Raster:IRasterLayer.Raster、 IRasterDataset.CreateDefaultRaster() ClassCount,自动按 ClassCount,自动按NaturalBreaks方式计算 Breaks进行分段,也可设为其他方式或者直接设 Breaks进行分段,也可设为其他方式或者直接设 置Break值。 Break值。 每段对应的符号(FillSymbol) 每段对应的符号(FillSymbol) 每段对应的Label 每段对应的Label 可使用AlgorithmicColorRamp获得渐变颜色 可使用AlgorithmicColorRamp获得渐变颜色
public IRasterRenderer ClassifyRenderer(IRasterLayer rasterLayer) ClassifyRenderer(IRasterLayer rasterLayer) { IRasterClassifyColorRampRenderer classifyRenderer = new RasterClassifyColorRampRendererClass(); IRasterRenderer rasterRenderer = (IRasterRenderer)classifyRenderer; IRaster raster = rasterLayer.Raster; rasterLayer.Raster; rasterRenderer.Raster = raster; classifyRenderer.ClassCount = 3; // NaturalBreaksrasterRenderer.Update(); IAlgorithmicColorRamp colorRamp = new AlgorithmicColorRampClass(); colorRamp.Size = 3; bool createColorRamp; colorRamp.CreateRamp(out createColorRamp); IFillSymbol fillSymbol = new SimpleFillSymbolClass(); for (int i = 0; i < classifyRenderer.ClassCount; i++) { fillSymbol.Color = colorRamp.get_Color(i); classifyRenderer.set_Symbol(i, (ISymbol)fillSymbol); classifyRenderer.set_Label(i, Convert.ToString(i)); } return rasterRenderer; }
标签: arcgis二次开发