ThinkGeo.com    |     Documentation    |     Premium Support

Searching attributes in Shape file and showing result to user








     




Can any one suggest how to achive following?


Hi


How do I search column (attribute) value into shape file?


I am using 10 different shape file of line and point type feature.


User can select any one layer out these 10 shape layer file, which will show them all column name to select for. They can select one or multiple column with their values. When they submit search button, I want to open that shape layer and search with search parameters (column with values ex: FName = ‘Test’ and  SName = ‘Test2’;). If results found then display those to user in asp.net list box. At this point user can select any of this result, which should zoom into that feature on the map


I don’t know if I did right job to explain what I need. But below is in detail step by step process that I’m looking for


Ex:


Layer: FS_GNS.shp


That has Columns: FIBER_CODE, ROUTE, CITYPAIR, CONSTTYPE


When user selects above layer and provided following search parameter.


FIBER_CODE  = ‘820 ‘ &&  CONSTTYPE  = ‘BURIED’ ;


It should search into FS_GNS.shp file and returns result into ASP.NET list box.


Like,



        
  1. Code – 820, ConsType-BURIED      with their Longitude, Latitude as hidden value.

  2.     
  3. Code – 824, ConsType-AERIAL      with their Longitude, Latitude as hidden value.

  4.     
  5. Code – 823, ConsType-AERIAL      with their Longitude, Latitude as hidden value.


So when user clicks on any of search result in list box, it should zoom to that feature on map


Please note: I am using virtual earth as background.


Any expert advice how to achieve this?




Thanks


Hiren 


 



Hiren,



Here is a solution for you:



1.    When user selects above layer and provided search parameter such as FIBER_CODE  = ‘820 ‘ &&  CONSTTYPE  = ‘BURIED’ ;



The following code helps you to get the data source for the query string; it returns a datatable.
Datatable dt = layer.QueryTools.ExecuteQuery(strSQL);


Please refer to our installed sample for more detail on how to use this API which you can find at:"\Samples\CSharp Samples\Samples\QueryingFeatureLayers\ExecuteASqlQuery.aspx" 



2.    Click to zoom to the feature by the return columns.



In the return value, it contains all the column values which match your query string. Now we need a identify column to help finding the feature back. For example "REC_ID"; you can use the following code:

Feature feature = shapeFileLayer.FeatureSource.GetFeaturesByColumnValue("REC_ID", recId)[0];


The rest stuffs are very simple now.



Thanks,

Howard 

 











Hi Howard,


 


I tried your solution. It works fine for a while.


But some of my dbf sizes are more then 500MB. With those file I’m getting server time out message when I tried to get GetFeaturesByColumnValue in loop.


 


Do you know any better strategy to over come this issue?


In total I have 32 shape layers (16 shape and 16 for label).


 


Please find attached code for your reference.


 


 


Thanks


Hiren




1157-AttribSearch.zip (3.32 KB)

Hiren,



Another option is similar like the one above but much faster. 



1, Add an id column in the DBF files. The value of Id is the row number in the DBF file.

2, Do the same algorism as we did in my last reply.

3, The id column in DBF file is the feature id so that we can use this code instead for better performance.Feature feature = layer.QueryTools.GetFeatureById(id, ReturningColumnsType.NoColumns);
Please have a try and let me know if there is any problem.



Thanks,

Howard



Howard,



Thanks for quick reply. I will try and update you



Hiren



Hiren, 
  
 You are welcome; please let me know if you have any questions. 
  
 Thanks, 
 Howard

Howard,



I tried following code. It says your input index is out of bound for following highlighted line. SQL query returns 454 rows



            ShapeFileFeatureLayer lyr_lines_Buried_Cable = (ShapeFileFeatureLayer)((LayerOverlay)Map1.CustomOverlays[0]).Layers["Lyr_Buried_Cable"];



            strSQL = "Select OBJECTID,TYPE_NAME,STATUS,LENGTH,LABEL,PROJ_NUM,ALIAS,PRL_NUM,PROJ_NAME from Buried_Cable Where TYPE_NAME ='DBURIED' and STATUS ='ABD'";



            lyr_lines_Buried_Cable.Open();

            DataTable dt = lyr_lines_Buried_Cable.QueryTools.ExecuteQuery(strSQL);



            GridView1.DataSource = dt;

            GridView1.DataBind();



            for (int j = 0; j < dt.Rows.Count; j++)

            {

                Feature f = lyr_lines_Buried_Cable.QueryTools.GetFeatureById("233857", new string[8] { "OBJECTID", "TYPE_NAME", "STATUS", "LENGTH", "LABEL", "PROJ_NUM", "ALIAS", "PROJ_NAME" });

                

                if (f.ColumnValues.Count > 0)

                {

                    ListItem li;

                    for (int i = 0; i < f.ColumnValues.Count; i++)

                    {

                        //li = new ListItem(dt.Rows[0]["OBJECTID"].ToString(), features.GetWellKnownText());

                        //ListBox1.Items.Add(li);

                    }

                }

            }



            lyr_lines_Buried_Cable.Close();

 



Hiren, 
  
 Could you provide me your DBF file which has been inserted the Id column? I need to check it first to recreate your issue. 
  
 Thanks, 
 Howard

Howard,



I have forwarded dbf file to support@thinkgeo.com

In dbf I have column OBJECTID is that's unique.



Thanks

Hiren



Hiren, 
  
 I guess you misunderstand by “Add an id column in the DBF files. The value of Id is the row number in the DBF file”. 
  
 That’s true the OBJECTID is unique, but it’s not the row number in the dbf file. Let’s open the Buried_Cable.dbf file; we can see the OBJECTID starts from 233857. Actually the id parameter in GetFeatureById method refers to the row number so your OBJECTID or the new column needs start from 1. 
  
 In you DBF file there are totally 97551 rows so that the maximum Id is 97551 while in your application, you passed 233857 which is much more bigger than the maximum Id so that it throws the exception. 
  
 Hope it make sense. Please follow my instruction and rebuild the DBF file again. 
  
 Thanks, 
 Howard









Howard,


 


I created new column ROWID and filled with row number (from 1 to 65535).


Now I get rows faster when I query using QueryTools.GetFeatureById  in a loop with GetWellKnownText().


 


But now I’m getting same error for layer rendering on map, which used to draw earlier when user clicks any value from list box. (It zooms to Wellknowntext area on the map, but does not draw layer)


 


I got following error:


Your input index is out of bound


 


I recreated index file using Map Suite Explorer, but no luck.


 


Find attached sample file with screen shots.


 


When I used old buried_cable.dbf with old code it works fine and draws buried layer on the map.


 


Thanks


Hiren




1185-Attribsearch.zip (3.92 KB)
1186-InputIndex_out_of_range.GIF (54.5 KB)

Hiren, 
  
 Could you send buried_cable.dbf, buried_cable.shp,  buried_cable.shx etc files to me so that I can check the columns you added and figure out why the index file generated failed. 
  
 Thanks, 
 Howard

Howard,



I have forwarded "buried_cable.dbf", "buried_cable.shp", "buried_cable.shx" filed to suppor. 



Thanks

Hiren



Hiren,  
  
 Do you mean you failed generating the index files by the explorer? I successfully generate by the map explorer which takes a while no non-responsible. Please delete your old idx and ids file and re-generate again. Just be patient and wait for several minutes. 
  
 On the other hand, we’ll put the index file into your ftp folder. Please check it later. 
  
 Let me know how it works. 
  
 Thanks, 
 Howard

Howard,



I was able to generate index file after adding row id column.

But then it stopped rendering lines. 



Thanks

Hiren



Hiren,



I see. I changed our installed sample but it works fine. Please see the screenshot.



I think it's easier to recreate your issue by providing us a simple sample.



Let me know if you have any questions.



Thanks,

Howard














Howard,


 


There was confusion in conversation.


Sorry it was my fault.


 


Let me explain you in detail.


 


I want attribute search on shape file for selected column and its value. This can be single or multiple column in where criteria. SQL query returns single or multiple results that I’m displaying into grid view. When user clicks on Select link on grid for any row, that will zoom on map with current extents. (Using GetWellKnowText for that row)


 


I have ‘Point’ and ‘Polyline’ type shape file. Searching attributes on ‘point’ shape files works fine and retrieves ‘GetWellKnownText’ pretty fast using GetFeaturesByColumnValue. Using GetWllKnowText


 


But issue occurs for searching attributes for ‘Polyline’ type shape file. This is quite larger and has many columns (Ex. Burried_cable.dbf).  It works fine and retrieves ‘GetFeaturesByColumnValue’ but takes long time (15-20 seconds).


 


According to your suggestion, I created ‘ROWID’ on buried_cable.dbf. For this I have used ‘GetFeatureById’ which returns Feature very fast (1-2 seconds) and on selecting row on grid it zooms to map.


But it did not render layer. I got error on top left hand corner: Your input index is out of bound


 


If I drop ‘ROWID’ column from dbf it works fine and renders layer on the map.


 


Please find attached sample code for that


 


In sample code I have created two buttons and two grid view control.


 


1st Button ‘Burried Search’ retrieves result for old dbf file where ‘ROWID’ column is not there using GetFeaturesByColumnValue . It works fine, but very slow, zooms on map for selected row and shows layer on the map.


 


2nd Button ‘Burried Search (with RowID)’ retrives results for dbf file that has ‘ROWID’ column, retrieves ‘GetWellKnownText’ very fast using GetFeatureById’ and zooms on map for selected row, but it does not show layer on the map.


 


For testing 1st button code, please drop ‘ROWID’ from buried_cable.dbf. Selecting row on grid view zooms on map which also shows blue line layer


 


And for testing 2nd button code, create ‘ROWID’ in buried_cable.dbf. Selecting row on grid view zooms on map but does not show blue line layer. But it gives error: Your input index is out of bound


Burried_cable.shp files is same for both buttons. Only difference is ‘ROWID’ in dbf file


 


Please see attached .gif files for error.


 


I hope this makes clear picture


 


Thanks


Hiren


 



1203-AttribSearch-2nd_Button.GIF (108 KB)
1201-AttribSearch.zip (3.44 KB)
1202-AttribSearch-1st_Button.GIF (121 KB)

Hi Howard,



Any update on following issue?



Thanks

Hiren



Hiren, 
  
 Sorry for delaying your question. I was on a trip last week. 
  
 We recreate your issue in our end. We think the problem is the new shape files you are using. You can try to drag your shape file into our map explorer; click the info button in the toolbox; then click on the features to show the information.  
  
 Could you send us your original shape files which is before adding the new column in the DBF so that we can generate the column and test. 
  
 Thanks, 
 Howard

Howard,






I have sent you original shape files which is before adding new column.






Thanks




Hiren