Select to view content in your preferred language

Can spatial query be used in multi-layers query?

3588
13
11-08-2010 09:50 AM
DanDong
Deactivated User
Hi all,

Right now I can do spatial query in one map layer. I have a question about whether I can use spatial query on six map layers. The process is when I draw a polygon, this polygon will cut six layers, each layer will return one column of attributes (like layer1 return the county name, layer2 return the population, layer3...)

in ESRI demo, it design layer 5 is the target layer:
QueryTask queryTask = new QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/" + "Demographics/ESRI_Census_USA/MapServer/5");

Can i design other layers as the target layers? If so, what should I do? Thanks for all of you.
0 Kudos
13 Replies
BrandonCales
Regular Contributor
Did anyone get this working....I'm trying to do the similar.
0 Kudos
DanDong
Deactivated User
Did anyone get this working....I'm trying to do the similar.


Yes, spatial query can be used in multiple layers. But since it is an asynchronous call, in the end I use a mutex lock to make multiple layers queried sequentially.
0 Kudos
BrandonCales
Regular Contributor
I apologize....mutex?

I have it almost working where my initial search_executecompleted then calls search2, however within each I have "ParcelSearch_TaskResultsDataGrid.ItemsSource = featureSet.Features;" which the 2nd is overwriting the 1st.

I  have read that pushing my features to a collection then to the datagrid may work, I just am unable to find some reference or code for "collection".

Here is my full code:
private void Execute_ParcelSearch_Click(object sender, RoutedEventArgs e)
        {
            GraphicsLayer ParcelSearch_GraphicsLayer = MyMap.Layers["ParcelSearch_GraphicsLayer"] as GraphicsLayer;
            ParcelSearch_GraphicsLayer.ClearGraphics();

            ParcelSearch_TaskResultsDataGrid.ItemsSource = null;
            ParcelSearch_TaskResultsPanel.Visibility = Visibility.Collapsed;

            if (ParcelSearch_tabControl != null)
            {
                TabControl tb = ParcelSearch_tabControl as TabControl; if (tb.SelectedIndex > -1)
                {
                    ParcelSearch_tab = (tb.SelectedItem as TabItem).Name;
                }

                if (ParcelSearch_tab == "ParcelSearch_tabAPN" && (txtAPN.Text.Length < 4 || txtStNumber.Text == null))
                {
                    MessageBox.Show("You must enter atleast 4 numbers");
                }
                else
                {
                    QueryTask ParcelSearch = new QueryTask("http://{SERVER}/ArcGIS/rest/services/GISPRD_Main/MapServer/79");
                    ParcelSearch.ExecuteCompleted += ParcelSearch_ExecuteCompleted;
                    ParcelSearch.Failed += ParcelSearch_Failed;

                    Query query = new Query();
                    query.ReturnGeometry = true;
                    query.OutSpatialReference = MyMap.SpatialReference;

                    query.OutFields.Add("*");

                    if (ParcelSearch_tab == "ParcelSearch_tabAPN")
                    {
                        query.Where = "APN LIKE '" + txtAPN.Text + "%'";
                    }
                    else if (ParcelSearch_tab == "ParcelSearch_tabAddr")
                    {
                        query.Where = "STNUMBER LIKE '" + txtStNumber.Text + "%' AND STNAME LIKE '" + txtStName.Text + "%' AND STSUFFIX LIKE '" + txtStSuffix.Text + "%'";
                    }

                    ParcelSearch.ExecuteAsync(query);

                    //ParcelSearch_TaskResultsPanel.Visibility = Visibility.Visible;
                }
            }
            else
            {
                MessageBox.Show("You must specify an APN, Address, or Owner to search for");
            }

        }

        private void ParcelSearch2(object sender, RoutedEventArgs e)
        {
            GraphicsLayer ParcelSearch_GraphicsLayer = MyMap.Layers["ParcelSearch_GraphicsLayer"] as GraphicsLayer;

            if (ParcelSearch_tabControl != null)
            {
                TabControl tb = ParcelSearch_tabControl as TabControl; if (tb.SelectedIndex > -1)
                {
                    ParcelSearch_tab = (tb.SelectedItem as TabItem).Name;
                }

                if (ParcelSearch_tab == "ParcelSearch_tabAPN" && (txtAPN.Text.Length < 4 || txtStNumber.Text == null))
                {
                    MessageBox.Show("You must enter atleast 4 numbers");
                }
                else
                {

                    QueryTask ParcelSearch2 = new QueryTask("http://{SERVER}/ArcGIS/rest/services/GISPRD_Main/MapServer/80");
                    ParcelSearch2.ExecuteCompleted += ParcelSearch2_ExecuteCompleted;
                    ParcelSearch2.Failed += ParcelSearch2_Failed;

                    Query query = new Query();
                    query.ReturnGeometry = true;
                    query.OutSpatialReference = MyMap.SpatialReference;

                    query.OutFields.Add("*");

                    if (ParcelSearch_tab == "ParcelSearch_tabAPN")
                    {
                        query.Where = "APN LIKE '" + txtAPN.Text + "%'";
                    }
                    else if (ParcelSearch_tab == "ParcelSearch_tabAddr")
                    {
                        query.Where = "STNUMBER LIKE '" + txtStNumber.Text + "%' AND STNAME LIKE '" + txtStName.Text + "%' AND STSUFFIX LIKE '" + txtStSuffix.Text + "%'";
                    }

                    ParcelSearch2.ExecuteAsync(query);

                    //ParcelSearch_TaskResultsPanel.Visibility = Visibility.Visible;
                }
            }
            else
            {
                MessageBox.Show("You must specify an APN, Address, or Owner to search for");
            }

        }


        private void ParcelSearch_ExecuteCompleted(object sender, ESRI.ArcGIS.Client.Tasks.QueryEventArgs args)
        {
            GraphicsLayer ParcelSearch_GraphicsLayer = MyMap.Layers["ParcelSearch_GraphicsLayer"] as GraphicsLayer;
            ParcelSearch_GraphicsLayer.ClearGraphics();

            FeatureSet featureSet = args.FeatureSet;
               if (featureSet.Features.Count > 0)
            {
                ParcelSearch_TaskResultsDataGrid.ItemsSource = featureSet.Features;

                foreach (Graphic resultFeature in featureSet.Features)
                {
                    resultFeature.Symbol = DefaultFillSymbol;
                    ParcelSearch_GraphicsLayer.Graphics.Add(resultFeature);
                }

                
            }
            else
            {
                //MessageBox.Show("No features found");
            }
            ParcelSearch2(sender, null);
        }

        private void ParcelSearch2_ExecuteCompleted(object sender, ESRI.ArcGIS.Client.Tasks.QueryEventArgs args)
        {

           GraphicsLayer ParcelSearch_GraphicsLayer = MyMap.Layers["ParcelSearch_GraphicsLayer"] as GraphicsLayer;
           
 FeatureSet featureSet = args.FeatureSet;
            if (featureSet.Features.Count > 0)
            {
                ParcelSearch_TaskResultsDataGrid.ItemsSource = featureSet.Features;

                // Add results to map
                foreach (Graphic resultFeature in featureSet.Features)
                {
                    resultFeature.Symbol = DefaultFillSymbol;
                    ParcelSearch_GraphicsLayer.Graphics.Add(resultFeature);
                    
                }

            }
            else
            {
                //MessageBox.Show("No features found");
            }

            ZoomToGraphicsLayer(MyMap.Layers["ParcelSearch_GraphicsLayer"] as GraphicsLayer);

            ParcelSearch_TaskResultsPanel.Visibility = Visibility.Visible;
        }


        private void ParcelSearch_TaskResultsDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // Highlight the graphic feature associated with the selected rows
            DataGrid dataGrid = sender as DataGrid;

            int selectedIndex = dataGrid.SelectedIndex;
            if (selectedIndex > -1)
            {
                GraphicsLayer ParcelSearch_GraphicsLayer = MyMap.Layers["ParcelSearch_GraphicsLayer"] as GraphicsLayer;

                ParcelSearch_GraphicsLayer.ClearGraphics();


                foreach (Graphic resultFeature in ParcelSearch_TaskResultsDataGrid.SelectedItems)
                {
                    resultFeature.Symbol = DefaultFillSymbol;
                    ParcelSearch_GraphicsLayer.Graphics.Add(resultFeature);
                }
            }
        }
0 Kudos
BrandonCales
Regular Contributor
Resolved....

I passed my features to a global featureset, then at the send of my 2nd ExecuteCompleted i populate the datagrid.
0 Kudos