ThinkGeo.com    |     Documentation    |     Premium Support

MultipleShapeFileFeatureLayer GetBoundingBox()

Hi,


How to get the bounding box of a feature layer that contains mulitple shape files?  I'm using MultipleShapeFileFeatureLayer to load 3 shape files that start with 'Adminbndy' in the name.


I want to get the boundingBox that embeds all the features in all 3 layers. 


I tried to call multiLayer.FeatureSource.GetBoundingBox() but the returned bounding box is far away and it doesn't include any of the layers at all.


Thanks,


Tracy



Tracy,


We couldn't recreate your problem with our own shape file data. I want to comfirm something with you. Whether you have built midx and mids files using BuildIndex static method of MultipleShapeFileFeatureLayer, or you just use idx and ids files for every shape file. Here is the sample code for you using the second method:


 Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
                Map1.MapUnit = GeographyUnit.DecimalDegree;
                string ctycuShapeFilePatten = MapPath("~/SampleData/USA/") + "??ctycu.shp";
                MultipleShapeFileFeatureLayer ctycuLayer = new MultipleShapeFileFeatureLayer(ctycuShapeFilePatten);

                ctycuLayer.Name = "County";
                ctycuLayer.DrawingQuality = DrawingQuality.HighQuality;
                ctycuLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
                ctycuLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
                
                ctycuLayer.Open();
                Map1.CurrentExtent = ctycuLayer.FeatureSource.GetBoundingBox();
                ctycuLayer.Close();

                Map1.StaticOverlay.Layers.Add(ctycuLayer);


If you still have any problem, please provide us with a sample, and we will address it quickly.


Thanks,


Khalil



Hi,


I still have difficulty getting a correct bounding box.


This is my code:



MultipleShapeFileFeatureLayer cityLayer = new MultipleShapeFileFeatureLayer(@"C:\Source\GPS\webmapserver\Test\??????????de00.shp");
cityLayer.Open();
extent = cityLayer.FeatureSource.GetBoundingBox();
cityLayer.Close();

 


If I do the following, I can obtain the correct bounding box.



                ShapeFileFeatureLayer shp1 = new ShapeFileFeatureLayer(@"C:\Source\GPS\webmapserver\Test\Adminbndy3de00.shp", ShapeFileReadWriteMode.ReadOnly);
                shp1.Open();
                RectangleShape extent1 = shp1.FeatureSource.GetBoundingBox();
                shp1.Close();

                ShapeFileFeatureLayer shp2 = new ShapeFileFeatureLayer(@"C:\Source\GPS\webmapserver\Test\Adminbndy4de00.shp", ShapeFileReadWriteMode.ReadOnly);
                shp2.Open();
                RectangleShape extent2 = shp2.FeatureSource.GetBoundingBox();
                shp2.Close();

                ShapeFileFeatureLayer shp3 = new ShapeFileFeatureLayer(@"C:\Source\GPS\webmapserver\Test\Adminbndy5de00.shp", ShapeFileReadWriteMode.ReadOnly);
                shp3.Open();
                RectangleShape extent3 = shp3.FeatureSource.GetBoundingBox();
                shp3.Close();


                extent1.ExpandToInclude(extent2);
                extent1.ExpandToInclude(extent3);

                extent = extent1;

Thanks,


Tracy


 



Tracy,


Sorry for inconvenience. There are some mistake in calculating the bounding box for all layers in MapSuiteCore. We have fixed it. You could check the latest DLL package from helpdesk.thinkgeo.com,  the version of WebEdition is 3.1.399.0.


Thanks,


Khalil


 


 



Thanks Khalil.  The bounding box from MultipleShapeFileFeatureLayer works fine now. 
  
 I now have a question about building midx and mids.  I have whole north america map data from NAVTEQ.  I first split the data by city in British Columbia, Canada.  For my vancouver client, I provide them ‘admin1_van’, ‘admin2_van’ and ‘admin4_van’.  I then use MultipleShapeFileFeatureLayer.BuildIndex to build the multi index files for shapes with the wildcard filename ‘admin???’.   
 But now my client requests also richmond data to be added.  Does it work if I just use MultipleShapeFileFeatureLayer.BuildIndex  to build multi index for ‘admin1_ric’, ‘admin2_ric’, and ‘admin3_ric’ then place them with admin vancouver files?  Or I have to build the multi index for admin vancouver and richmond files all together at once?

Hi, Tracy 
  
 Yes, you have to build midx and mids  if you need to use Vancouver and Richmond data all together; Or else there is no need to do that. I suggest that you build multi index for  ‘admin1_ric’, ‘admin2_ric’, and ‘admin3_ric’  and then place them with admin vancouver files. So you could use them more flexible. 
  
 Thanks, 
 Khalil

Hi Khalil, 
  
 I’m still a little bit unclear of what I should do.  My client is now already running Vancouver data.  If I just build mutli index for ‘admin1_ric’, ‘admin2_ric’ and ‘admin3_ric’ and place them together with Vancouver admin files, can I still use multipleShapeFileFeatureLayer with wildcard ‘admin???’ which draws from all 6 files?  Or I have to have 2 multipleShapeFileFeatureLayers, one for Vancouver and one for Richmond, ‘???van.shp’ and ‘???ric.shp’ respectively? 
  
 Thanks, 
 Tracy

Hi, Tracy 
  
 Yes, just the same as you have mentioned. You have to set up two MultipleShapeFileFeatureLayer, and one for Vancouver and one for Richmond if you want to use them respectively. However for the wildcard "admin???", and you need to re-build midx and mids for all the six files. You could refer the code below: 
  
             string tlkaShapeFilePatten1 = dataFolder + "\USA\tlka\??lkaA71.shp"; 
             string tlkaIndexFilePatten1 = dataFolder + "\USA\tlka\lkaA71.midx"; 
  
             string tlkaShapeFilePatten2 = dataFolder + "\USA\tlka\??lkaA70.shp"; 
             string tlkaIndexFilePatten2 = dataFolder + "\USA\tlka\lkaA70.midx"; 
  
             MultipleShapeFileFeatureLayer lka71Layer = new MultipleShapeFileFeatureLayer(tlkaShapeFilePatten1, tlkaIndexFilePatten1); 
             MultipleShapeFileFeatureLayer lka70Layer = new MultipleShapeFileFeatureLayer(tlkaShapeFilePatten2, tlkaIndexFilePatten2); 
  
 Thanks, 
 Khalil

Hi Khalil, 
  
 Is the following way possible to do? 
 1) I first build midx and mids for my whole North America data.  For example, it includes ‘admin1_van’, ‘admin2_van’, ‘admin4_van’, ‘admin1_ric’, ‘admin2_ric’, ‘admin4_ric’, ‘admin1_bur’, ‘admin2_bur’, ‘admin4_bur’, etc. 
 2) For a client who wants vancouver data only, I only provide them files ‘???van’; but I use wildcard ‘admin???’ for MultipleShapeFileFeatureLayer in  my code to draw the map. 
 3) Now, my client requires richmond data as well to be added.  I just dump the files ‘???ric’ inside and keep my code ‘admin???’ as before. 
 4) If the client requires more cities in North America, I just do the same as step 3. 
  
 We are actually looking for a flexibility that we don’t need to change our application configuration or our code when our clients only require to see more or less map areas. 
  
 Thanks, 
 Tracy

Hi, Tracy 
  
 Yes, your idea is right. If you just dump the files your clients need; the midx and mids files could identify them automatically. Also you could add files what you clients want at any time if these files that you have built. 
  
 Thanks, 
 Khalil