[Git][debian-gis-team/mapserver][upstream] New upstream version 7.6.1
Bas Couwenberg
gitlab at salsa.debian.org
Fri Jul 31 19:14:42 BST 2020
Bas Couwenberg pushed to branch upstream at Debian GIS Project / mapserver
Commits:
53ba6c57 by Bas Couwenberg at 2020-07-31T19:33:00+02:00
New upstream version 7.6.1
- - - - -
27 changed files:
- CMakeLists.txt
- HISTORY.TXT
- mapcopy.c
- mapfile.c
- mapgeos.c
- maplabel.c
- mapmetadata.c
- mapmssql2008.c
- mapogcfilter.c
- mapogcsld.c
- mapogr.cpp
- mapows.c
- mapows.h
- mapscript/java/CMakeLists.txt
- mapscript/phpng/CMakeLists.txt
- mapscript/phpng/php7module.i
- mapscript/python/CMakeLists.txt
- mapscript/python/examples/project_csv.py
- mapscript/python/examples/shpdump.py
- mapscript/python/examples/shpinfo.py
- mapscript/python/examples/wxs.py
- mapscript/python/mapscript/__init__.py
- mapscript/python/pymodule.i
- mapserver.h
- mapsymbol.c
- mapwms.c
- renderers/agg/include/agg_conv_curve.h
Changes:
=====================================
CMakeLists.txt
=====================================
@@ -17,7 +17,7 @@ include(CheckCSourceCompiles)
set (MapServer_VERSION_MAJOR 7)
set (MapServer_VERSION_MINOR 6)
-set (MapServer_VERSION_REVISION 0)
+set (MapServer_VERSION_REVISION 1)
set (MapServer_VERSION_SUFFIX "")
# Set C++ version
=====================================
HISTORY.TXT
=====================================
@@ -12,6 +12,11 @@ For a complete change history, please see the Git log comments. For more
details about recent point releases, please see the online changelog at:
http://mapserver.org/development/changelog/
+7.6.1 release (2020-07-31)
+-------------------------
+
+- No major changes, see detailed changelog for bug fixes
+
7.6.0 release (2020-05-08)
--------------------------
=====================================
mapcopy.c
=====================================
@@ -1217,6 +1217,7 @@ int msCopyMap(mapObj *dst, mapObj *src)
MS_COPYSTELEM(resolution);
MS_COPYSTRING(dst->shapepath, src->shapepath);
MS_COPYSTRING(dst->mappath, src->mappath);
+ MS_COPYSTELEM(sldurl);
MS_COPYCOLOR(&(dst->imagecolor), &(src->imagecolor));
=====================================
mapfile.c
=====================================
@@ -5890,6 +5890,7 @@ int initMap(mapObj *map)
map->cellsize = 0;
map->shapepath = NULL;
map->mappath = NULL;
+ map->sldurl = NULL;
MS_INIT_COLOR(map->imagecolor, 255,255,255,255); /* white */
=====================================
mapgeos.c
=====================================
@@ -804,7 +804,22 @@ shapeObj *msGEOSOffsetCurve(shapeObj *p, double offset) {
g1 = (GEOSGeom) p->geometry;
if(!g1) return NULL;
- g2 = GEOSOffsetCurve_r(handle,g1, offset, 4, GEOSBUF_JOIN_MITRE, fabs(offset*1.5));
+ if (GEOSGeomTypeId_r(handle,g1) == GEOS_MULTILINESTRING)
+ {
+ GEOSGeom *lines = malloc(p->numlines*sizeof(GEOSGeom));
+ if (!lines) return NULL;
+ for(int i=0; i<p->numlines; i++)
+ {
+ lines[i] = GEOSOffsetCurve_r(handle, GEOSGetGeometryN_r(handle,g1,i),
+ offset, 4, GEOSBUF_JOIN_MITRE, fabs(offset*1.5));
+ }
+ g2 = GEOSGeom_createCollection_r(handle,GEOS_MULTILINESTRING, lines, p->numlines);
+ free(lines);
+ }
+ else
+ {
+ g2 = GEOSOffsetCurve_r(handle,g1, offset, 4, GEOSBUF_JOIN_MITRE, fabs(offset*1.5));
+ }
return msGEOSGeometry2Shape(g2);
#else
msSetError(MS_GEOSERR, "GEOS Offset Curve support is not available.", "msGEOSingleSidedBuffer()");
=====================================
maplabel.c
=====================================
@@ -143,6 +143,16 @@ void msCopyTextSymbol(textSymbolObj *dst, textSymbolObj *src) {
dst->textpath = msSmallMalloc(sizeof(textPathObj));
msCopyTextPath(dst->textpath,src->textpath);
}
+ if(dst->style_bounds) {
+ int i;
+ dst->style_bounds = msSmallCalloc(src->label->numstyles, sizeof(label_bounds*));
+ for(i=0; i<src->label->numstyles; i++) {
+ if(src->style_bounds[i]) {
+ dst->style_bounds[i] = msSmallMalloc(sizeof(label_bounds));
+ copyLabelBounds(dst->style_bounds[i], src->style_bounds[i]);
+ }
+ }
+ }
}
static int labelNeedsDeepCopy(labelObj *label) {
=====================================
mapmetadata.c
=====================================
@@ -31,6 +31,7 @@
#include "mapowscommon.h"
#include "maplibxml2.h"
+#ifdef USE_LIBXML2
/************************************************************************/
/* _msMetadataGetCharacterString */
@@ -860,6 +861,8 @@ int msMetadataDispatch(mapObj *map, cgiRequestObj *cgi_request, owsRequestObj *o
return status;
}
+#endif /* USE_LIBXML2 */
+
/************************************************************************/
/* msMetadataCreateParamsObj */
/* */
=====================================
mapmssql2008.c
=====================================
@@ -1122,6 +1122,24 @@ static int getMSSQLMajorVersion(layerObj* layer)
return layerinfo->mssqlversion_major;
}
+static int addFilter(layerObj *layer, char **query)
+{
+ if (layer->filter.native_string) {
+ (*query) = msStringConcatenate(*query, " WHERE (");
+ (*query) = msStringConcatenate(*query, layer->filter.native_string);
+ (*query) = msStringConcatenate(*query, ")");
+ return MS_TRUE;
+ }
+ else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") != NULL) {
+ (*query) = msStringConcatenate(*query, " WHERE (");
+ (*query) = msStringConcatenate(*query, msLayerGetProcessingKey(layer, "NATIVE_FILTER"));
+ (*query) = msStringConcatenate(*query, ")");
+ return MS_TRUE;
+ }
+
+ return MS_FALSE;
+}
+
/* Get the layer extent as specified in the mapfile or a largest area */
/* covering all features */
int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
@@ -1167,6 +1185,10 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
}
query = msStringConcatenate(query, ") AS extentcol FROM ");
query = msStringConcatenate(query, layerinfo->geom_table);
+
+ /* adding attribute filter */
+ addFilter(layer, &query);
+
query = msStringConcatenate(query, ") SELECT extentcol.STPointN(1).STX, extentcol.STPointN(1).STY, extentcol.STPointN(3).STX, extentcol.STPointN(3).STY FROM extent");
}
else {
@@ -1183,6 +1205,10 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
}
query = msStringConcatenate(query, ".STEnvelope() as envelope from ");
query = msStringConcatenate(query, layerinfo->geom_table);
+
+ /* adding attribute filter */
+ addFilter(layer, &query);
+
query = msStringConcatenate(query, "), CORNERS as (SELECT envelope.STPointN(1) as point from ENVELOPE UNION ALL select envelope.STPointN(3) from ENVELOPE) SELECT MIN(point.STX), MIN(point.STY), MAX(point.STX), MAX(point.STY) FROM CORNERS");
}
@@ -1204,7 +1230,7 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
}
rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_CHAR, result_data, sizeof(result_data), &retLen);
- if (rc == SQL_ERROR) {
+ if (rc == SQL_ERROR || retLen < 0) {
msSetError(MS_QUERYERR, "Failed to get MinX value", "msMSSQL2008LayerGetExtent()");
return MS_FAILURE;
}
@@ -1214,7 +1240,7 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
extent->minx = atof(result_data);
rc = SQLGetData(layerinfo->conn->hstmt, 2, SQL_C_CHAR, result_data, sizeof(result_data), &retLen);
- if (rc == SQL_ERROR) {
+ if (rc == SQL_ERROR || retLen < 0) {
msSetError(MS_QUERYERR, "Failed to get MinY value", "msMSSQL2008LayerGetExtent()");
return MS_FAILURE;
}
@@ -1224,7 +1250,7 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
extent->miny = atof(result_data);
rc = SQLGetData(layerinfo->conn->hstmt, 3, SQL_C_CHAR, result_data, sizeof(result_data), &retLen);
- if (rc == SQL_ERROR) {
+ if (rc == SQL_ERROR || retLen < 0) {
msSetError(MS_QUERYERR, "Failed to get MaxX value", "msMSSQL2008LayerGetExtent()");
return MS_FAILURE;
}
@@ -1234,7 +1260,7 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
extent->maxx = atof(result_data);
rc = SQLGetData(layerinfo->conn->hstmt, 4, SQL_C_CHAR, result_data, sizeof(result_data), &retLen);
- if (rc == SQL_ERROR) {
+ if (rc == SQL_ERROR || retLen < 0) {
msSetError(MS_QUERYERR, "Failed to get MaxY value", "msMSSQL2008LayerGetExtent()");
return MS_FAILURE;
}
@@ -1271,16 +1297,7 @@ int msMSSQL2008LayerGetNumFeatures(layerObj *layer)
query = msStringConcatenate(query, layerinfo->geom_table);
/* adding attribute filter */
- if (layer->filter.native_string) {
- query = msStringConcatenate(query, " WHERE (");
- query = msStringConcatenate(query, layer->filter.native_string);
- query = msStringConcatenate(query, ")");
- }
- else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") != NULL) {
- query = msStringConcatenate(query, " WHERE (");
- query = msStringConcatenate(query, msLayerGetProcessingKey(layer, "NATIVE_FILTER"));
- query = msStringConcatenate(query, ")");
- }
+ addFilter(layer, &query);
if (!executeSQL(layerinfo->conn, query)) {
msFree(query);
@@ -1324,9 +1341,15 @@ static int prepare_database(layerObj *layer, rectObj rect, char **query_string)
/*
"Geometry::STGeomFromText('POLYGON(())',)" + terminator = 40 chars
Plus 10 formatted doubles (15 digits of precision, a decimal point, a space/comma delimiter each = 17 chars each)
+ Plus SRID + comma - if SRID is a long...we'll be safe with 10 chars
+
+ or for geography columns
+
+ "Geography::STGeomFromText('CURVEPOLYGON(())',)" + terminator = 46 chars
+ Plus 18 formatted doubles (15 digits of precision, a decimal point, a space/comma delimiter each = 17 chars each)
Plus SRID + comma - if SRID is a long...we'll be safe with 10 chars
*/
- char box3d[40 + 10 * 22 + 11];
+ char box3d[46 + 18 * 22 + 11];
int t;
char *pos_from, *pos_ftab, *pos_space, *pos_paren;
@@ -1382,10 +1405,25 @@ static int prepare_database(layerObj *layer, rectObj rect, char **query_string)
/* create point shape for rectangles with zero area */
sprintf(box3d, "%s::STGeomFromText('POINT(%.15g %.15g)',%s)", /* %s.STSrid)", */
layerinfo->geom_column_type, rect.minx, rect.miny, layerinfo->user_srid);
- }
- else {
- sprintf(box3d, "%s::STGeomFromText('POLYGON((%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */
- layerinfo->geom_column_type,
+ } else if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) {
+ /* SQL Server has a problem when x is -180 or 180 */
+ double minx = rect.minx <= -180? -179.999: rect.minx;
+ double maxx = rect.maxx >= 180? 179.999: rect.maxx;
+ double miny = rect.miny < -90? -90: rect.miny;
+ double maxy = rect.maxy > 90? 90: rect.maxy;
+ sprintf(box3d, "Geography::STGeomFromText('CURVEPOLYGON((%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */
+ minx, miny,
+ minx + (maxx - minx) / 2, miny,
+ maxx, miny,
+ maxx, miny + (maxy - miny) / 2,
+ maxx, maxy,
+ minx + (maxx - minx) / 2, maxy,
+ minx, maxy,
+ minx, miny + (maxy - miny) / 2,
+ minx, miny,
+ layerinfo->user_srid);
+ } else {
+ sprintf(box3d, "Geometry::STGeomFromText('POLYGON((%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */
rect.minx, rect.miny,
rect.maxx, rect.miny,
rect.maxx, rect.maxy,
@@ -1508,18 +1546,7 @@ static int prepare_database(layerObj *layer, rectObj rect, char **query_string)
}
/* adding attribute filter */
- if (layer->filter.native_string) {
- query = msStringConcatenate(query, " WHERE (");
- query = msStringConcatenate(query, layer->filter.native_string);
- query = msStringConcatenate(query, ")");
- hasFilter = MS_TRUE;
- }
- else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") != NULL) {
- query = msStringConcatenate(query, " WHERE (");
- query = msStringConcatenate(query, msLayerGetProcessingKey(layer, "NATIVE_FILTER"));
- query = msStringConcatenate(query, ")");
- hasFilter = MS_TRUE;
- }
+ hasFilter = addFilter(layer, &query);
if( bIsValidRect ) {
/* adding spatial filter */
@@ -2583,18 +2610,7 @@ int msMSSQL2008LayerGetShapeCount(layerObj *layer, rectObj rect, projectionObj *
query = msStringConcatenate(query, layerinfo->geom_table);
/* adding attribute filter */
- if (layer->filter.native_string) {
- query = msStringConcatenate(query, " WHERE (");
- query = msStringConcatenate(query, layer->filter.native_string);
- query = msStringConcatenate(query, ")");
- hasFilter = MS_TRUE;
- }
- else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") != NULL) {
- query = msStringConcatenate(query, " WHERE (");
- query = msStringConcatenate(query, msLayerGetProcessingKey(layer, "NATIVE_FILTER"));
- query = msStringConcatenate(query, ")");
- hasFilter = MS_TRUE;
- }
+ hasFilter = addFilter(layer, &query);
if( bIsValidRect ) {
/* adding spatial filter */
=====================================
mapogcfilter.c
=====================================
@@ -1038,6 +1038,8 @@ static CPLXMLNode* FLTFindGeometryNode(CPLXMLNode* psXMLNode,
*pbPolygon = 1;
else if ((psGMLElement= CPLGetXMLNode(psXMLNode, "Box")))
*pbPolygon = 1;
+ else if ((psGMLElement= CPLGetXMLNode(psXMLNode, "Envelope")))
+ *pbPolygon = 1;
else if ((psGMLElement= CPLGetXMLNode(psXMLNode, "LineString")))
*pbLine = 1;
else if ((psGMLElement= CPLGetXMLNode(psXMLNode, "MultiLineString")))
@@ -2267,7 +2269,7 @@ char *FLTGetSQLExpression(FilterEncodingNode *psFilterNode, layerObj *lp)
#else
msSetError(MS_MISCERR, "OWS support is not available.",
"FLTGetSQLExpression()");
- return(MS_FAILURE);
+ return NULL;
#endif
}
=====================================
mapogcsld.c
=====================================
@@ -72,6 +72,7 @@ int msSLDApplySLDURL(mapObj *map, const char *szURL, int iLayer,
int nStatus = MS_FAILURE;
if (map && szURL) {
+ map->sldurl = (char*)szURL;
pszSLDTmpFile = msTmpFile(map, map->mappath, NULL, "sld.xml");
if (pszSLDTmpFile == NULL) {
pszSLDTmpFile = msTmpFile(map, NULL, NULL, "sld.xml" );
@@ -110,6 +111,7 @@ int msSLDApplySLDURL(mapObj *map, const char *szURL, int iLayer,
if (pszSLDbuf)
nStatus = msSLDApplySLD(map, pszSLDbuf, iLayer, pszStyleLayerName, ppszLayerNames);
}
+ map->sldurl = NULL;
}
msFree(pszSLDbuf);
@@ -2255,10 +2257,54 @@ int msSLDParseExternalGraphic(CPLXMLNode *psExternalGraphic,
if (psTmp && psTmp->psChild) {
pszURL = (char*)psTmp->psChild->pszValue;
+ char *symbolurl = NULL;
+ // Handle relative URL for ExternalGraphic
+ if (map->sldurl && !strstr(pszURL,"://"))
+ {
+ char *baseurl = NULL;
+ char *relpath = NULL;
+ symbolurl = malloc(sizeof(char)*MS_MAXPATHLEN);
+ if (pszURL[0] != '/') {
+ // Symbol file is relative to SLD file
+ // e.g. SLD : http://example.com/path/to/sld.xml
+ // and symbol: assets/symbol.svg
+ // lead to: http://example.com/path/to/assets/symbol.svg
+ baseurl = msGetPath(map->sldurl);
+ relpath = pszURL;
+ }
+ else
+ {
+ // Symbol file is relative to the root of SLD server
+ // e.g. SLD : http://example.com/path/to/sld.xml
+ // and symbol: /path/to/assets/symbol.svg
+ // lead to: http://example.com/path/to/assets/symbol.svg
+ baseurl = msStrdup(map->sldurl);
+ relpath = pszURL+1;
+ char * sep = strstr(baseurl,"://");
+ if (sep)
+ sep += 3;
+ else
+ sep = baseurl;
+ sep = strchr(sep,'/');
+ if (!sep)
+ sep = baseurl + strlen(baseurl);
+ sep[1] = '\0';
+ }
+ msBuildPath(symbolurl,baseurl,relpath);
+ msFree(baseurl);
+ }
+ else
+ {
+ // Absolute URL
+ // e.g. symbol: http://example.com/path/to/assets/symbol.svg
+ symbolurl = msStrdup(pszURL);
+ }
+
/* validate the ExternalGraphic parameter */
- if(msValidateParameter(pszURL, msLookupHashTable(&(map->web.validation), "sld_external_graphic"),
+ if(msValidateParameter(symbolurl, msLookupHashTable(&(map->web.validation), "sld_external_graphic"),
NULL, NULL, NULL) != MS_SUCCESS) {
msSetError(MS_WEBERR, "SLD ExternalGraphic OnlineResource value fails to validate against sld_external_graphic VALIDATION", "mapserv()");
+ msFree(symbolurl);
return MS_FAILURE;
}
@@ -2266,8 +2312,9 @@ int msSLDParseExternalGraphic(CPLXMLNode *psExternalGraphic,
/*external symbols using http will be automaticallly downloaded. The file should be
saved in a temporary directory (msAddImageSymbol) #2305*/
psStyle->symbol = msGetSymbolIndex(&map->symbolset,
- pszURL,
+ symbolurl,
MS_TRUE);
+ msFree(symbolurl);
if (psStyle->symbol > 0 && psStyle->symbol < map->symbolset.numsymbols)
psStyle->symbolname = msStrdup(map->symbolset.symbol[psStyle->symbol]->name);
=====================================
mapogr.cpp
=====================================
@@ -3447,7 +3447,11 @@ static int msOGRExtractTopSpatialFilter( msOGRFileInfo *info,
pSpatialFilterNode);
}
- if( (expr->m_nToken == MS_TOKEN_COMPARISON_INTERSECTS || expr->m_nToken == MS_TOKEN_COMPARISON_CONTAINS ) &&
+ if( (expr->m_nToken == MS_TOKEN_COMPARISON_INTERSECTS ||
+ expr->m_nToken == MS_TOKEN_COMPARISON_OVERLAPS ||
+ expr->m_nToken == MS_TOKEN_COMPARISON_CROSSES ||
+ expr->m_nToken == MS_TOKEN_COMPARISON_WITHIN ||
+ expr->m_nToken == MS_TOKEN_COMPARISON_CONTAINS) &&
expr->m_aoChildren.size() == 2 &&
expr->m_aoChildren[1]->m_nToken == MS_TOKEN_LITERAL_SHAPE )
{
=====================================
mapows.c
=====================================
@@ -261,11 +261,13 @@ int msOWSDispatch(mapObj *map, cgiRequestObj *request, int ows_mode)
}
if (ows_request.service == NULL) {
+#ifdef USE_LIBXML2
if (ows_request.request && EQUAL(ows_request.request, "GetMetadata")) {
status = msMetadataDispatch(map, request, &ows_request);
msOWSClearRequestObj(&ows_request);
return status;
}
+#endif
#ifdef USE_WFS_SVR
if( msOWSLookupMetadata(&(map->web.metadata), "FO", "cite_wfs2") != NULL ) {
status = msWFSException(map, "service", MS_OWS_ERROR_MISSING_PARAMETER_VALUE, NULL );
=====================================
mapows.h
=====================================
@@ -410,12 +410,12 @@ typedef struct {
int numnamespaces;
} gmlNamespaceListObj;
+MS_DLL_EXPORT gmlItemListObj *msGMLGetItems(layerObj *layer, const char *metadata_namespaces);
+MS_DLL_EXPORT void msGMLFreeItems(gmlItemListObj *itemList);
#if defined(USE_WMS_SVR) || defined (USE_WFS_SVR)
MS_DLL_EXPORT int msItemInGroups(const char *name, gmlGroupListObj *groupList);
-MS_DLL_EXPORT gmlItemListObj *msGMLGetItems(layerObj *layer, const char *metadata_namespaces);
-MS_DLL_EXPORT void msGMLFreeItems(gmlItemListObj *itemList);
MS_DLL_EXPORT gmlConstantListObj *msGMLGetConstants(layerObj *layer, const char *metadata_namespaces);
MS_DLL_EXPORT void msGMLFreeConstants(gmlConstantListObj *constantList);
MS_DLL_EXPORT gmlGeometryListObj *msGMLGetGeometries(layerObj *layer, const char *metadata_namespaces, int bWithDefaultGeom);
=====================================
mapscript/java/CMakeLists.txt
=====================================
@@ -4,7 +4,7 @@ include(${SWIG_USE_FILE})
find_package(JNI)
find_package(Java)
if(NOT JNI_INCLUDE_DIRS OR NOT Java_JAVAC_EXECUTABLE OR NOT Java_JAR_EXECUTABLE)
- message(SEND_ERROR "Could not find required Java componenents. Try setting the JAVA_HOME environment variable (required on e.g. Ubuntu)")
+ message(SEND_ERROR "Could not find required Java components. Try setting the JAVA_HOME environment variable (required on e.g. Ubuntu)")
endif(NOT JNI_INCLUDE_DIRS OR NOT Java_JAVAC_EXECUTABLE OR NOT Java_JAR_EXECUTABLE)
include_directories(${JNI_INCLUDE_DIRS})
@@ -14,6 +14,12 @@ include_directories(${PROJECT_SOURCE_DIR}/mapscript/java)
set (CMAKE_SWIG_OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/edu/umn/gis/mapscript")
set(CMAKE_SWIG_FLAGS -package edu.umn.gis.mapscript)
+# hide warnings
+if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-strict-aliasing")
+endif ()
+
+
if (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} VERSION_GREATER 3.7)
swig_add_library(javamapscript TYPE MODULE LANGUAGE java SOURCES ../mapscript.i)
else ()
=====================================
mapscript/phpng/CMakeLists.txt
=====================================
@@ -84,4 +84,6 @@ set_target_properties(${SWIG_MODULE_mapscript_REAL_NAME} PROPERTIES PREFIX "")
if(NOT WIN32)
install(TARGETS php_mapscriptng DESTINATION ${PHP_EXTENSION_DIR})
+ # install the required file containing MapServer constants and functions
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/mapscript.php DESTINATION ${PHP_EXTENSION_DIR} COMPONENT dev)
endif()
=====================================
mapscript/phpng/php7module.i
=====================================
@@ -1,3 +1,5 @@
+%module mapscriptng;
+
%pragma(php) phpinfo="
php_info_print_table_start();
php_info_print_table_row(2, \"MapServer Version\", msGetVersion());
=====================================
mapscript/python/CMakeLists.txt
=====================================
@@ -108,7 +108,9 @@ add_custom_command(
DEPENDS mapscriptwheel.stamp
OUTPUT mapscripttests.stamp
COMMAND ${PYTHON_VENV_SCRIPTS}/pip install --no-index --find-links=${OUTPUT_FOLDER}/dist mapscript
- COMMAND ${PYTHON_VENV_SCRIPTS}/pytest --pyargs mapscript.tests
+ # ERROR: file or package not found: mapscript.tests (missing __init__.py?) is caused by
+ # ImportError: DLL load failed while importing _mapscript: The specified module could not be found.
+ COMMAND ${PYTHON_VENV_SCRIPTS}/python -m pytest --pyargs mapscript.tests
COMMAND ${PYTHON_VENV_SCRIPTS}/python -m mapscript.examples.project_csv ${PROJECT_SOURCE_DIR}/tests/cities.csv 2 1 EPSG:4326 EPSG:3857 > test.csv
COMMAND ${PYTHON_VENV_SCRIPTS}/python -m mapscript.examples.shpdump ${PROJECT_SOURCE_DIR}/tests/polygon.shp > shpdump.txt
COMMAND ${PYTHON_VENV_SCRIPTS}/python -m mapscript.examples.shpinfo ${PROJECT_SOURCE_DIR}/tests/polygon.shp > shpinfo.txt
=====================================
mapscript/python/examples/project_csv.py
=====================================
@@ -1,72 +1,72 @@
-#!/usr/bin/env python
-
-"""
-Simple example to read a csv file and reproject point x/y data
-
-Usage:
-
-project_csv.py cities.csv 2 1 EPSG:4326 EPSG:3857
-
-"""
-
-import sys
-import csv
-from io import open
-import mapscript
-
-
-def main(input_file, x_field_idx, y_field_idx, input_proj, output_proj):
-
- # set input and output projections
- proj_in = mapscript.projectionObj(input_proj)
- proj_out = mapscript.projectionObj(output_proj)
-
- # open file
- with open(input_file, encoding='utf-8') as f:
- # read csv
- csv_in = csv.reader(f)
- headers = next(csv_in)
-
- # setup output
- csv_out = csv.writer(sys.stdout)
- csv_out.writerow(headers)
-
- for row in csv_in:
- # set pointObj
- point = mapscript.pointObj(float(row[x_field_idx]), float(row[y_field_idx]))
- # project
- point.project(proj_in, proj_out)
-
- # update with reprojected coordinates
- row[x_field_idx] = point.x
- row[y_field_idx] = point.y
-
- csv_out.writerow(row)
-
-
-def usage():
- """
- Display usage if program is used incorrectly
- """
- print("Syntax: %s <csvfile> <x_col> <y_col> <epsg_code_in> <epsg_code_out>" % sys.argv[0])
- sys.exit(2)
-
-
-# check input parameters
-
-if (len(sys.argv) != 6):
- usage()
-
-
-input_file = sys.argv[1]
-
-# set x and y indices
-
-x_field_idx = int(sys.argv[2])
-y_field_idx = int(sys.argv[3])
-
-# get projection codes
-
-input_proj = "init="+sys.argv[4].lower()
-output_proj = "init="+sys.argv[5].lower()
-main(input_file, x_field_idx, y_field_idx, input_proj, output_proj)
+#!/usr/bin/env python
+
+"""
+Simple example to read a csv file and reproject point x/y data
+
+Usage:
+
+project_csv.py cities.csv 2 1 EPSG:4326 EPSG:3857
+
+"""
+
+import sys
+import csv
+from io import open
+import mapscript
+
+
+def main(input_file, x_field_idx, y_field_idx, input_proj, output_proj):
+
+ # set input and output projections
+ proj_in = mapscript.projectionObj(input_proj)
+ proj_out = mapscript.projectionObj(output_proj)
+
+ # open file
+ with open(input_file, encoding='utf-8') as f:
+ # read csv
+ csv_in = csv.reader(f)
+ headers = next(csv_in)
+
+ # setup output
+ csv_out = csv.writer(sys.stdout)
+ csv_out.writerow(headers)
+
+ for row in csv_in:
+ # set pointObj
+ point = mapscript.pointObj(float(row[x_field_idx]), float(row[y_field_idx]))
+ # project
+ point.project(proj_in, proj_out)
+
+ # update with reprojected coordinates
+ row[x_field_idx] = point.x
+ row[y_field_idx] = point.y
+
+ csv_out.writerow(row)
+
+
+def usage():
+ """
+ Display usage if program is used incorrectly
+ """
+ print("Syntax: %s <csvfile> <x_col> <y_col> <epsg_code_in> <epsg_code_out>" % sys.argv[0])
+ sys.exit(2)
+
+
+# check input parameters
+
+if (len(sys.argv) != 6):
+ usage()
+
+
+input_file = sys.argv[1]
+
+# set x and y indices
+
+x_field_idx = int(sys.argv[2])
+y_field_idx = int(sys.argv[3])
+
+# get projection codes
+
+input_proj = "init="+sys.argv[4].lower()
+output_proj = "init="+sys.argv[5].lower()
+main(input_file, x_field_idx, y_field_idx, input_proj, output_proj)
=====================================
mapscript/python/examples/shpdump.py
=====================================
@@ -1,94 +1,94 @@
-#!/usr/bin/env python
-
-"""
-Dump the contents of the passed in Shapefile
-
-Usage:
-
-python shpdump.py polygon.shp
-
-"""
-
-import mapscript
-import sys
-import os
-
-
-def plural(x):
- """
- Returns an 's' if plural
-
- Useful in print statements to avoid something like 'point(s)'
- """
- if x > 1:
- return 's'
- return ''
-
-
-def get_shapefile_object(sf_path):
-
- # make sure can access .shp file, create shapefileObj
-
- if os.access(sf_path, os.F_OK):
- sf_obj = mapscript.shapefileObj(sf_path, -1)
- else:
- print("Can't access {}".format(sf_path))
- sys.exit(2)
-
- return sf_obj
-
-
-def main(sf_path):
-
- if not sf_path.lower().endswith(".shp"):
- sf_path += ".shp"
-
- sf_obj = get_shapefile_object(sf_path)
-
- # create an empty Shapefile object
-
- s_obj = mapscript.shapeObj()
-
- # loop through each shape in the original Shapefile
-
- for i in range(sf_obj.numshapes):
-
- # get the object at index i
- sf_obj.get(i, s_obj)
- print("Shape %i has %i part%s" % (i, s_obj.numlines, plural(s_obj.numlines)))
- print("Bounds (%f, %f) (%f, %f)" % (s_obj.bounds.minx, s_obj.bounds.miny, s_obj.bounds.maxx, s_obj.bounds.maxy))
-
- # loop through parts of each shape
-
- for j in range(s_obj.numlines):
-
- # get the jth part of the ith object
-
- part = s_obj.get(j)
- print("Part %i has %i point%s" % (j, part.numpoints, plural(part.numpoints)))
-
- # loop through points in each part
-
- for k in range(part.numpoints):
-
- # get the kth point of the jth part of the ith shape
-
- point = part.get(k)
- print("%i: %f, %f" % (k, point.x, point.y))
-
-
-def usage():
- """
- Display usage if program is used incorrectly
- """
- print("Syntax: %s <shapefile_path>" % sys.argv[0])
- sys.exit(2)
-
-
-# make sure passing in filename argument
-if len(sys.argv) != 2:
- usage()
-
-
-sf_path = sys.argv[1]
-main(sf_path)
+#!/usr/bin/env python
+
+"""
+Dump the contents of the passed in Shapefile
+
+Usage:
+
+python shpdump.py polygon.shp
+
+"""
+
+import mapscript
+import sys
+import os
+
+
+def plural(x):
+ """
+ Returns an 's' if plural
+
+ Useful in print statements to avoid something like 'point(s)'
+ """
+ if x > 1:
+ return 's'
+ return ''
+
+
+def get_shapefile_object(sf_path):
+
+ # make sure can access .shp file, create shapefileObj
+
+ if os.access(sf_path, os.F_OK):
+ sf_obj = mapscript.shapefileObj(sf_path, -1)
+ else:
+ print("Can't access {}".format(sf_path))
+ sys.exit(2)
+
+ return sf_obj
+
+
+def main(sf_path):
+
+ if not sf_path.lower().endswith(".shp"):
+ sf_path += ".shp"
+
+ sf_obj = get_shapefile_object(sf_path)
+
+ # create an empty Shapefile object
+
+ s_obj = mapscript.shapeObj()
+
+ # loop through each shape in the original Shapefile
+
+ for i in range(sf_obj.numshapes):
+
+ # get the object at index i
+ sf_obj.get(i, s_obj)
+ print("Shape %i has %i part%s" % (i, s_obj.numlines, plural(s_obj.numlines)))
+ print("Bounds (%f, %f) (%f, %f)" % (s_obj.bounds.minx, s_obj.bounds.miny, s_obj.bounds.maxx, s_obj.bounds.maxy))
+
+ # loop through parts of each shape
+
+ for j in range(s_obj.numlines):
+
+ # get the jth part of the ith object
+
+ part = s_obj.get(j)
+ print("Part %i has %i point%s" % (j, part.numpoints, plural(part.numpoints)))
+
+ # loop through points in each part
+
+ for k in range(part.numpoints):
+
+ # get the kth point of the jth part of the ith shape
+
+ point = part.get(k)
+ print("%i: %f, %f" % (k, point.x, point.y))
+
+
+def usage():
+ """
+ Display usage if program is used incorrectly
+ """
+ print("Syntax: %s <shapefile_path>" % sys.argv[0])
+ sys.exit(2)
+
+
+# make sure passing in filename argument
+if len(sys.argv) != 2:
+ usage()
+
+
+sf_path = sys.argv[1]
+main(sf_path)
=====================================
mapscript/python/examples/shpinfo.py
=====================================
@@ -1,109 +1,109 @@
-#!/usr/bin/env python
-
-"""
-Extracts basic descriptive information from a Shapefile
-
-Usage:
-
-python shpinfo.py point.shp
-
-"""
-import mapscript
-import sys
-import os
-
-
-def get_shapefile_object(sf_path):
-
- # make sure can access .shp file, create shapefileObj
-
- if os.access(sf_path, os.F_OK):
- sf_obj = mapscript.shapefileObj(sf_path)
- else:
- print("Can't access {}".format(sf_path))
- sys.exit(2)
-
- return sf_obj
-
-
-def get_shapefile_details(sf_obj):
-
- # dictionary of shapefile types
-
- types = {
- mapscript.MS_SHAPEFILE_POINT: 'Point',
- mapscript.MS_SHAPEFILE_ARC: 'Line',
- mapscript.MS_SHAPEFILE_POLYGON: 'Polygon',
- mapscript.MS_SHAPEFILE_MULTIPOINT: 'Multipoint',
-
- mapscript.MS_SHP_POINTZ: 'PointZ',
- mapscript.MS_SHP_ARCZ: 'LineZ',
- mapscript.MS_SHP_POLYGONZ: 'PolygonZ',
- mapscript.MS_SHP_MULTIPOINTZ: 'MultipointZ',
-
- mapscript.MS_SHP_POINTM: 'Multipoint',
- mapscript.MS_SHP_ARCM: 'LineM',
- mapscript.MS_SHP_POLYGONM: 'PolygonM',
- mapscript.MS_SHP_MULTIPOINTM: 'MultipointM'
- }
-
- # print out basic information that is part of the shapefile object
-
- print("\tType: %s" % types[sf_obj.type])
-
- print("\tBounds: (%f, %f) (%f, %f)" % (sf_obj.bounds.minx,
- sf_obj.bounds.miny,
- sf_obj.bounds.maxx,
- sf_obj.bounds.maxy))
-
- print("\tNumber of features: %i" % sf_obj.numshapes)
-
-
-def get_dbf_details(sf_obj):
-
- # get DBF object
-
- dbf_obj = sf_obj.getDBF()
-
- # print out table characteristics
-
- print("\tNumber of records in DBF: %i" % dbf_obj.nRecords)
- print("\tNumber of fields: %i" % dbf_obj.nFields)
- print("")
- print("\t%-20s %12s %8s %10s" % ("Name", "Type", "Length", "Decimals"))
- print("\t-----------------------------------------------------")
-
- # print out field characteristics
-
- for idx in range(0, dbf_obj.nFields):
- print("\t%-20s %12s %8d %10d" % (dbf_obj.getFieldName(idx), dbf_obj.getFieldType(idx),
- dbf_obj.getFieldWidth(idx), dbf_obj.getFieldDecimals(idx)))
-
-
-def main(sf_path):
-
- if not sf_path.lower().endswith(".shp"):
- sf_path += ".shp"
-
- sf_obj = get_shapefile_object(sf_path)
-
- print("Shapefile %s:" % sf_path)
- print("")
-
- get_shapefile_details(sf_obj)
- get_dbf_details(sf_obj)
-
-
-def usage():
- """
- Display usage if program is used incorrectly
- """
- print("Syntax: %s <shapefile_path>" % sys.argv[0])
- sys.exit(2)
-
-
-# make sure a filename argument is provided
-if len(sys.argv) != 2:
- usage()
-
-main(sys.argv[1])
+#!/usr/bin/env python
+
+"""
+Extracts basic descriptive information from a Shapefile
+
+Usage:
+
+python shpinfo.py point.shp
+
+"""
+import mapscript
+import sys
+import os
+
+
+def get_shapefile_object(sf_path):
+
+ # make sure can access .shp file, create shapefileObj
+
+ if os.access(sf_path, os.F_OK):
+ sf_obj = mapscript.shapefileObj(sf_path)
+ else:
+ print("Can't access {}".format(sf_path))
+ sys.exit(2)
+
+ return sf_obj
+
+
+def get_shapefile_details(sf_obj):
+
+ # dictionary of shapefile types
+
+ types = {
+ mapscript.MS_SHAPEFILE_POINT: 'Point',
+ mapscript.MS_SHAPEFILE_ARC: 'Line',
+ mapscript.MS_SHAPEFILE_POLYGON: 'Polygon',
+ mapscript.MS_SHAPEFILE_MULTIPOINT: 'Multipoint',
+
+ mapscript.MS_SHP_POINTZ: 'PointZ',
+ mapscript.MS_SHP_ARCZ: 'LineZ',
+ mapscript.MS_SHP_POLYGONZ: 'PolygonZ',
+ mapscript.MS_SHP_MULTIPOINTZ: 'MultipointZ',
+
+ mapscript.MS_SHP_POINTM: 'Multipoint',
+ mapscript.MS_SHP_ARCM: 'LineM',
+ mapscript.MS_SHP_POLYGONM: 'PolygonM',
+ mapscript.MS_SHP_MULTIPOINTM: 'MultipointM'
+ }
+
+ # print out basic information that is part of the shapefile object
+
+ print("\tType: %s" % types[sf_obj.type])
+
+ print("\tBounds: (%f, %f) (%f, %f)" % (sf_obj.bounds.minx,
+ sf_obj.bounds.miny,
+ sf_obj.bounds.maxx,
+ sf_obj.bounds.maxy))
+
+ print("\tNumber of features: %i" % sf_obj.numshapes)
+
+
+def get_dbf_details(sf_obj):
+
+ # get DBF object
+
+ dbf_obj = sf_obj.getDBF()
+
+ # print out table characteristics
+
+ print("\tNumber of records in DBF: %i" % dbf_obj.nRecords)
+ print("\tNumber of fields: %i" % dbf_obj.nFields)
+ print("")
+ print("\t%-20s %12s %8s %10s" % ("Name", "Type", "Length", "Decimals"))
+ print("\t-----------------------------------------------------")
+
+ # print out field characteristics
+
+ for idx in range(0, dbf_obj.nFields):
+ print("\t%-20s %12s %8d %10d" % (dbf_obj.getFieldName(idx), dbf_obj.getFieldType(idx),
+ dbf_obj.getFieldWidth(idx), dbf_obj.getFieldDecimals(idx)))
+
+
+def main(sf_path):
+
+ if not sf_path.lower().endswith(".shp"):
+ sf_path += ".shp"
+
+ sf_obj = get_shapefile_object(sf_path)
+
+ print("Shapefile %s:" % sf_path)
+ print("")
+
+ get_shapefile_details(sf_obj)
+ get_dbf_details(sf_obj)
+
+
+def usage():
+ """
+ Display usage if program is used incorrectly
+ """
+ print("Syntax: %s <shapefile_path>" % sys.argv[0])
+ sys.exit(2)
+
+
+# make sure a filename argument is provided
+if len(sys.argv) != 2:
+ usage()
+
+main(sys.argv[1])
=====================================
mapscript/python/examples/wxs.py
=====================================
@@ -1,61 +1,61 @@
-#!/usr/bin/env python
-
-"""
-Output WMS GetCapabilities response for a Mapfile
-
-Usage:
-
-python wxs.py test.map
-
-"""
-import sys
-import xml.dom.minidom
-import mapscript
-
-
-def main(map_file):
-
- map = mapscript.mapObj(map_file)
- map.setMetaData("ows_onlineresource", "http://dummy.org/")
- ows_req = mapscript.OWSRequest()
-
- ows_req.type = mapscript.MS_GET_REQUEST
-
- ows_req.setParameter("SERVICE", "WMS")
- ows_req.setParameter("VERSION", "1.1.0")
- ows_req.setParameter("REQUEST", "GetCapabilities")
-
- mapscript.msIO_installStdoutToBuffer()
- dispatch_status = map.OWSDispatch(ows_req)
-
- if dispatch_status != mapscript.MS_SUCCESS:
- print("An error occurred")
-
- content_type = mapscript.msIO_stripStdoutBufferContentType()
- mapscript.msIO_stripStdoutBufferContentHeaders()
- result = mapscript.msIO_getStdoutBufferBytes()
-
- # [('Content-Type', 'application/vnd.ogc.wms_xml; charset=UTF-8'), ('Content-Length', '11385')]
- response_headers = [('Content-Type', content_type),
- ('Content-Length', str(len(result)))]
-
- assert int(response_headers[1][1]) > 0
-
- dom = xml.dom.minidom.parseString(result)
- print(dom.toprettyxml(indent="", newl=""))
-
-
-def usage():
- """
- Display usage if program is used incorrectly
- """
- print("Syntax: %s <mapfile_path>" % sys.argv[0])
- sys.exit(2)
-
-
-# make sure a filename argument is provided
-if len(sys.argv) != 2:
- usage()
-
-map_file = sys.argv[1]
-main(map_file)
+#!/usr/bin/env python
+
+"""
+Output WMS GetCapabilities response for a Mapfile
+
+Usage:
+
+python wxs.py test.map
+
+"""
+import sys
+import xml.dom.minidom
+import mapscript
+
+
+def main(map_file):
+
+ map = mapscript.mapObj(map_file)
+ map.setMetaData("ows_onlineresource", "http://dummy.org/")
+ ows_req = mapscript.OWSRequest()
+
+ ows_req.type = mapscript.MS_GET_REQUEST
+
+ ows_req.setParameter("SERVICE", "WMS")
+ ows_req.setParameter("VERSION", "1.1.0")
+ ows_req.setParameter("REQUEST", "GetCapabilities")
+
+ mapscript.msIO_installStdoutToBuffer()
+ dispatch_status = map.OWSDispatch(ows_req)
+
+ if dispatch_status != mapscript.MS_SUCCESS:
+ print("An error occurred")
+
+ content_type = mapscript.msIO_stripStdoutBufferContentType()
+ mapscript.msIO_stripStdoutBufferContentHeaders()
+ result = mapscript.msIO_getStdoutBufferBytes()
+
+ # [('Content-Type', 'application/vnd.ogc.wms_xml; charset=UTF-8'), ('Content-Length', '11385')]
+ response_headers = [('Content-Type', content_type),
+ ('Content-Length', str(len(result)))]
+
+ assert int(response_headers[1][1]) > 0
+
+ dom = xml.dom.minidom.parseString(result)
+ print(dom.toprettyxml(indent="", newl=""))
+
+
+def usage():
+ """
+ Display usage if program is used incorrectly
+ """
+ print("Syntax: %s <mapfile_path>" % sys.argv[0])
+ sys.exit(2)
+
+
+# make sure a filename argument is provided
+if len(sys.argv) != 2:
+ usage()
+
+map_file = sys.argv[1]
+main(map_file)
=====================================
mapscript/python/mapscript/__init__.py
=====================================
@@ -1 +1,12 @@
-from .mapscript import *
\ No newline at end of file
+import inspect
+from .mapscript import *
+
+# change all the class module names from mapscript.mapscript to mapscript
+
+for key, value in globals().copy().items():
+ if inspect.isclass(value) and value.__module__.startswith('mapscript.'):
+ value.__module__= 'mapscript'
+
+# remove the submodule name
+
+del mapscript
=====================================
mapscript/python/pymodule.i
=====================================
@@ -114,8 +114,10 @@ CreateTupleFromDoubleArray( double *first, unsigned int size ) {
PyObject* val = PyList_GetItem(values, i);
%#if PY_MAJOR_VERSION >= 3
- $1[i] = PyUnicode_AsUTF8(key);
- $2[i] = PyUnicode_AsUTF8(val);
+ // Changed in version 3.7: The return type is now const char * rather than char *
+ // avoid warning C4090: '=': different 'const' qualifiers
+ $1[i] = (char *)PyUnicode_AsUTF8(key);
+ $2[i] = (char *)PyUnicode_AsUTF8(val);
%#else
$1[i] = PyString_AsString(key);
$2[i] = PyString_AsString(val);
=====================================
mapserver.h
=====================================
@@ -1843,6 +1843,7 @@ void msCopyTextPath(textPathObj *dst, textPathObj *src);
void freeTextPath(textPathObj *tp);
void initTextSymbol(textSymbolObj *ts);
void freeTextSymbol(textSymbolObj *ts);
+void copyLabelBounds(label_bounds *dst, label_bounds *src);
void msCopyTextSymbol(textSymbolObj *dst, textSymbolObj *src);
void msPopulateTextSymbolForLabelAndString(textSymbolObj *ts, labelObj *l, char *string, double scalefactor, double resolutionfactor, label_cache_mode cache);
#endif /* SWIG */
@@ -1902,6 +1903,10 @@ void msPopulateTextSymbolForLabelAndString(textSymbolObj *ts, labelObj *l, char
char *shapepath; /* where are the shape files located */
char *mappath; /* path of the mapfile, all path are relative to this path */
+ char *sldurl; // URL of SLD document as specified with "&SLD=..."
+ // WMS parameter. Currently this reference is used
+ // only in mapogcsld.c and has a NULL value
+ // outside that context.
#ifndef SWIG
paletteObj palette; /* holds a map palette */
=====================================
mapsymbol.c
=====================================
@@ -399,7 +399,7 @@ int msAddImageSymbol(symbolSetObj *symbolset, char *filename)
unlink(tmpfullfilename);
msFree(tmpfilename);
msFree(tmppath);
- return MS_FAILURE;
+ return -1;
}
}
msFree(tmpfilename);
=====================================
mapwms.c
=====================================
@@ -1021,17 +1021,18 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
if (strcasecmp(names[i], "SLD") == 0 || strcasecmp(names[i], "SLD_BODY") == 0) {
sldenabled = msOWSLookupMetadata(&(map->web.metadata), "MO", "sld_enabled");
- if (sldenabled == NULL)
+ if (sldenabled == NULL) {
sldenabled = "true";
+ }
- if (strcasecmp(sldenabled, "true") == 0) {
- if (strcasecmp(names[i], "SLD") == 0) {
- sld_url = values[i];
- }
- if (strcasecmp(names[i], "SLD_BODY") == 0) {
- sld_body = values[i];
- }
+ if (strcasecmp(sldenabled, "true") == 0) {
+ if (strcasecmp(names[i], "SLD") == 0) {
+ sld_url = values[i];
}
+ if (strcasecmp(names[i], "SLD_BODY") == 0) {
+ sld_body = values[i];
+ }
+ }
}
}
=====================================
renderers/agg/include/agg_conv_curve.h
=====================================
@@ -156,8 +156,8 @@ namespace mapserver
double ct2_x = 0;
double ct2_y = 0;
- double end_x;
- double end_y;
+ double end_x = 0;
+ double end_y = 0;
unsigned cmd = m_source->vertex(x, y);
switch(cmd)
View it on GitLab: https://salsa.debian.org/debian-gis-team/mapserver/-/commit/53ba6c57ae0ad952785fe056122a04c8c4aa3f77
--
View it on GitLab: https://salsa.debian.org/debian-gis-team/mapserver/-/commit/53ba6c57ae0ad952785fe056122a04c8c4aa3f77
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20200731/63dd5c56/attachment-0001.html>
More information about the Pkg-grass-devel
mailing list