ThinkGeo.com    |     Documentation    |     Premium Support

Binding data to FeatureSource

Hi,


Iam binding the data to FeatureSource of InMemorymarkeroverlay by using For Loop as below. It worksfine. But it is time consuming if the number of markers increases. Is there any possible option to load the FeatureSource without using For Loop/ForEach.. Loop?




memoryFeatureLayer.FeatureSource.Open();


memoryFeatureLayer.FeatureSource.BeginTransaction();



 



for (var i = 0; i < 20; i++)Random random = new Random(i.GetHashCode());Vertex v = new Vertex(-95.28109 + random.Next(1, 10), 38.95363 + random.Next(1, 5));Feature feature = new Feature(v, i.ToString());"AssetType", "Endpoint");Feature feature1 = new Feature(-118.28109, 34.505363);"AssetType", "Meter");"LA", feature1);FeatureSourceColumn column = new FeatureSourceColumn("AssetType");



{


 


 


 


feature.ColumnValues.Add(


memoryFeatureLayer.InternalFeatures.Add(i.ToString(), feature);


}


 


feature1.ColumnValues.Add(


memoryFeatureLayer.InternalFeatures.Add(


 


memoryFeatureLayer.Columns.Add(column);


memoryFeatureLayer.FeatureSource.CommitTransaction();


memoryFeatureLayer.FeatureSource.Close();



Sorry the code is not binded properly. 
  
 
memoryFeatureLayer.FeatureSource.Open();
 memoryFeatureLayer.FeatureSource.BeginTransaction();

for (var i = 0; i < 20; i++)
            {
                Random random = new Random(i.GetHashCode());
                Vertex v = new Vertex(-95.28109 + random.Next(1, 10), 38.95363 + random.Next(1, 5));
                Feature feature = new Feature(v, i.ToString());
                feature.ColumnValues.Add("AssetType", "Endpoint");

                memoryFeatureLayer.InternalFeatures.Add(i.ToString(), feature);
            }

            Feature feature1 = new Feature(-118.28109, 34.505363);
            feature1.ColumnValues.Add("AssetType", "Meter");

            memoryFeatureLayer.InternalFeatures.Add("LA", feature1);
            FeatureSourceColumn column = new FeatureSourceColumn("AssetType");
            memoryFeatureLayer.Columns.Add(column);
            memoryFeatureLayer.FeatureSource.CommitTransaction();
            memoryFeatureLayer.FeatureSource.Close();

 


Hi Revathy, 
  
 I did a test like this: 
  
  
InMemoryMarkerOverlay overlay = new InMemoryMarkerOverlay();

                Stopwatch sw = new Stopwatch();
                sw.Start();
                for (var i = 0; i < 20000; i++)
                {
                    Random random = new Random(i.GetHashCode());
                    Vertex v = new Vertex(-95.28109 + random.Next(1, 10), 38.95363 + random.Next(1, 5));
                    Feature feature = new Feature(v, i.ToString());
                    feature.ColumnValues.Add(“AssetType”, “Endpoint”);

                    overlay.Features.Add(i.ToString(), feature);
                }
                sw.Stop();
 
  
 It only takes about 181 milliseconds. I think this time shouldn’t unacceptable. 
  
 How did you get data from datasource? If your datasource is in disk, could you try to load them to memory in one time, and then separate them to many records, then loop in memory and add them to our layer? 
  
 If in your loop you need read from disk each time, that should very slow. 
  
 Regards, 
  
 Don

I need to bind data from datatable with 50,000 markers to FeatureSource of InMemoryMarkerOverlay. My datatable size may increase upto 1 lakh records. While using For..Loop to bind these datas to FeatureSource of the InMemoryMarkerOverlay it takes around 4secs which is not acceptable. Can you please get a solution to bind bulk data to FeatureSource?



Hello Revathy, 



Thanks for your further information. 



Have you tried the way Don said before? I think if every loop you will search the database, that will great decrease the speed, try to get them all from the beginning will be helpful.


Or could you please provide some code which you get the data? it will be helpful to find the root cause.



Regards, 



Gary