[mapguide-commits] r9830 - in sandbox/jng/mvt_render_fixes: Common/Renderers Server/src/Services/Rendering

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Wed Feb 10 04:13:42 PST 2021


Author: jng
Date: 2021-02-10 04:13:42 -0800 (Wed, 10 Feb 2021)
New Revision: 9830

Modified:
   sandbox/jng/mvt_render_fixes/Common/Renderers/MVTRenderer.cpp
   sandbox/jng/mvt_render_fixes/Common/Renderers/MVTRenderer.h
   sandbox/jng/mvt_render_fixes/Server/src/Services/Rendering/ServerRenderingService.cpp
Log:
#2836: Re-instate clipping of MVT tile geometries at the stylizer level by having MVTRenderer::RequiresClipping() return true and having MVTRenderer::GetBounds() return a buffered extents (where buffer is the default of 80 screen pixels). We still do not have the undesired tile border artifact, which tells us that we're buffering by the correct amount. Having said that, this commit also adds a flag to render tile borders for visual debugging purposes. If you see tile border artifacts, it should now be due to this new flag being true.



Modified: sandbox/jng/mvt_render_fixes/Common/Renderers/MVTRenderer.cpp
===================================================================
--- sandbox/jng/mvt_render_fixes/Common/Renderers/MVTRenderer.cpp	2021-02-02 15:27:28 UTC (rev 9829)
+++ sandbox/jng/mvt_render_fixes/Common/Renderers/MVTRenderer.cpp	2021-02-10 12:13:42 UTC (rev 9830)
@@ -61,7 +61,10 @@
         , m_dfTopY(kmMAX_GM)
         , m_dfTileDim0(2 * kmMAX_GM)
         , m_parent(parent)
-    { }
+        , m_nBuffer(0)
+    {
+        m_nBuffer = 5 * m_nExtent / 256;
+    }
 
     ~MVTImpl()
     {
@@ -68,6 +71,30 @@
 
     }
 
+    double GetMVTBuffer()
+    {
+        double dfTileDim = m_dfTileDim0 / (1 << m_tileZ);
+        double dfBuffer = dfTileDim * m_nBuffer / m_nExtent;
+        return dfBuffer;
+    }
+
+    void AddDebugTileBorder(LineBuffer* lb)
+    {
+        auto layer = std::make_shared<MVTTileLayer>();
+        layer->setName("MG_DEBUG_TILE_BORDER");
+        // In the past it appeared we were able to get away with not setting this information, but with recent client libraries like
+        // OpenLayers, this information is expected to be there, so set it.
+        layer->setVersion(2);
+        layer->setExtent(4096);
+        m_tile.addLayer(layer);
+
+        auto feature = std::make_shared<MVTTileLayerFeature>();
+        feature->setType(MVTTileLayerFeature::GeomType::POLYGON);
+
+        if (EncodePolygon(feature.get(), lb))
+            layer->addFeature(feature);
+    }
+
     void SetActiveLayerBuilder(const std::string& name)
     {
         m_activeLayer = std::make_shared<MVTTileLayer>();
@@ -497,6 +524,8 @@
     double m_dfTopY;
     double m_dfTileDim0;
 
+    unsigned int m_nBuffer;
+
     unsigned int m_nExtent;
 };
 
@@ -505,6 +534,7 @@
     , m_mapInfo(nullptr)
     , m_layerInfo(nullptr)
     , m_fcInfo(nullptr)
+    , m_bRenderDebugTileBorders(false)
 {
 
 }
@@ -515,22 +545,24 @@
 //Called by the stylizer when rendering is about to begin on the map
 void MVTRenderer::StartMap(RS_MapUIInfo * /*mapInfo*/, RS_Bounds & extents, double mapScale, double dpi, double metersPerUnit, CSysTransformer * /*xformToLL*/)
 {
+    double dfBuffer = m_impl->GetMVTBuffer();
+
     m_mapScale = mapScale;
     m_dpi = dpi;
     m_metersPerUnit = metersPerUnit;
     m_extents = extents;
 
-    // find scale used to convert to pixel coordinates
-    // need to take aspect ratios into account
-    /*
-    double arDisplay = (double)m_width / (double)m_height;
-    double arMap = m_extents.width() / m_extents.height();
+    //Capture a copy of the original extents
+    m_origExtents.minx = extents.minx;
+    m_origExtents.miny = extents.miny;
+    m_origExtents.maxx = extents.maxx;
+    m_origExtents.maxy = extents.maxy;
 
-    double scale;
-    if (arDisplay > arMap)
-        scale = (double)m_height / m_extents.height();
-    else
-    */    
+    m_extents.minx -= dfBuffer;
+    m_extents.miny -= dfBuffer;
+    m_extents.maxx += dfBuffer;
+    m_extents.maxy += dfBuffer;
+
     double wScale = (double)m_width / m_extents.width();
     double hScale = (double)m_height / m_extents.height();
 
@@ -560,6 +592,18 @@
 {
     // clear the map info
     m_mapInfo = nullptr;
+
+    if (m_bRenderDebugTileBorders)
+    {
+        LineBuffer lb(1);
+        lb.MoveTo(m_origExtents.minx, m_origExtents.miny);
+        lb.LineTo(m_origExtents.maxx, m_origExtents.miny);
+        lb.LineTo(m_origExtents.maxx, m_origExtents.maxy);
+        lb.LineTo(m_origExtents.minx, m_origExtents.maxy);
+        lb.Close();
+
+        m_impl->AddDebugTileBorder(&lb);
+    }
 }
 
 //Called by the stylizer when rendering is about to begin on the map for the given layer
@@ -707,7 +751,7 @@
 
 bool MVTRenderer::RequiresClipping()
 {
-    return false;
+    return true;
 }
 
 bool MVTRenderer::RequiresLabelClipping()

Modified: sandbox/jng/mvt_render_fixes/Common/Renderers/MVTRenderer.h
===================================================================
--- sandbox/jng/mvt_render_fixes/Common/Renderers/MVTRenderer.h	2021-02-02 15:27:28 UTC (rev 9829)
+++ sandbox/jng/mvt_render_fixes/Common/Renderers/MVTRenderer.h	2021-02-10 12:13:42 UTC (rev 9830)
@@ -96,11 +96,14 @@
     int m_width;
     int m_height;
 
+    RS_Bounds m_origExtents;
     RS_Bounds m_extents;
     double m_drawingScale;
     double m_metersPerUnit;
     double m_dpi;
     double m_mapScale;
+
+    bool m_bRenderDebugTileBorders;
 };
 
 #endif
\ No newline at end of file

Modified: sandbox/jng/mvt_render_fixes/Server/src/Services/Rendering/ServerRenderingService.cpp
===================================================================
--- sandbox/jng/mvt_render_fixes/Server/src/Services/Rendering/ServerRenderingService.cpp	2021-02-02 15:27:28 UTC (rev 9829)
+++ sandbox/jng/mvt_render_fixes/Server/src/Services/Rendering/ServerRenderingService.cpp	2021-02-10 12:13:42 UTC (rev 9830)
@@ -521,6 +521,7 @@
     if (userInfo != NULL)
         sessionId = userInfo->GetMgSessionId();
 
+    ACE_DEBUG((LM_INFO, ACE_TEXT("(%t) Render MVT for (x: %d, y: %d, z: %d)\n"), x, y, z));
     MVTRenderer dr(x, y, z);
 
     RSMgSymbolManager mgr(m_svcResource);



More information about the mapguide-commits mailing list