From 0ecca052cf6b0ec35012f83eb145f04cd42c8c61 Mon Sep 17 00:00:00 2001 From: PeterZhong Date: Mon, 28 Oct 2024 11:12:47 +0800 Subject: [PATCH] 2-1 Query function --- GisDevelop_Exp/MainWindow.xaml | 5 + GisDevelop_Exp/MainWindow.xaml.cs | 178 ++++++++++++++++++++++++++++-- GisDevelop_Exp/online.png | Bin 0 -> 13270 bytes 3 files changed, 172 insertions(+), 11 deletions(-) create mode 100644 GisDevelop_Exp/online.png diff --git a/GisDevelop_Exp/MainWindow.xaml b/GisDevelop_Exp/MainWindow.xaml index 21547a6..7e1eb87 100644 --- a/GisDevelop_Exp/MainWindow.xaml +++ b/GisDevelop_Exp/MainWindow.xaml @@ -24,6 +24,11 @@ + + + + + diff --git a/GisDevelop_Exp/MainWindow.xaml.cs b/GisDevelop_Exp/MainWindow.xaml.cs index 10fb498..fc1c338 100644 --- a/GisDevelop_Exp/MainWindow.xaml.cs +++ b/GisDevelop_Exp/MainWindow.xaml.cs @@ -24,6 +24,14 @@ using Color = System.Drawing.Color; using Geometry = Esri.ArcGISRuntime.Geometry.Geometry; using Polygon = Esri.ArcGISRuntime.Geometry.Polygon; +enum CURRENTOPERATION +{ + NullOpe = -1, + SelectQuery = 0, + IdentifyQuery, + PanMap, +} + namespace GisDevelop_Exp { /// @@ -35,6 +43,7 @@ namespace GisDevelop_Exp private string _statesUrl = "https://services.arcgis.com/jIL9msH9OI208GCb/arcgis/rest/services/USA_Daytime_Population_2016/FeatureServer/0"; + private ServiceFeatureTable _featureTable; private readonly Dictionary _basemapOptions = new Dictionary() @@ -51,9 +60,13 @@ namespace GisDevelop_Exp { "Navigation (Vector)", new Basemap(BasemapStyle.ArcGISNavigation) }, { "OpenStreetMap (Raster)", new Basemap(BasemapStyle.OSMNavigation) } }; + + private CURRENTOPERATION m_CurOper; + public MainWindow() { InitializeComponent(); + m_CurOper = CURRENTOPERATION.NullOpe; Initialize(); EagleMapView.Map = new Map(BasemapStyle.ArcGISImageryStandard); } @@ -67,10 +80,11 @@ namespace GisDevelop_Exp "AAPTxy8BH1VEsoebNVZXo8HurGPYSDOnAeIwA4pOmn4FxRfMsbp3zN7aIhAzuRolPS6JUAtf98pdWdQp1jjclJhIB-7QXbTXrBITqXti07DnOLsRnS9lGLYGImGh5vW_jSlnEBqxbbZQCs4S0y5-tHC0_kSFW9RD3Kv8hiDGt1IGSrs-96vwz6rycPenwu_cAwZHZyTahSAEHOR5A7j2y9sUsZ8HoYLcn2O9SI8OYw2tzr4xAAwqN1fcw6FMiVVpBSYWAT1_A4CN5Ivr"; InitializeAuthenticationManagerWithToken(token); } - + private void InitializeAuthenticationManagerWithToken(string token) { - AuthenticationManager.Current.AddCredential(new OAuthTokenCredential(new Uri("https://services3.arcgis.com/Po7vxnPH4Do7ht5I/arcgis/rest/services/test/MapServer"),token)); + AuthenticationManager.Current.AddCredential(new OAuthTokenCredential( + new Uri("https://services3.arcgis.com/Po7vxnPH4Do7ht5I/arcgis/rest/services/test/MapServer"), token)); } private void Menu_OpenShp_Click(object sender, RoutedEventArgs e) @@ -104,10 +118,11 @@ namespace GisDevelop_Exp Geodatabase _localGeodatabase; System.Windows.Forms.OpenFileDialog fileDialog = new System.Windows.Forms.OpenFileDialog(); fileDialog.Filter = "Geodatabase文件(*.geodatabase)|*.geodatabase"; - if(fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) + if (fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { _slocalGeodatabasePath = fileDialog.FileName; } + if (System.IO.File.Exists(_slocalGeodatabasePath)) { _localGeodatabase = await Geodatabase.OpenAsync(_slocalGeodatabasePath); @@ -122,6 +137,7 @@ namespace GisDevelop_Exp geodatabaseMap.OperationalLayers.Add(layer); _featureLayer = layer; } + Viewpoint geodatabaseViewPoint = new Viewpoint(_featureLayer.FullExtent); geodatabaseMap.InitialViewpoint = geodatabaseViewPoint; MainMapView.Map = geodatabaseMap; @@ -139,7 +155,8 @@ namespace GisDevelop_Exp Esri.ArcGISRuntime.Geometry.Polygon vExtent = MainMapView.VisibleArea; Envelope eagleViewEnvelop = vExtent.Extent; Color lineColor = Color.FromArgb(255, 255, 0, 0); - SimpleLineSymbol lineSymbol = new Esri.ArcGISRuntime.Symbology.SimpleLineSymbol(SimpleLineSymbolStyle.Dash, lineColor,2.0); + SimpleLineSymbol lineSymbol = + new Esri.ArcGISRuntime.Symbology.SimpleLineSymbol(SimpleLineSymbolStyle.Dash, lineColor, 2.0); Color fillColor = Color.FromArgb(0, 0, 0, 0); SimpleFillSymbol fillSymbol = new SimpleFillSymbol(SimpleFillSymbolStyle.Solid, fillColor, lineSymbol); var graphicOverlay = new Esri.ArcGISRuntime.UI.GraphicsOverlay(); @@ -174,7 +191,6 @@ namespace GisDevelop_Exp Console.WriteLine(exception); throw; } - } private void Menu_Zoom_out_OnClick(object sender, RoutedEventArgs e) @@ -200,7 +216,7 @@ namespace GisDevelop_Exp private async void OpenOnlineData() { Map pMap = new Map(); - pMap.Basemap=new Basemap(BasemapStyle.ArcGISTopographicBase); + pMap.Basemap = new Basemap(BasemapStyle.ArcGISTopographicBase); _featureTable = new ServiceFeatureTable(new Uri(_statesUrl)); _featureLayer = new FeatureLayer(_featureTable); _featureLayer.MaxScale = 1.0; @@ -214,10 +230,12 @@ namespace GisDevelop_Exp if (_featureLayer.FeatureTable.GeometryType == GeometryType.Polygon) { pRenderer.Symbol = pFillSymbol; - }else if (_featureLayer.FeatureTable.GeometryType == GeometryType.Point) + } + else if (_featureLayer.FeatureTable.GeometryType == GeometryType.Point) { pRenderer.Symbol = pMarkerSymbol; - }else if (_featureLayer.FeatureTable.GeometryType == GeometryType.Polyline) + } + else if (_featureLayer.FeatureTable.GeometryType == GeometryType.Polyline) { pRenderer.Symbol = pLineSymbol; } @@ -225,6 +243,7 @@ namespace GisDevelop_Exp { pRenderer.Symbol = pFillSymbol; } + _featureLayer.Renderer = pRenderer; pMap.OperationalLayers.Add(_featureLayer); MainMapView.Map = pMap; @@ -277,7 +296,7 @@ namespace GisDevelop_Exp ArcGISPortal portal = await ArcGISPortal.CreateAsync(); // Create a portal item from the ArcGIS Portal object using a portal item string. PortalItem portalItem = await PortalItem.CreateAsync(portal, "29d7c59212ef479995f5b42bacc9de4c"); - FeatureLayer featureLayer = new FeatureLayer(portalItem,0); + FeatureLayer featureLayer = new FeatureLayer(portalItem, 0); map.OperationalLayers.Add(featureLayer); MainMapView.Map = map; } @@ -287,9 +306,146 @@ namespace GisDevelop_Exp MapPoint mapLocation = e.Location; Geometry myGeometry = mapLocation.Project(SpatialReferences.Wgs84); MapPoint projectedLocation = (MapPoint)myGeometry; - string mapLocationDescription = string.Format("纬度: {0:F3} 经度:{1:F3}", projectedLocation.Y, projectedLocation.X); + string mapLocationDescription = + string.Format("纬度: {0:F3} 经度:{1:F3}", projectedLocation.Y, projectedLocation.X); CalloutDefinition myCalloutDefinition = new CalloutDefinition("当前位置:", mapLocationDescription); MainMapView.ShowCalloutAt(mapLocation, myCalloutDefinition); + if (m_CurOper == CURRENTOPERATION.SelectQuery) + { + if (MainMapView.Map.OperationalLayers.Count > 0) + { + FeatureLayer _featureLayer = MainMapView.Map.OperationalLayers.First() as FeatureLayer; + if (_featureLayer != null) + { + FunClickQuery(e.Location, _featureLayer); + } + } + }else if (m_CurOper == CURRENTOPERATION.IdentifyQuery) + { + if (MainMapView.Map.OperationalLayers.Count > 0) + { + FeatureLayer _featureLayer = MainMapView.Map.OperationalLayers.First() as FeatureLayer; + if (_featureLayer != null) + { + FunIndentifyQuery(e.Position, _featureLayer); + } + } + } + } + + private void Menu_Simple_Identify_OnClick(object sender, RoutedEventArgs e) + { + string sQueryFieldName = "Name"; + string stateName = "New York"; + FeatureLayer _featureLayer = MainMapView.Map.OperationalLayers[0] as FeatureLayer; + if (_featureLayer != null) + { + QueryStateFeature3(_featureLayer, sQueryFieldName, stateName); + } + } + + private async Task QueryStateFeature3(FeatureLayer _featureLayer, string sQueryFieldName, string stateName) + { + try + { + QueryParameters pQueryP = new QueryParameters(); + string sformat = stateName.Trim().ToUpper(); + pQueryP.WhereClause = "upper(" + sQueryFieldName + ") LIKE '%" + sformat + "%'"; + await _featureLayer.SelectFeaturesAsync(pQueryP, Esri.ArcGISRuntime.Mapping.SelectionMode.New); + FeatureQueryResult pQueryResult = await _featureLayer.GetSelectedFeaturesAsync(); + List pListFeatures = pQueryResult.ToList(); + EnvelopeBuilder pEnvBuilder = new EnvelopeBuilder(_featureLayer.SpatialReference); + for (int i = 0; i < pListFeatures.Count; i++) + { + pEnvBuilder.UnionOf(pListFeatures[i].Geometry.Extent); + } + + await MainMapView.SetViewpointGeometryAsync(pEnvBuilder.ToGeometry(), 50); + } + catch (Exception ex) + { + System.Windows.MessageBox.Show("【程序出错】" + ex.Message); + } + } + + private async void FunClickQuery(MapPoint pPoint, FeatureLayer _featureLayer) + { + double tol = 3; //容差设为3像素 + double mapTol = tol * MainMapView.UnitsPerPixel; + MapPoint pNormalPoint = pPoint; + if (MainMapView.IsWrapAroundEnabled) + { + pNormalPoint = (MapPoint)GeometryEngine.NormalizeCentralMeridian(pPoint); + } + + Envelope selEnv = new Envelope(pNormalPoint.X - mapTol, pNormalPoint.Y - mapTol, pNormalPoint.X + mapTol, + pNormalPoint.Y + mapTol, MainMapView.SpatialReference); + QueryParameters pQueryPara = new QueryParameters(); + pQueryPara.Geometry = selEnv; + pQueryPara.SpatialRelationship = SpatialRelationship.Intersects; + await _featureLayer.SelectFeaturesAsync(pQueryPara, Esri.ArcGISRuntime.Mapping.SelectionMode.New); + + FeatureQueryResult pQueryResult = await _featureLayer.GetSelectedFeaturesAsync(); + List pListFeatures = pQueryResult.ToList(); + if (pListFeatures.Count <= 0) + { + return; + } + EnvelopeBuilder pEnvBuilder = new EnvelopeBuilder(_featureLayer.SpatialReference); + for (int i = 0; i < pListFeatures.Count; i++) + { + pEnvBuilder.UnionOf(pListFeatures[i].Geometry.Extent); + } + await MainMapView.SetViewpointGeometryAsync(pEnvBuilder.ToGeometry(), 50); + Feature pFeature; + string sInfo = ""; + IReadOnlyList pFields = pQueryResult.Fields; + for (int i = 0; i < pListFeatures.Count; i++) + { + pFeature = pListFeatures[i]; + IDictionary FeatureAttri = pFeature.Attributes; + string str; + object obj; + sInfo += "选中的第" + i.ToString() + "个要素的属性\n\r"; + for (int j = 0; j < FeatureAttri.Count; j++) + { + str = FeatureAttri.Keys.ElementAt(j); + obj = FeatureAttri.Values.ElementAt(j); + sInfo += str + ":" + obj.ToString() + "\r\n"; + } + MessageBox.Show(sInfo); + } + } + + private async void FunIndentifyQuery(System.Windows.Point pPoint, FeatureLayer pFLayer) + { + IdentifyLayerResult identifyLayerResult = await MainMapView.IdentifyLayerAsync(pFLayer,pPoint,20,false); + if (!identifyLayerResult.GeoElements.Any()) + { + return; + } + Feature identifyFeature = (Feature)identifyLayerResult.GeoElements.First(); + IDictionary FeatureAttri = identifyFeature.Attributes; + string str; + string tempStr = ""; + object obj; + for (int i = 0; i < FeatureAttri.Count; i++) + { + str = FeatureAttri.Keys.ElementAt(i); + obj = FeatureAttri.Values.ElementAt(i); + tempStr += str + ":" + obj.ToString() + "\r\n"; + } + System.Windows.MessageBox.Show(tempStr); + } + + private void Menu_Click_Indentify_OnClick(object sender, RoutedEventArgs e) + { + m_CurOper = CURRENTOPERATION.SelectQuery; + } + + private void Menu_Identify_Indentify_OnClick(object sender, RoutedEventArgs e) + { + m_CurOper = CURRENTOPERATION.IdentifyQuery; } } -} +} \ No newline at end of file diff --git a/GisDevelop_Exp/online.png b/GisDevelop_Exp/online.png new file mode 100644 index 0000000000000000000000000000000000000000..83fba13e1e9419cb911f0b2c93552c546d1be77f GIT binary patch literal 13270 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