private void ShowAttribute(IGeometry geometry) { if (FeatureLayer != null) { IArray array = AttributeExtensions.Identity(FeatureLayer.FeatureClass, geometry, WhereClause); if (array != null) { IFeatureIdentifyObj featureIdentifyObj = array.get_Element(0) as IFeatureIdentifyObj; IIdentifyObj identifyObj = featureIdentifyObj as IIdentifyObj; IRowIdentifyObject rowIdentifyObj = featureIdentifyObj as IRowIdentifyObject; IFeature feature = rowIdentifyObj.Row as IFeature; if (feature != null) { _father.dataGridView1.DataSource = GetAttribute(feature); //_father.ExportExcelbutton.Enabled = true; var tbbh = _featureValues.FirstOrDefault(e => e.Name == "TBBH"); var xzcdm = _featureValues.FirstOrDefault(e => e.Name == "XZCDM"); _father.Search(xzcdm.Value, tbbh.Value); Application.DoEvents(); Twinkle(feature); } else { //_father.ExportExcelbutton.Enabled = false; } } } }
private void DisplayIdentifyResults() { //清空以前所有显示结果 trvFeatures.Nodes.Clear(); //初始化属性显示窗口数据 lstAttribute.Items.Clear(); lstAttribute.Columns.Clear(); //声明变量 List <IFeatureIdentifyObj> IdentifyObjs = null; IFeatureIdentifyObj IdentifyObj = null; //列出查询结果 int resultsCount = identifiedResultsList.Count; for (int i = 0; i < resultsCount; i++) { LayerIdentifiedResult layerIdentifiedResult = identifiedResultsList[i]; //添加图层节点 TreeNode layerNode = trvFeatures.Nodes.Add(layerIdentifiedResult.IdentifyLayer.Name); //添加要素节点 IdentifyObjs = layerIdentifiedResult.IdentifiedFeatureObjList; for (int k = 0; k < IdentifyObjs.Count; k++) { IdentifyObj = IdentifyObjs[k]; IRowIdentifyObject rowIdentifyObj = IdentifyObj as IRowIdentifyObject; IFeature identifyFeature = rowIdentifyObj.Row as IFeature; layerNode.Nodes.Add(identifyFeature.OID.ToString()); } } //展开所有节点 trvFeatures.ExpandAll(); //默认显示第一图层的第一个查询要素 if (trvFeatures.Nodes.Count < 1) { ShowClickedNodeInfo(null, false); } //显示第一图层的第一个查询要素 else { TreeNode topNode = trvFeatures.Nodes[0].Nodes[0]; //显示第一节点 trvFeatures.TopNode = topNode.Parent; ShowClickedNodeInfo(topNode, false); } }
private void MapUserIdentify(double mapX, double mapY) { try { //axMapControl1.Map.ClearSelection(); ESRI.ArcGIS.Controls.IMapControl3 m_mapControl = (IMapControl3)axMapControl1.Object; IMap pMap = axMapControl1.Map; IGroupLayer pGroupLayer = new GroupLayer(); if (pMap.LayerCount == 0) { return; } IEnumLayer pEnumLayer; ILayer pLayer; pEnumLayer = pMap.get_Layers(null, true); if (pEnumLayer == null) { return; } pEnumLayer.Reset(); double dCurrScale = m_mapControl.MapScale; for (pLayer = pEnumLayer.Next(); pLayer != null; pLayer = pEnumLayer.Next()) { if (pLayer.Visible) { if (pLayer is IGroupLayer) { continue; } if (pLayer.MinimumScale != 0 && dCurrScale > pLayer.MinimumScale) { continue; } if (pLayer.MaximumScale != 0 && dCurrScale < pLayer.MaximumScale) { continue; } pGroupLayer.Add(pLayer); } } IPoint pPoint = new ESRI.ArcGIS.Geometry.Point(); pPoint.X = mapX; pPoint.Y = mapY; IIdentifyObj pIdObj; IIdentify pIdentify = pGroupLayer as IIdentify; IArray pIDArray; IFeatureIdentifyObj pFeatIdObj; IEnvelope pEnv = pPoint.Envelope; IDisplayTransformation pDT = m_mapControl.ActiveView.ScreenDisplay.DisplayTransformation; pEnv.Expand(pDT.VisibleBounds.Width / 200, pDT.VisibleBounds.Height / 200, false); pIDArray = pIdentify.Identify(pEnv); if (pIDArray == null || pIDArray.Count == 0) { return; } pFeatIdObj = pIDArray.get_Element(0) as IFeatureIdentifyObj; pIdObj = pFeatIdObj as IIdentifyObj; IRowIdentifyObject pRowIdentifyObj = pFeatIdObj as IRowIdentifyObject; IFeature pFeature = pRowIdentifyObj.Row as IFeature; if (pFeature != null && pFeature.Shape != null && !pFeature.Shape.IsEmpty) { //axMapControl1.FlashShape(pFeature.Shape); axMapControl1.Map.SelectFeature(pIdObj.Layer, pFeature); FlashFeature(axMapControl1, pFeature.Shape); } // pIdObj.Flash(m_mapControl.ActiveView.ScreenDisplay);//The Flash method is not supported with ArcGIS Engine, use the IHookActions.DoActions() method with the esriHookActionsFlash for this functionality. ILayer pIdentiyLayer = pIdObj.Layer; DataTable pTable = new DataTable(); DataColumn pDataColumn = pTable.Columns.Add(); pDataColumn.ColumnName = "列名"; pDataColumn = pTable.Columns.Add(); pDataColumn.ColumnName = "值"; DataRow pFirestDataRow = pTable.Rows.Add(); pFirestDataRow[0] = "所在层"; pFirestDataRow[1] = pIdentiyLayer.Name; if (pIdentiyLayer is IFeatureLayer) { IRowIdentifyObject pRowObj = pIdObj as IRowIdentifyObject; // IRow pRow = pRowObj.Row; IFeature pRow = pRowObj.Row as IFeature; IFields pFields = pRow.Fields; for (int i = 0; i < pFields.FieldCount; i++) { IField pField = pFields.get_Field(i); DataRow pDataRow = null; /* * switch (pField.Type) * { * case esriFieldType.esriFieldTypeOID: * pDataRow = pTable.Rows.Add(); * pDataRow[0] = pField.Name; * pDataRow[1] = pRow.OID.ToString(); * break; * case esriFieldType.esriFieldTypeGeometry: * //pDataRow[0] = "Geometry"; * //pDataRow[1] = QueryShapeType(pField.GeometryDef.GeometryType);; * break; * default: * pDataRow = pTable.Rows.Add(); * pDataRow[0] = pField.Name; * pDataRow[1] = pRow.get_Value(i).ToString(); * break; * } * * */ ////////////////////////////////////////////////// string sValue = pRow.get_Value(i).ToString(); string strFName = pField.AliasName.ToUpper(); string strUName = strFName.ToUpper(); if (strUName == "SHAPE" || strUName == "LENGTH" || strUName == "OBJECTID" || strUName == "ID" || strUName == "FNODE_" || strUName == "TNODE_" || strUName == "LPOLY_" || strUName == "RPOLY_" || strUName == "SDXL_" || strUName == "SDXL_ID" || strUName == "OBJECTID_1" || strUName == "FID") { continue; } else if (strUName == "SHAPE.LEN" || strUName == "SHAPE_LENG") { strFName = "几何长度"; } else if (strUName == "SHAPE_AREA" || strUName == "SHAPE.AREA") { strFName = "多边形面积"; } else if (strUName == "HEIGHT") { strFName = "高程"; } else if (strUName == "NAME") { strFName = "名称"; } else if (strUName == "TYPE") { strFName = "类型"; } else if (strUName == "SUBTYPE") { strFName = "子类型"; } if (strUName == "LENGTH" || strUName == "SHAPE.LEN") { IUnitConverter myUnit = new UnitConverterClass(); sValue = Math.Round(myUnit.ConvertUnits((double)pRow.get_Value(i), esriUnits.esriMeters, esriUnits.esriKilometers), 2).ToString(); sValue = sValue.ToString() + "千米"; } if (strUName == "SHAPE_AREA" || strUName == "SHAPE.AREA") { IGeometry pGeo = pRow.ShapeCopy; pGeo.Project(axMapControl1.Map.SpatialReference); IPolygon pPolygon = (IPolygon)pGeo; IArea pArea = (IArea)pPolygon; double strValue = pArea.Area * 0.000001; //// double strValue = Math.Abs((double)pFeature.get_Value(j)) * 10585; strValue = Math.Round(strValue, 2); sValue = strValue.ToString() + "平方千米"; } esriFieldType tFieldTypy = pField.Type; if (tFieldTypy == esriFieldType.esriFieldTypeGeometry) { sValue = pField.GeometryDef.GeometryType.ToString(); sValue = sValue.Substring(12, sValue.Length - 12); } pDataRow = pTable.Rows.Add(); pDataRow[0] = strFName; pDataRow[1] = sValue; ////////////////////////////////////////////////// } } else if (pIdentiyLayer is ITinLayer) { ITinLayer pTinLayer = (ITinLayer)pIdentiyLayer; ITinSurface pTinSurface = (ITinSurface)pTinLayer.Dataset; if (pTinSurface == null) { return; } ITinSurfaceElement pTinSurfaceElement = pTinSurface.GetSurfaceElement(pPoint); if (pTinSurfaceElement == null) { return; } IFields pFields = pTinLayer.Dataset.Fields; DataRow pDataRow = null; pDataRow = pTable.Rows.Add(); pDataRow[0] = "高度"; pDataRow[1] = pTinSurfaceElement.Elevation.ToString(); pDataRow = pTable.Rows.Add(); pDataRow[0] = "坡度"; pDataRow[1] = pTinSurfaceElement.SlopeDegrees.ToString(); pDataRow = pTable.Rows.Add(); pDataRow[0] = "方向"; pDataRow[1] = pTinSurfaceElement.AspectDegrees.ToString(); } if (pIdentiyLayer is IRasterLayer) { MessageBox.Show("aa"); } //ShowIndetify(pTable); //m_pMainform.ShowIndetify(pTable); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); return; } }
protected override void OnMouseDown(ESRI.ArcGIS.Desktop.AddIns.Tool.MouseEventArgs arg) { int X = arg.X; int Y = arg.Y; IMxApplication pMxApp = null; IMxDocument pMxDoc = null; pMxApp = (IMxApplication)ArcMap.Application; pMxDoc = (IMxDocument)ArcMap.Application.Document; // calculate tolerance rectangle to identify features inside it int Tolerance = 0; Tolerance = pMxDoc.SearchTolerancePixels; IDisplayTransformation pDispTrans = null; pDispTrans = pMxApp.Display.DisplayTransformation; tagRECT pToleranceRect = new tagRECT(); pToleranceRect.left = X - Tolerance; pToleranceRect.right = X + Tolerance; pToleranceRect.top = Y - Tolerance; pToleranceRect.bottom = Y + Tolerance; IEnvelope pSearchEnvelope = null; pSearchEnvelope = new EnvelopeClass(); pDispTrans.TransformRect(pSearchEnvelope, ref pToleranceRect, (int)(esriDisplayTransformationEnum.esriTransformPosition | esriDisplayTransformationEnum.esriTransformToMap)); // identify feature points of measurement IBasicDocument pBasicDoc = null; pBasicDoc = (IBasicDocument)ArcMap.Application.Document; pSearchEnvelope.SpatialReference = pMxDoc.ActiveView.FocusMap.SpatialReference; IIdentify pIdentify = null; pIdentify = (IIdentify)pMxDoc.FocusMap.get_Layer(0); if (pIdentify == null) { MessageBox.Show("No layer"); return; } IArray pIDArray = null; pIDArray = pIdentify.Identify(pSearchEnvelope); // get object from feature point IIdentifyObj pIDObj = null; if (pIDArray != null) { pIDObj = (IIdentifyObj)pIDArray.get_Element(0); } if (pIDObj == null) { MessageBox.Show("No feature was identified"); return; } // get the name of the layer containing feature points ILayer pLayer = null; pLayer = pMxDoc.FocusMap.get_Layer(0); string layerName = null; layerName = pLayer.Name; // get primary display field for measurement values and set names of a date/time field and gage ID field IFeatureLayer pFeatLayer = null; pFeatLayer = (IFeatureLayer)pLayer; string dataFldName = null; string timefldName = null; string gageIDFldName = null; dataFldName = "TSValue"; timefldName = "TSDateTime"; // substitute data/time field name for different dataset gageIDFldName = "Name"; // substitute gage ID field name for different dataset // get display table from layer ITable pTable = null; IDisplayTable pDisplayTable = null; pDisplayTable = (IDisplayTable)pLayer; if (pDisplayTable != null) { pTable = pDisplayTable.DisplayTable; if (pTable == null) { goto THEEND; } } // get fields from display table IFields pFields = null; pFields = pTable.Fields; long fldCount = 0; fldCount = pFields.FieldCount; // create WHERE clause from identified objects of measurement points int gageIDFldIdx = 0; gageIDFldIdx = pFields.FindField(gageIDFldName); IRowIdentifyObject pRowIDObj = null; pRowIDObj = (IRowIdentifyObject)pIDObj; string gageID = null; gageID = (string)pRowIDObj.Row.get_Value(gageIDFldIdx); IFeatureLayerDefinition pFeatureLayerDef = null; pFeatureLayerDef = (IFeatureLayerDefinition)pLayer; string definitionExpression = null; definitionExpression = pFeatureLayerDef.DefinitionExpression; string whereClause = null; if (definitionExpression == "") { whereClause = "[" + gageIDFldName + "] = '" + gageID + "'"; } else { whereClause = "[" + gageIDFldName + "] = '" + gageID + "' AND " + definitionExpression; } //find color for the identified object from feature layer's renderer IGeoFeatureLayer pGeoFeatureLayer = null; pGeoFeatureLayer = (IGeoFeatureLayer)pLayer; ILookupSymbol pLookupSymbol = null; pLookupSymbol = (ILookupSymbol)pGeoFeatureLayer.Renderer; IFeature pFeature = null; pFeature = (IFeature)pRowIDObj.Row; IMarkerSymbol pSymbol = null; pSymbol = (IMarkerSymbol)pLookupSymbol.LookupSymbol(false, pFeature); // Find an opened GraphWindow IDataGraphBase pDataGraphBase = null; IDataGraphT pDataGraphT = null; IDataGraphWindow2 pDGWin = null; IDataGraphCollection pDataGraphs = null; pDataGraphs = (IDataGraphCollection)pMxDoc; int grfCount = 0; grfCount = pDataGraphs.DataGraphCount; for (int i = 0; i < grfCount; i++) { pDataGraphBase = pDataGraphs.get_DataGraph(i); pDGWin = FindGraphWindow(ref pDataGraphBase); if (pDGWin != null) { break; } } // if there is not an opened graph window - create a new graph for if (pDGWin == null) { // create graph pDataGraphT = new DataGraphTClass(); pDataGraphBase = (IDataGraphBase)pDataGraphT; // load template from <ARCGISHOME>\GraphTemplates\ string strPath = null; strPath = Environment.GetEnvironmentVariable("ARCGISHOME"); try { pDataGraphT.LoadTemplate(strPath + @"GraphTemplates\timeseries.tee"); } catch { } // graph, axis and legend titles. Substitute them for different input layer pDataGraphT.GeneralProperties.Title = "Daily Streamflow for Guadalupe Basin in 1999"; pDataGraphT.LegendProperties.Title = "Monitoring Point"; pDataGraphT.get_AxisProperties(0).Title = "Streamflow (cfs)"; pDataGraphT.get_AxisProperties(0).Logarithmic = true; pDataGraphT.get_AxisProperties(2).Title = "Date"; pDataGraphBase.Name = layerName; } else // get graph from the opened window { pDataGraphT = (IDataGraphT)pDataGraphBase; } // create vertical line series for all measurements for the identified gage ISeriesProperties pSP = null; pSP = pDataGraphT.AddSeries("line:vertical"); pSP.ColorType = esriGraphColorType.esriGraphColorCustomAll; pSP.CustomColor = pSymbol.Color.RGB; pSP.WhereClause = whereClause; pSP.InLegend = true; pSP.Name = gageID; pSP.SourceData = pLayer; pSP.SetField(0, timefldName); pSP.SetField(1, dataFldName); IDataSortSeriesProperties pSortFlds = null; pSortFlds = (IDataSortSeriesProperties)pSP; int idx = 0; pSortFlds.AddSortingField(timefldName, true, ref idx); pDataGraphBase.UseSelectedSet = true; ITrackCancel pCancelTracker = null; pCancelTracker = new CancelTracker(); pDataGraphT.Update(pCancelTracker); // create data graph window if there is not any opened one if (pDGWin == null) { pDGWin = new DataGraphWindowClass(); pDGWin.DataGraphBase = pDataGraphBase; pDGWin.Application = ArcMap.Application; pDGWin.Show(true); pDataGraphs.AddDataGraph(pDataGraphBase); } THEEND: return; //base.OnMouseDown(arg); }
private static ValueList GetPixelData(IMap map, IEnvelope extent, HashSet <string> includeFields) { ValueList result = new ValueList(); for (int i = 0; i < map.LayerCount; i += 1) { ILayer layer = map.get_Layer(i); if (!layer.Visible) { continue; } IIdentify id = layer as IIdentify; if (id == null) { continue; } IArray data = id.Identify(extent); if (data != null) { for (int j = 0; j < data.Count; j += 1) { object foundObj = data.get_Element(j); IRasterIdentifyObj2 raster = foundObj as IRasterIdentifyObj2; IRowIdentifyObject row = foundObj as IRowIdentifyObject; if (raster != null) { int propertyIndex = 0; string property; string value; while (true) { try { raster.GetPropAndValues(propertyIndex, out property, out value); if ((!"NoData".Equals(value)) && ((includeFields == null) || includeFields.Contains(property))) { result.Add(property, value); } propertyIndex += 1; } catch { break; } } continue; } else if (row != null) { IFields fields = row.Row.Fields; for (int k = 0; k < fields.FieldCount; k += 1) { string fieldName = fields.get_Field(k).Name; if ((includeFields == null) ? (!result.ContainsKey(fieldName)) : includeFields.Contains(fieldName)) { result.Add(fieldName, row.Row.get_Value(k)); } } } } break; } } return(result); }