ThinkGeo.com    |     Documentation    |     Premium Support

Inconsistent Map Rendering Bug

I’m just learning how to use the Map Suite MVC Edition for use in a project and have encountered odd behavior.  The code is very rough and dirty, as this is just me playing around with some of the features in a practice project and making sure the client’s data loads. It’s modeled after the Quick Start guide and a few others.  The basic idea for this test is to have an OpenStreetMaps base layer and then using the layer selection tool to toggle some additional layers based on data from the client.  I am getting inconsistent behavior when it comes to rendering the page.  Sometimes the either one or both areas will have holes in them where that particular layer just doesn’t render.  Other times, the whole layer fails to render with the message “points must form a closed linestring” displayed on top of the map in the top left corner near the zoom and pan tools.  The most perplexing thing is that it seems to change between working seemingly correctly or giving the above behaviors simply from panning or zooming with no discernible consistency to help me narrow down why. Furthermore, it doesn’t appear to be consistent between each time I attempt to run the code. I’ve attached a zip containing a screen grab showcasing the hole. The hole is roughly near the center of the picture. One layer is set to render in a partially transparent red, while the other is set to render in a partially transparent blue. The blue area in the purple blob shows where the red layer isn’t rendering.  Here is the code block I’m using to setup and render the map.  The two shapefiles referenced are the client’s data which are in NAD83 projection(EPSG:4269).




Html.ThinkGeo().Map(“Map1”new System.Web.UI.WebControls.Unit(100, System.Web.UI.WebControls.UnitType.Percentage),new System.Web.UI.WebControls.Unit(100,System.Web.UI.WebControls.UnitType.Percentage))  
    .MapBackground(new BackgroundLayer(new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"))))
    .CurrentExtent(-8926320, 4948463, -8878542, 4909473)
    .MapUnit(GeographyUnit.Meter)  
    .MapTools(tools =>  
    {  
        tools.MouseCoordinateMapTool().Enabled(true);
        tools.OverlaySwitcherMapTool().Enabled(true);
    })  
    .CustomOverlays(overlays => 
        {
            overlays.OpenStreetMapOverlay(“Open Street Map”);
             
            //Projection from NAD83 to OpenStreetMaps
            Proj4Projection proj4 = new Proj4Projection();
            proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4269);
            proj4.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(3857);
 
            // Zip Layer
            FeatureLayer ziplayer = new ShapeFileFeatureLayer(Server.MapPath(@"\App_Data\Zips.shp"));
 
            ziplayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle =
                AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(50, GeoColor.StandardColors.Red), GeoColor.StandardColors.Purple);
 
            ziplayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle =
                TextStyles.CreateSimpleTextStyle(“ZIP”“Arial”, 8, DrawingFontStyles.Regular, GeoColor.StandardColors.Black);
            ziplayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            
 
             
            proj4.Open();
 
            ziplayer.FeatureSource.Projection = proj4;
 
            ClientCache mapCache = new ClientCache(new TimeSpan(1, 0, 0),“mapCache”);
 
            overlays.LayerOverlay(“Zip”false, TileType.SingleTile).Layer(ziplayer).ClientCache(mapCache);
             
             
 
            //Zone Layer
            ShapeFileFeatureLayer zoneLayer = new ShapeFileFeatureLayer(Server.MapPath(@"\App_Data\Zones.shp"));
             
            zoneLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle=
                 AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(50, GeoColor.StandardColors.Blue), GeoColor.StandardColors.Green);
            zoneLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle =
                TextStyles.CreateSimpleTextStyle(“ZONE”“Arial”, 8, DrawingFontStyles.Regular, GeoColor.StandardColors.Chartreuse);
            zoneLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 
            proj4.Open();
             
            zoneLayer.FeatureSource.Projection = proj4;
 
            overlays.LayerOverlay(“Zones”false, TileType.SingleTile).Layer(zoneLayer).ClientCache(mapCache);                        
   
        })
    .Render(); 






Hi Michael,



Thanks for paying attention to Map Suite products. Seems like there are something wrong with the data used for the toggle, but not very sure, it’s better you can call the MakeValid method of Feature to correct these geometries at first. Also I think you can try downloading our straightforward tool GisEditor to load these data and switch to “Identify Feature” tab to see how these holes are, what’s the type of these features, etc. 



Also is it possible to send some demo data to us, so that we can do some test? because it’s hard for us to determine the problem just based on an image, you can attached in the thread or send it to us via email forumsupport@thinkgeo.com.



Looking forward to your further information.

Regards,

Johnny




I will need to check with the client before releasing the data.  One set of data is I believe simply from the U.S. Census, but the other may be their own private data.  Everything appears alright upon examination in GisEditor. I have also switched over to doing all setup in the controller since that more closely resembles how the project will be setup and is how I prefer to code.  I’ll post the updated code shortly, through the problem still exists as the its basically just transferring the code to the controller.  
  
 Also, as an experiment I tried something slightly different.  Instead of creating two LayerOverlays (one for each layer containing information from a shapefile) and adding them to the overlays collection, I created a single LayerOverlay and added both layers to it. When this is done the problem doesn’t appear to manifest.  Can there only be one LayerOverlay per a map? If so am I misunderstanding the purpose of the LayerOverlay?

Here’s the updated code:



The Controller:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.MvcEdition;
 
namespace Test2.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/
 
        public ActionResult Index()
        {      
            System.Web.UI.WebControls.Unit mapHeight = new System.Web.UI.WebControls.Unit(100, System.Web.UI.WebControls.UnitType.Percentage);
            System.Web.UI.WebControls.Unit mapWidth = new System.Web.UI.WebControls.Unit(100, System.Web.UI.WebControls.UnitType.Percentage);
 
            //Setup Map
            Map map = new Map(“Map1”,mapWidth,mapHeight);           
            map.CurrentExtent = new RectangleShape(-8926320, 4948463, -8878542, 4909473);
            map.MapUnit = GeographyUnit.Meter;
            map.MapBackground = new BackgroundLayer(new GeoSolidBrush(GeoColor.StandardColors.Beige));
            map.MapTools.OverlaySwitcher.Enabled = true;
 
            //Setup Overlays
 
            //OSM
            map.CustomOverlays.Add(new OpenStreetMapOverlay(“OSM”));
 
            //Projection from NAD83 to OpenStreetMaps
            Proj4Projection proj4 = new Proj4Projection();
            proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4269);
            proj4.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(3857);
 
            //Cache client side
            ClientCache mapCache = new ClientCache(new TimeSpan(1, 0, 0), “mapCache”);
 
            //Setup Zip Layer
            LayerOverlay zipLayerOverlay = new LayerOverlay(“Zip Codes”false, TileType.SingleTile);
 
            ShapeFileFeatureLayer zipLayer = new ShapeFileFeatureLayer(Server.MapPath(@"\App_Data\Zips.shp"));
            zipLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle =
                AreaStyles.CreateSimpleAreaStyle(new GeoColor(50, GeoColor.StandardColors.Red),GeoColor.StandardColors.DarkRed);
            zipLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = 
                TextStyles.CreateSimpleTextStyle(“ZIP”“Arial”, 10, DrawingFontStyles.Regular, GeoColor.StandardColors.DarkRed);
            zipLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            proj4.Open();
            zipLayer.FeatureSource.Projection = proj4;
            proj4.Close();
            zipLayerOverlay.Layers.Add(zipLayer);
            zipLayerOverlay.ClientCache = mapCache;
             
            map.CustomOverlays.Add(zipLayerOverlay);
 
            //Setup Zone Layer
            LayerOverlay zoneLayerOverlay = new LayerOverlay(“Zones”false, TileType.SingleTile);
 
            ShapeFileFeatureLayer zoneLayer = new ShapeFileFeatureLayer(Server.MapPath(@"\App_Data\Zones.shp"));
            zoneLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle =
                AreaStyles.CreateSimpleAreaStyle(new GeoColor(50, GeoColor.StandardColors.Blue),GeoColor.StandardColors.DarkBlue);
            zoneLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = 
                TextStyles.CreateSimpleTextStyle(“ZONE_NAME”“Arial”, 10, DrawingFontStyles.Regular, GeoColor.StandardColors.DarkBlue);
            zoneLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            proj4.Open();
            zoneLayer.FeatureSource.Projection = proj4;
            proj4.Close();
            zoneLayerOverlay.Layers.Add(zoneLayer);
            zoneLayerOverlay.ClientCache = mapCache;
            map.CustomOverlays.Add(zoneLayerOverlay);
      
            return View(map);
        }
 
    }
}

The View:


@using ThinkGeo.MapSuite.Core
@using ThinkGeo.MapSuite.MvcEdition
@model ThinkGeo.MapSuite.MvcEdition.Map
 
@{
    ViewBag.Title = “Index”;
}
 
<h2>Index</h2>
@{
    Html.ThinkGeo().Map(Model).Render();
     
}




The client has given permission to release the data.  Here are the shapefiles, as well as the ancillary files, for the data.

Hi Michael,


I think that it is a bug in our projection system when all the layers share only one instance of projection on “SingleTile” mode. I tried resolving it, but seems like it's a bit complicated, I have entered this issue to our internal issue tracking system, and hope it can be fixed soon. Now, I guess you can try the following two options:




        
  • 1. Apply different instance of Projection to each layer, code should be as following:

  •     

  •     
            
                
                    Proj4Projection proj4 = new Proj4Projection();

                    proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4269);

                    proj4.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(3857);

                    Proj4Projection proj41 = new Proj4Projection();

                    proj41.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4269);

                    

    proj41.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(3857);


                    

    zipLayer.FeatureSource.Projection
                    = proj4;

                    zoneLayer.FeatureSource.Projection
                    = proj41;


                    
                
            
        
        


  •     
  • 2. Setting “TileType” property in “Overlay” to "MultipleTile".




zipLayerOverlay.TileType = TileType.MultipleTile;




Thanks,

Johnny