ThinkGeo.com    |     Documentation    |     Premium Support

Error generating Routing Index (.rtg) file

 


I’m trying to create a Routing Index (.rtg) file. My road data is in an SQL Server database, and I’m building a Feature Layer manually by individually adding features (from the SQL data) to an InMemoryFeatureLayer (see code below).
LineShape lineShape = new LineShape(wkt); //wkt comes from sql
Feature feature = lineShape.GetFeature();
InternalFeatures.Add(feature);
 
The features seem to add fine, but when I try to Generate Routing Data, I get an error:
 
FeatureSource fs = RoadLayer.FeatureSource;
RtgRoutingSource.GenerateRoutingData(“c:\\Data\\RoutingIndex_Guest.rtg”,fs);
 
ERROR:  Object reference not set to an instance of an object.
 
What Object hasn’t been initialized?
 
bob
 

Hello Bob, 
  
 Thanks for your post, but this exception is not clear, is that possible that you can save your feature source to a shape file and sent to us, we can make a test on it. 
  
 If it’s too big, you can send to forumsupport@thinkgeo.com
  
 Regards, 
  
 Gary

Can you tell me how to save a featuresource to a shape file?  I only have SQL Server 2008R2, not Esri or any other geo tool. 
  
 bob

Hi Bob,  
  
 Do you have all exeptions set to ‘Thrown’ within Visual Studio - Debug - Exceptions? Depending on the exception you maybe able to get something more descriptive with these set to ‘Thrown’.

Yes I do, here is a screenshot of that error...still not very helpful.  :(



BTW, "fs" isn't null, although some of its properties may be...  (see below)




I hope this may shed some light...  THANKS!! 


If you need any additional information about "fs" please let me know and I'll take a screen shot of it...


bob



Hi Bob,  
  
 The first thing I notice about your InMemoryFeatureSource is that you do not have any Columns defined. I would recommend looping through all the columns in your LineShape and adding those columns to your InMemoryFeatureSource. 
  
 Also can you click on the ‘View Detail’ link within the exception, sometimes there is a StackTrace or an InternalException?

Yes, I do add all of the columns... (see code below)


foreach (DataColumn Col in MapTable.Columns)
{  string Value = row[Col.ColumnName].ToString();
  feature.ColumnValues.Add(Col.ColumnName, Value);
}

Here is the picture of "View Detail" of the exception...if you need to see more just let me know.




 I have a better picture of the stack trace...



Thanks again.


bob



 Hello Bob,


 
 Object reference not set to an instance of an object is a c# general exception, I can't find out the root cause by this.
 
 So below is how to save your features into a shape file and send to us:

            ShapeFileFeatureLayer.CreateShapeFile(ShapeFileType, pathFilename, databaseColumns);
             ShapeFileFeatureLayer sf = new ShapeFileFeatureLayer("the new shape file you just created");
             sf.Open();
             sf.EditTools.BeginTransaction();
             sf.FeatureSource.AddFeature(featureSource)//loop your featureSource and add each on into sf.
             sf.EditTools.CommitTransaction();
             sf.Close();

 After we got the shapefile, we can make test on it, once we can debug and recreate the problem, it will be fast to resolve this problem.
 
 Regards,
 
 Gary

Here is the entire code I’m trying to run to create the Shapefile from my SQL 2008R2 Database. (See Link below)


marketware.com/files/RoutingShapeFiles.zip


The code works essentially like this:


Run Query on Database to extract road data—GetRoadLayer() (see example attached).
Parse each row into Features, Define the Columns Collection, then attempt to Create the ShapeFile.
After running this, I get essentially a “blank” shape file (see files attached).
Your help is greatly appreciated.
Thanks!!
bob

Hi Bob,  
  
 Thanks for your code. I am not sure this the entire issue, but the following might help. 
  
 In your SetupFeature() method your final foreach loops through your MapTable.Columns and adds a (Column,ColumnValue) pair to the Feature for each MapTable.Column. In this way you are getting all the column data for your feature. 
  
 In your SetupFeature() method you define a column (at the Feature level) that matches a column found in your Table. Thus each individual Feature has a set of columns that matches the columns in the Table.  
  
 The mwMapLayer however does not have have the same set of columns. So while each of your Features does have column data, your InMemoryFeature Layer does not have any columns defined in its .Columns Collection. 
 You need to add column definitions to your mwMapLayer so its columns collection matches that of your Table. This can be achieved by simply looping through your Table columns and adding a column using mwMapLayer.Columns.Add(). 
  


 I added the following code as you suggested and it made no difference... 


       public bool SetupFeatures()
        {
            try
            {
                this.FeatureSource.Open();
                foreach (DataColumn Col in MapTable.Columns)
                {
                    FeatureSourceColumn col = new FeatureSourceColumn(Col.ColumnName);
                    this.Columns.Add(col);
                }
                this.FeatureSource.Close();
 
 
                Feature feature = null;
 
                foreach (DataRow row in MapTable.Rows)
                {
                    string wkt = ""; 

Your thoughts?


bob



if it would be helpful to resolve this problem I’d be happy to supply a small database (you’d need to have SQL Server 2008R2).  Please let me know if this can help to solve this issue…  I’d like you to be able to replicate this issue completely. 
  
 bob

Hi Bob, 
  
 This is an option, but we need to start a Customer Portal ticket as this is getting much more involved. If you can supply a sample application that access a sample database in a Customer Portal Ticket we could set this up to try and recreate it.

OK. But it may take me til Monday or later.   I am being pushed on other priorities today by the boss.  :( 
  
 bob

Understood, I will look for your Ticket.

In the process of building a demo for you to look at closer…I found the problem.  This line of code was… 
  
 ShapeFileFeatureLayer sf = new ShapeFileFeatureLayer(RoutingShapeFile); 
  
 and should be 
  
 ShapeFileFeatureLayer sf = new ShapeFileFeatureLayer(RoutingShapeFile, ShapeFileReadWriteMode.ReadWrite); 
  
 Thanks anyway. 
  
 bob

Glad you found the problem!