[mapguide-commits] r9531 - in sandbox/jng/mvt: Common/Renderers Server/src/Services/Rendering Server/src/Services/Tile Server/src/UnitTesting

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Mon Jun 3 04:52:36 PDT 2019


Author: jng
Date: 2019-06-03 04:52:35 -0700 (Mon, 03 Jun 2019)
New Revision: 9531

Modified:
   sandbox/jng/mvt/Common/Renderers/MVTRenderer.cpp
   sandbox/jng/mvt/Server/src/Services/Rendering/ServerRenderingService.cpp
   sandbox/jng/mvt/Server/src/Services/Tile/TileCacheXYZProvider.cpp
   sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.cpp
   sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.h
Log:
MVTrenderer changes:
 - Optimize all input linebuffers before passing them to vtzero
 - Add missing null property checks when writing out properties

Also:
 - Add test for RenderTileMVT
 - Wire up MVT rendering in tile service

Modified: sandbox/jng/mvt/Common/Renderers/MVTRenderer.cpp
===================================================================
--- sandbox/jng/mvt/Common/Renderers/MVTRenderer.cpp	2019-06-02 12:42:11 UTC (rev 9530)
+++ sandbox/jng/mvt/Common/Renderers/MVTRenderer.cpp	2019-06-03 11:52:35 UTC (rev 9531)
@@ -78,6 +78,11 @@
         for (int i = 0; i < count; i++)
         {
             auto name = propNames[i];
+            if (activeFeature->IsNull(name))
+            {
+                continue;
+            }
+
             std::string mbName;
             UnicodeString::WideCharToMultiByte(name, mbName);
             auto propType = activeFeature->GetPropertyType(name);
@@ -164,6 +169,7 @@
         if (lb->cntr_count() == 1)
         {
             auto numPoints = lb->cntr_size(0);
+            builder.add_linestring(numPoints);
             auto pointOffset = lb->contour_start_point(0);
             for (auto i = 0; i < numPoints; i++)
             {
@@ -316,13 +322,27 @@
 //Entry point for polygon rendering. Perform any pre-rendering operations.
 void MVTRenderer::ProcessPolygon(LineBuffer * lb, RS_FillStyle & fill)
 {
-    m_impl->ProcessPolygon(m_activeFeature, lb);
+    //vtzero is very finicky about redundant coordinates, so feed vtzero an optimized LineBuffer
+    //that should weed such coordinates out
+    auto workbuffer = lb->Optimize(m_drawingScale, m_pPool);
+    std::unique_ptr<LineBuffer> spLB(workbuffer);
+
+    m_impl->ProcessPolygon(m_activeFeature, workbuffer);
+
+    LineBufferPool::FreeLineBuffer(m_pPool, spLB.release());
 }
 
 //Entry point for polyline rendering. Perform any pre-rendering operations.
 void MVTRenderer::ProcessPolyline(LineBuffer * lb, RS_LineStroke & lsym)
 {
-    m_impl->ProcessPolyline(m_activeFeature, lb);
+    //vtzero is very finicky about redundant coordinates, so feed vtzero an optimized LineBuffer
+    //that should weed such coordinates out
+    auto workbuffer = lb->Optimize(m_drawingScale, m_pPool);
+    std::unique_ptr<LineBuffer> spLB(workbuffer);
+
+    m_impl->ProcessPolyline(m_activeFeature, workbuffer);
+
+    LineBufferPool::FreeLineBuffer(m_pPool, spLB.release());
 }
 
 //Entry point for raster/image rendering. Perform any pre-rendering operations.
@@ -336,7 +356,14 @@
 //Entry point for marker rendering. Perform any pre-rendering operations.
 void MVTRenderer::ProcessMarker(LineBuffer * lb, RS_MarkerDef & mdef, bool allowOverpost, RS_Bounds * bounds)
 {
-    m_impl->ProcessMarker(m_activeFeature, lb);
+    //vtzero is very finicky about redundant coordinates, so feed vtzero an optimized LineBuffer
+    //that should weed such coordinates out
+    auto workbuffer = lb->Optimize(m_drawingScale, m_pPool);
+    std::unique_ptr<LineBuffer> spLB(workbuffer);
+
+    m_impl->ProcessMarker(m_activeFeature, workbuffer);
+
+    LineBufferPool::FreeLineBuffer(m_pPool, spLB.release());
 }
 
 //Entry point for label group rendering.

Modified: sandbox/jng/mvt/Server/src/Services/Rendering/ServerRenderingService.cpp
===================================================================
--- sandbox/jng/mvt/Server/src/Services/Rendering/ServerRenderingService.cpp	2019-06-02 12:42:11 UTC (rev 9530)
+++ sandbox/jng/mvt/Server/src/Services/Rendering/ServerRenderingService.cpp	2019-06-03 11:52:35 UTC (rev 9531)
@@ -555,7 +555,7 @@
     dr.StartMap(&mapInfo, extent, scale, map->GetDisplayDpi(), map->GetMetersPerUnit(), NULL);
 
     // We can't use RenderMapInternal, but we can use RenderLayers, which is all we really need
-    RenderLayers(map, roLayers, &ds, &dr, dstCs, true, scale, L"UTFGRID", NULL);
+    RenderLayers(map, roLayers, &ds, &dr, dstCs, true, scale, L"MVT", NULL);
 
     dr.EndMap();
 

Modified: sandbox/jng/mvt/Server/src/Services/Tile/TileCacheXYZProvider.cpp
===================================================================
--- sandbox/jng/mvt/Server/src/Services/Tile/TileCacheXYZProvider.cpp	2019-06-02 12:42:11 UTC (rev 9530)
+++ sandbox/jng/mvt/Server/src/Services/Tile/TileCacheXYZProvider.cpp	2019-06-03 11:52:35 UTC (rev 9531)
@@ -83,6 +83,11 @@
             // generate the tile
             img = svcRendering->RenderTileUTFGrid(map, baseMapLayerGroupName, tileRow, tileColumn, scaleIndex, map->GetDisplayDpi());
         }
+        else if (m_format == L"MVT")
+        {
+            // generate the tile
+            img = svcRendering->RenderTileMVT(map, baseMapLayerGroupName, tileRow, tileColumn, scaleIndex, map->GetDisplayDpi());
+        }
         else //Assume it must be image-based at this point
         {
             // generate the tile

Modified: sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.cpp
===================================================================
--- sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.cpp	2019-06-02 12:42:11 UTC (rev 9530)
+++ sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.cpp	2019-06-03 11:52:35 UTC (rev 9531)
@@ -1897,6 +1897,47 @@
     }
 }
 
+void TestRenderingService::TestCase_RenderTileMVT()
+{
+    try
+    {
+        Ptr<MgMap> map = CreateTestXYZMap();
+
+        //For ease of visual verfication, render the XYZ image tiles as baseline
+        Ptr<MgByteReader> imgTL = m_svcRendering->RenderTileXYZ(map, L"BaseLayers", 16797, 23893, 16, 96, MgImageFormats::Png);
+        Ptr<MgByteReader> imgTR = m_svcRendering->RenderTileXYZ(map, L"BaseLayers", 16798, 23893, 16, 96, MgImageFormats::Png);
+        Ptr<MgByteReader> imgBL = m_svcRendering->RenderTileXYZ(map, L"BaseLayers", 16797, 23894, 16, 96, MgImageFormats::Png);
+        Ptr<MgByteReader> imgBR = m_svcRendering->RenderTileXYZ(map, L"BaseLayers", 16798, 23894, 16, 96, MgImageFormats::Png);
+
+        imgTL->ToFile(L"../UnitTestFiles/RenderTileMVT_TL_ImageBaseline.png");
+        imgTR->ToFile(L"../UnitTestFiles/RenderTileMVT_TR_ImageBaseline.png");
+        imgBL->ToFile(L"../UnitTestFiles/RenderTileMVT_BL_ImageBaseline.png");
+        imgBR->ToFile(L"../UnitTestFiles/RenderTileMVT_BR_ImageBaseline.png");
+
+        //Now render the utf grids at the same place
+        Ptr<MgByteReader> mvtTL = m_svcRendering->RenderTileMVT(map, L"BaseLayers", 16797, 23893, 16, 96);
+        Ptr<MgByteReader> mvtTR = m_svcRendering->RenderTileMVT(map, L"BaseLayers", 16798, 23893, 16, 96);
+        Ptr<MgByteReader> mvtBL = m_svcRendering->RenderTileMVT(map, L"BaseLayers", 16797, 23894, 16, 96);
+        Ptr<MgByteReader> mvtBR = m_svcRendering->RenderTileMVT(map, L"BaseLayers", 16798, 23894, 16, 96);
+
+        CPPUNIT_ASSERT(MgMimeType::Mvt == mvtTL->GetMimeType());
+        CPPUNIT_ASSERT(MgMimeType::Mvt == mvtTR->GetMimeType());
+        CPPUNIT_ASSERT(MgMimeType::Mvt == mvtBL->GetMimeType());
+        CPPUNIT_ASSERT(MgMimeType::Mvt == mvtBR->GetMimeType());
+
+        mvtTL->ToFile(L"../UnitTestFiles/RenderTileMVT_TL.mvt");
+        mvtTR->ToFile(L"../UnitTestFiles/RenderTileMVT_TR.mvt");
+        mvtBL->ToFile(L"../UnitTestFiles/RenderTileMVT_BL.mvt");
+        mvtBR->ToFile(L"../UnitTestFiles/RenderTileMVT_UR.mvt");
+    }
+    catch (MgException* e)
+    {
+        STRING message = e->GetDetails(TEST_LOCALE);
+        SAFE_RELEASE(e);
+        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+    }
+}
+
 STRING TestRenderingService::GetPath(CREFSTRING basePath, CREFSTRING imageFormat, CREFSTRING extension)
 {
     STRING ret;

Modified: sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.h
===================================================================
--- sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.h	2019-06-02 12:42:11 UTC (rev 9530)
+++ sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.h	2019-06-03 11:52:35 UTC (rev 9531)
@@ -64,6 +64,7 @@
     CPPUNIT_TEST(TestCase_RenderTilePNG);
     CPPUNIT_TEST(TestCase_RenderTileXYZ_PNG);
     CPPUNIT_TEST(TestCase_RenderTileUTFGrid);
+    CPPUNIT_TEST(TestCase_RenderTileMVT);
 
     CPPUNIT_TEST(TestCase_StylizationFunctionsPNG8);
 
@@ -229,6 +230,7 @@
     void TestCase_RenderTilePNG() { TestCase_RenderTile(L"PNG", L"png"); }
     void TestCase_RenderTileXYZ_PNG() { TestCase_RenderTileXYZ(L"PNG", L"png"); }
     void TestCase_RenderTileUTFGrid();
+    void TestCase_RenderTileMVT();
 
     //PNG8 output tests
     void TestCase_RenderDynamicOverlayPNG8() { TestCase_RenderDynamicOverlay(L"PNG8", L"png"); }



More information about the mapguide-commits mailing list