ThinkGeo.com    |     Documentation    |     Premium Support

GUI "freezes" when plotting points

Hi,


My GUI "freezes" when it is plotting points (say 10 points) via inMemoryLayer. It "unfreezes" after all the points are being plotted. Is there any way to resolve this issue? Please advise, Thanks in advance. The structure of my codes is as follows:


private void startButton_Click()     // start button click event


{


startButton.Enabled = false;


plotPoints();


// By the way, I tried to spin off another thread (thread safe codes are not included over here) to do the plotting, but it does not work as well.


// Thread thread = new Thread (new ThreadStart(plotPoints));


// thread.Start();


}


private void plotPoints()  // function to plot points


{


// For loop


// plotting of points using inMemoryLayer in conjunction with Feature


// refresh map


}


 



Hi Bai,  
  
 Thanks for your question but we need additional information about your application in order to help.  
 Can you provide a more detailed code sample to demonstrate how your points are being loaded and rendered? 
  
 Other helpful information would be: 
 What datasource are you loading your points from? 
 Do you have complex styles for your points? 
 Are you loading other data on the map other than your points? 
 How long does this ‘freeze’ last before you again have access to the map?  
  


Hi Ryan,


Thanks for the reply.


(1) the data are read from txt files and they are double.


(2) I didnt do any complex styles, I was doing some modification to the sample codes (Plot a point) found in the web. I want to use it to plot a couple of land marks. That's why I inserted a for-loop to the codes shown below.


(3) It "unfreezes" after all the points are being plotted.


 


private void Form1_Load (object Sender, EventArgs e)


{


InMemoryFeatureLayer pointLayer = new InMemoryFeatureLayer();


pointLayer.ZoomLevelSet.Zoomlevel01.DefaultPointStyle = new PointStyle(PointSymbolType.Triangle, new GeoSolidBrush(GeoColor.StandardColors.Red),5);


LayerOverlay pointOverlay = new LayerOverlay();


pointOverlay,Layers.Add("pointLayer", pointLayer);


winformsMap1.Overlays.Add("pointOverlay", pointOverlay);


winformsMap1.Refresh();


}


private void startButton_Click(object Sender EventArgs e)


{


PlotPoints();


}


private void PlotPoints()


{


InMemoryFeatureLayer pointLayer = (InMemoryFeatureLayer)winformsMap1.FindFeatureLayer("PointLayer");


     for (int ii=0; ii<numPoints; ii++)


     {


          Feature feature = new Feature (X[ii], Y[ii], "Point"+Convert.ToString(ii+1));


          if(!pointLayer.InternalFeatures.Contains("Point"+Convert.ToString(ii+1)))


          {


           pointLayer.InternalFeatures.Add("Point"+Convert.ToString(ii+1));


          }


     }


     winformsMap1.Refresh();


}



Hi Bai,  
  
 Perhaps you are just seeing the short delay while the map is refreshing/redrawing. Can you perhaps run some of the Map Suite Desktop Edition sample applcations to see if you see the same behavior as you pan and zoom the map? 
 You can find these sample applications located at: Start Button - All Programs - ThinkGeo - Map Suite Desktop Edition - Winforms How Do I Samples

Hi Ryan,


I cant zoom or pan when the points are being updated. I can only zoom/pan when all the points (say 20 points) are being plotted onto the map. In other words, everything goes back to normal after all the points are being plotted. Is there any quick way to resolve this issue? Please advise. Thanks.


 



Hi Bai,


 
It's weird to see the effect when plotting 20 points on the map. The attached code in your previous email cannot be displayed correctly, would you mind to attach the code block as a text file and we can see what exactly you did in your PlotPoints method.
 
Also would you please provide us more information we need so that we can help you better.
1, put a Stopwatch to see how long it takes for the loop to add features.
2, put a Stopwatch to see how long it takes for the last statement “winformMap1.Refresh()”.
 
For example the code below:
private void PlotPoints()
{
    InMemoryFeatureLayer pointLayer = (InMemoryFeatureLayer)winformsMap1.FindFeatureLayer("PointLayer");
    Stopwatch stopwatch1 = Stopwatch.StartNew();
    for (int ii = 0; ii < 20; ii++)
    {
        Feature feature = new Feature(X[ii], Y[ii], "Point" + Convert.ToString(ii + 1));

        if (!pointLayer.InternalFeatures.Contains("Point" + Convert.ToString(ii + 1)))
        {
            pointLayer.InternalFeatures.Add("Point" + Convert.ToString(ii + 1));
        }
    }
    stopwatch1.Stop();
    Console.WriteLine(stopwatch1.ElapsedMilliseconds);

    Stopwatch stopwatch2 = Stopwatch.StartNew();
    winformsMap1.Refresh();
    stopwatch2.Stop();
    Console.WriteLine(stopwatch2.ElapsedMilliseconds);
}

 
It should be very fast to adding few points (eg. 20 points) and refresh the map as we tested. So we need first confirm what cause this issue and figure out how to solve this problem.
 
Thanks,
Howard

Hi Howard,


you are right, the updating is very fast, I just realised the entire plotting function was placed inside a loop,  That's the reason why the entire map freezes, I have resolved it and is working fine.


Thanks for the help.


I have another question. Is it possible to update vehicles' location with real-time traffic? The number of vehicles at each update is dynamic since the vehicle could have just started or just ended delivering the goods.  (I am intending to use the breadcrumb sample project to build my application.) Is this feasible?



Hi Bai, 
  
 Our Mapsuite can properly support real-time traffic, you could use a timer to refresh the status of all the vehicles by  
 “Feature.WellKnownBinary=(new PointShape(newX,newY)).GetWellKnownBinary();” 
  
 To add new vehicle, you could use: 
 “InMemoryFeatureLayer.InternalFeatures.Add(FeatureName, Feature)” 
  
 To delete a vehicle, you could use: 
 “InMemoryFeatureLayer.InternalFeatures.Remove (FeatureName)” 
  
 If you have any question please feel free to let me know. 
  
 Regards, 
  
 Don

Hi,


Currently, all the vehicles have the same trail color, which happens to be red. May I know if it is possible to have different trail color for different vehicle ?


Regards,


Bai



 Hi Bai,


I guess you can try ClassBreakStyle or ValueStyle for InMemoryFeatureLayer. They allows us to have different color for different shapes, here should be the vehicle. Following is a demo code on ClassBreakStyle, please check it out:




“ClassBreakStyle.ColumnName = "Vechicle";
ClassBreakStyle.ClassBreaks.Add(new ClassBreak1(1, Style));
ClassBreakStyle.ClassBreaks.Add(new ClassBreak2(3, Style));
InMemoryFeatureLayer.Columns.Add(new FeatureSourceColumn("Vechicle"));
InMemoryFeatureLayer.InternalFeatures.Add(new Feature(BaseShape, new Dictionary<string, string>(“Vechicle”, “2”)));
InMemoryFeatureLayer.InternalFeatures.Add(new Feature(BaseShape, new Dictionary<string, string>(“Vechicle”, “4”)));”



Thanks,


Johnny