[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