ThinkGeo.com    |     Documentation    |     Premium Support

Oracle table loading too slow

I am considering purchasing the Map Suite for desktop for my company but i have a big problem loading data from a oracle table. The table stores 48936 polygons with simple complexity. When i try o load the data in the viewer it takes 3 minutes to display. I find  your product really great but this is something that i cannot accept.




winformsMap1.MapUnit = GeographyUnit.Meter;
winformsMap1.DrawingQuality = DrawingQuality.HighSpeed;
winformsMap1.ThreadingMode = MapThreadingMode.Multithreaded;

var connectStr = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=raid6)(PORT=1521))(CONNECT_DATA=(SID=ora6)));Persist Security Info=True;User ID=dbo_ktima;Password=123";
try
{
    _oralayer = new OracleFeatureLayer(connectStr, "G_KAEK", "FID");
                
}
catch( Exception ex)
{
                
}

_oralayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
_oralayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
_oralayer.FeatureSource.GeoCache.IsActive = true;
_oralayer.Open();
var staticOverlay = new LayerOverlay();
staticOverlay.Layers.Add("Ktima", _oralayer);
            
            
winformsMap1.Overlays.Add(staticOverlay);
winformsMap1.CurrentExtent = _oralayer.GetBoundingBox();
winformsMap1.Refresh();


Hi Giorgos, 

Thanks for your question and thanks for considering Map Suite!


There are several ways we can improve the performance of your application. 

First let's consider that currently we are asking Map Suite to retrieve 48936 polygons and display all of them. When the Map Loads your code is setting the Extent of the Map to an extent that encompasses all the polygons in your OracleFeatureLayer so the map has to draw all 48936 polygons. I am not sure what your data represents but with this much data displayed all at once you may not be able to distinguish one polygon from another and thus the map may not be very usable.

For a such a numerous dataset such as this I would consider waiting to display it until you have zoomed in to a lower ZoomLevel. Take into consideration the level of detail you normally see for world-wide map. At a world view individual city streets are not drawn; country outlines, oceans, and mountain ranges are displayed as these details make sense for a world-wide view.


This logic will allow your data to be more valuable to the user since they can make out individual shapes, and also increase the peformance of the map.

We have a very recent DailyBuild for the Desktop Edition (helpdesk.thinkgeo.com) that has some new Oracle functionlity built-in. With the 6.0.190.0 and later versions you can create a SpatialIndex for a OracleFeatureLayer that Map Suite can use to help quickly determine which Features need to be displayed at the Map's CurrentExtent. Information about these new features can be found here: gis.thinkgeo.com/Support/Dis...ovedoracle


To setup a higher performance Oracle layer I would recommend utilizing the 6.0.190.0 or later Dlls and perhaps setting up your _oralayer like the following: 

 



winformsMap1.MapUnit = GeographyUnit.Meter;
winformsMap1.DrawingQuality = DrawingQuality.HighSpeed;
winformsMap1.ThreadingMode = MapThreadingMode.Multithreaded;

var connectStr = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=raid6)(PORT=1521))(CONNECT_DATA=(SID=ora6)));Persist Security Info=True;User ID=dbo_ktima;Password=123";
try
{
_oralayer = new OracleFeatureLayer(connectStr, "G_KAEK", "FID");
_oralayer.BuildIndex();

}
catch (Exception ex)
{
}

//Setup a ZoomLevel that is reasonable for the data.
//ZoomLevel01 is a world-wide view with large scale values (591658710.9)
//ZoomLevel20 is very localized view with small scales (ie. 1128)

_oralayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;            
_oralayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
_oralayer.FeatureSource.GeoCache.IsActive = true;
_oralayer.Open();
var staticOverlay = new LayerOverlay();
staticOverlay.Layers.Add("Ktima", _oralayer);

winformsMap1.Overlays.Add(staticOverlay);
winformsMap1.CurrentExtent = _oralayer.GetBoundingBox();
winformsMap1.Refresh();