ThinkGeo.com    |     Documentation    |     Premium Support

Error in BuildIndex method

I am trying to build an index file programmatically for a shape file when it is uploaded.  However, I seem to be getting the dreaded "The input double value is out of range.  maxX".  Does anybody have a solution to this issue?  My shape file is projected in NAD_1983_UTM_Zone_15N.  Is there anything special I need to do in this case?  The shape files do seem to be created although I am not sure if they are correct or not.


Below is the code that I am using:


 



Proj4Projection proj4Projection = this.getProjection();
proj4Projection.Open();

//ShapeFileFeatureLayer.BuildIndexFile(path + this.shapeFileName, path + this.shapeFileName.Split(new char[] { '.' }, 1)[0] + ".idx", proj4Projection, BuildIndexMode.DoNotRebuild);
ShapeFileFeatureLayer.BuildIndexFile(path + this.shapeFileName, BuildIndexMode.DoNotRebuild);
ShapeFileFeatureLayer layer = new ShapeFileFeatureLayer(path + this.shapeFileName, ShapeFileReadWriteMode.ReadOnly);
layer.RequireIndex = true;
layer.FeatureSource.Projection = proj4Projection;
layer.Name = this.shapeFileDescription;
layer.ZoomLevelSet.ZoomLevel01.IsActive = true;
layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


Thanks

Curtis



Curtis, 
  
 Please try "BuildIndexFile(IEnumerable<Feature> features, string indexPathFilename, Projection projection)" instead. 
  
 Thanks, 
  
 Johnny

Hi,


I have tried as suggested and I am now getting "InvalidOperationException - The shape you provided does not pass our simple validation.The shape you provided does not pass our simple validation."  This should be a valid shapefile as it is generated from ArcGIS by the Minnesota DOT.  Below is what I changed the code to.  Any additional ideas?



ShapeFileFeatureLayer layer = new ShapeFileFeatureLayer(path + this.shapeFileName, ShapeFileReadWriteMode.ReadOnly);
layer.RequireIndex = false;
layer.FeatureSource.Open();
ShapeFileFeatureLayer.BuildIndexFile(layer.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns), path + this.shapeFileName.Split(new char[] { '.' }, 1)[0] + ".idx", proj4Projection);
layer.FeatureSource.Close();

Thanks.

Curtis



I did not see in your code where you set the MapUnit of your map. Since the projection is UTM (using meter), make sure that you have your MapUnit set to meters. If you are still having problems, please send us the shapefile at support@thinkgeo.com.

Val,


I am not setting a map unit since I am just trying to generate an index file when the customer uploads the shapefile.  The idea is that when they upload the .shp, .dbf & .shx files I just want to generate the index file on the fly.  I would think I should be able to do this which is what is happening although it is throwing the error mentioned.  I will send the 3 files to support@thinkgeo.com


Thanks.


Curtis



We received the 3 files. We will look at your issue right after lunch and let you know our findings by the end of the day. Thank you.

I looked at your shapefile and I could build the spatial index without a problem when no projection is involved. I saw the same error as you describe when building the index with projection. I will pass that onto Johnny to have a closer look at this and on Monday we will send you the results of our investigation. Thank you.

One more thing, can you give us the parameters you used for you internal and external projections? For my test, I used the following the shapefile you sent us being in zone 15 UTM in Minnesota. And I tried to project to geodetic (WGS84). 
  
  Proj4Projection proj4 = new Proj4Projection(); 
  proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(3745); 
 proj4.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326); 
  
  
 spatialreference.org/ 


Hello,


Here is the code I use, the SRID stored for UTM 15 is 26915.



string world = Proj4Projection.GetEpsgParametersString(4326);
string extProj = null;

if(this.projection.ProjectionType.Equals("ESRI")) {
extProj = Proj4Projection.GetEsriParametersString((int)this.projection.Srid);
} else if(this.projection.ProjectionType.Equals("EPSG")) {
extProj = Proj4Projection.GetEpsgParametersString((int)this.projection.Srid);
}

return new Proj4Projection(extProj, world);
}

Thanks.


Curtis



 


Curtis,
 
It seems that I made a mistake before. Your shape file data has been projected, so we don’t need to add other projection information any more when building the index file.
 
I also did a test with the files you sent and all works fine. Below is the code I used:
 


        private void button1_Click(object sender, EventArgs e)
        {
            //Proj4Projection proj4 = new Proj4Projection();
            //proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);
            //proj4.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(26915);

            string path = @"C:\Dev\Mahnomen_Roads.shp";
            ShapeFileFeatureSource.BuildIndexFile(path);//, @"C:\Dev\Mahnomen_Roads.idx", proj4, BuildIndexMode.Rebuild);

            MessageBox.Show("Successed!");
        }


 
Thanks,
 
Johnny
 

Johnny,


I hate to bring this back up but now with 4.0.40 I am getting a different error when building the index file.


The error I am getting this time is below.  Any ideas?


Thanks.

Curtis


System.AccessViolationException was unhandled by user code

  Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."

  Source="MapSuiteCore"

  StackTrace:

       at ThinkGeo.MapSuite.Core.x792f2a1099daa3bb.xf3ae75a91cd8813a(x792f2a1099daa3bb[] x202f84ec840088e4)

       at ThinkGeo.MapSuite.Core.x792f2a1099daa3bb.x250341ac8eea2468(xdae79622241790e7 xceb934045d73ab68, x792f2a1099daa3bb[]& x4112ce59c524f47e)

       at ThinkGeo.MapSuite.Core.x567b6739af99a760.xae9b76e2e257ef44(xdae79622241790e7 xceb934045d73ab68, x792f2a1099daa3bb[]& x4112ce59c524f47e)

       at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.InsertRectangle(Double upperLeftX, Double upperLeftY, Double lowerRightX, Double lowerRightY, String rectangleId)

       at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.InsertRectangle(RectangleShape rectangle, String rectangleId)

       at ThinkGeo.MapSuite.Core.RtreeSpatialIndex.AddCore(Feature feature)

       at ThinkGeo.MapSuite.Core.ShapeFileFeatureSource.BuildIndex(BaseShape baseShape, RtreeSpatialIndex openedRtree, Projection openedProjection)

       at ThinkGeo.MapSuite.Core.ShapeFileFeatureSource.BuildIndexFile(String shapePathFilename, String indexPathFilename, Projection projection, String columnName, String regularExpression, BuildIndexMode buildIndexMode, Encoding encoding)

       at ThinkGeo.MapSuite.Core.ShapeFileFeatureSource.BuildIndexFile(String shapePathFilename, String indexPathFilename, Projection projection, String columnName, String regularExpression, BuildIndexMode buildIndexMode)

       at ThinkGeo.MapSuite.Core.ShapeFileFeatureSource.BuildIndexFile(String shapePathFilename)

       at AddShapeFile.InsertButton_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\AddShapeFile.aspx.cs:line 43

       at System.Web.UI.WebControls.Button.OnClick(EventArgs e)

       at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)

       at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)

       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

  InnerException: 

 



 


Hi Curtis,
 
The main cause behind it lies to the highly enhanced security feature of .Net Framework. If you try to access the data, here is shapefile, if you don’t have permission or the source isn’t trusted, and then it will give the exception like this. To resolve the problem, you have to give permission to your application to access the data.
 
Also, the other main cause is that, If you try to read the data that isn’t available, it also gives this exception. Please check the file path used for building index is available.
 
Thanks,
 
Johnny
 

Johnny,


Thanks, the shapefile does exist and it does create the .idx file however it leaves it with TMP at the beginning and throws the exception.  So, how do I give the application permission to do this?


Thanks.


Curtis



Hi, Curtis


Have you tried to set full permission to everyone for the folder of shape file that you want to build index file and your web application folder?
Also you can try to drag the shape file into the Map Suite Explorer which you can find in our installed package, and it will prompt you whether you want to build the index. Just click yes and let it go on.
 
If you still have any problems about it please let us know.
 
Thanks,
 
Khalil