[SCM] mapserver branch, upstream, updated. upstream/6.4.0_rc1-2-g93aca18
Bas Couwenberg
sebastic at xs4all.nl
Fri Jan 3 01:28:36 UTC 2014
The following commit has been merged in the upstream branch:
commit 93aca18800f640556dd484b27aea010071876b00
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Thu Jan 2 16:08:10 2014 +0100
Imported Upstream version 6.4.1
diff --git a/.travis.yml b/.travis.yml
index c31ed27..62781fc 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -41,9 +41,11 @@ compiler:
before_install:
- git submodule update --init --recursive
+ - sudo mv /etc/apt/sources.list.d/pgdg-source.list* /tmp
+ - sudo apt-get -qq remove postgis
- sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable
- sudo apt-get update -qq
- - sudo apt-get install -qq bison flex swig cmake librsvg2-dev colordiff postgis postgresql-9.1-postgis-2.0-scripts libpq-dev libpng12-dev libjpeg-dev libgif-dev libgeos-dev libgd2-noxpm-dev libfreetype6-dev libfcgi-dev libcurl4-gnutls-dev libcairo2-dev libgdal1-dev libproj-dev libxml2-dev python-dev php5-dev libexempi-dev lcov lftp
+ - sudo apt-get install -qq bison flex swig cmake librsvg2-dev colordiff postgis postgresql-9.1-postgis-2.0-scripts libpq-dev libpng12-dev libjpeg-dev libgif-dev libgeos-dev libgd2-xpm-dev libfreetype6-dev libfcgi-dev libcurl4-gnutls-dev libcairo2-dev libgdal1-dev libproj-dev libxml2-dev python-dev php5-dev libexempi-dev lcov lftp
- sudo pip install git+git://github.com/tbonfort/cpp-coveralls.git@extensions
- cd msautotest
- ./create_postgis_test_data.sh
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 268e05d..5837920 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,16 +2,22 @@ cmake_minimum_required (VERSION 2.6)
project (MapServer)
+if("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}")
+ message(FATAL_ERROR "In-source builds are not permitted. Make a separate folder for building:
+ mkdir build; cd build; cmake ..
+Before that, remove the files created by this failed run:
+ rm -rf CMakeCache.txt CMakeFiles")
+endif("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}")
+
include(CheckLibraryExists)
include(CheckFunctionExists)
include(CheckIncludeFile)
include(CheckCSourceCompiles)
-
set (MapServer_VERSION_MAJOR 6)
set (MapServer_VERSION_MINOR 4)
-set (MapServer_VERSION_REVISION 0)
+set (MapServer_VERSION_REVISION 1)
set (MapServer_VERSION_SUFFIX "")
set(TARGET_VERSION_MAJOR ${MapServer_VERSION_MAJOR})
@@ -142,7 +148,33 @@ if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wdeclaration-after-statement")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
endif()
-SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+
+if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
+ set(_LIBDIR_DEFAULT "lib")
+ # Override this default 'lib' with 'lib64' iff:
+ # - we are on Linux system but NOT cross-compiling
+ # - we are NOT on debian
+ # - we are on a 64 bits system
+ # reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf
+ # Note that the future of multi-arch handling may be even
+ # more complicated than that: http://wiki.debian.org/Multiarch
+ if(CMAKE_SYSTEM_NAME MATCHES "Linux"
+ AND NOT CMAKE_CROSSCOMPILING
+ AND NOT EXISTS "/etc/debian_version")
+ if(NOT DEFINED CMAKE_SIZEOF_VOID_P)
+ message(AUTHOR_WARNING
+ "Unable to determine default CMAKE_INSTALL_LIBDIR directory because no target architecture is known. "
+ "Please enable at least one language before including GNUInstallDirs.")
+ else()
+ if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
+ set(_LIBDIR_DEFAULT "lib64")
+ endif()
+ endif()
+ endif()
+ set(CMAKE_INSTALL_LIBDIR "${_LIBDIR_DEFAULT}" CACHE PATH "object code libraries (${_LIBDIR_DEFAULT})")
+endif()
+
+SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
SET(CMAKE_MACOSX_RPATH ON)
@@ -858,6 +890,7 @@ status_optional_feature("Apache Module (Experimental)" "${USE_APACHE_MODULE}")
message(STATUS "")
message(STATUS "Will install files to ${CMAKE_INSTALL_PREFIX}")
+message(STATUS "Will install libraries to ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
include_directories("${PROJECT_BINARY_DIR}")
@@ -870,23 +903,23 @@ endif(WIN32)
#INSTALL(FILES mapserver-api.h ${PROJECT_BINARY_DIR}/mapserver-version.h DESTINATION include)
if(USE_ORACLE_PLUGIN)
- INSTALL(TARGETS msplugin_oracle DESTINATION lib)
+ INSTALL(TARGETS msplugin_oracle DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif(USE_ORACLE_PLUGIN)
if(USE_MSSQL2008)
- INSTALL(TARGETS msplugin_mssql2008 DESTINATION lib)
+ INSTALL(TARGETS msplugin_mssql2008 DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif(USE_MSSQL2008)
if(USE_SDE91)
- INSTALL(TARGETS msplugin_sde91 DESTINATION lib)
+ INSTALL(TARGETS msplugin_sde91 DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif(USE_SDE91)
if(USE_SDE92)
- INSTALL(TARGETS msplugin_sde92 DESTINATION lib)
+ INSTALL(TARGETS msplugin_sde92 DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif(USE_SDE92)
-INSTALL(TARGETS sortshp shptree shptreevis msencrypt legend scalebar tile4ms shptreetst shp2img mapserv mapserver RUNTIME DESTINATION bin LIBRARY DESTINATION lib)
+INSTALL(TARGETS sortshp shptree shptreevis msencrypt legend scalebar tile4ms shptreetst shp2img mapserv mapserver RUNTIME DESTINATION bin LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
if(BUILD_STATIC)
- INSTALL(TARGETS mapserver_static DESTINATION lib)
+ INSTALL(TARGETS mapserver_static DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif(BUILD_STATIC)
diff --git a/cmake/FindFreetype.cmake b/cmake/FindFreetype.cmake
index edb142d..37ae220 100644
--- a/cmake/FindFreetype.cmake
+++ b/cmake/FindFreetype.cmake
@@ -44,7 +44,7 @@
FIND_PATH(FREETYPE_INCLUDE_DIR_ft2build ft2build.h
HINTS
$ENV{FREETYPE_DIR}
- PATH_SUFFIXES include
+ PATH_SUFFIXES include include/freetype2
PATHS
/usr/local/X11R6/include
/usr/local/X11/include
@@ -54,7 +54,7 @@ FIND_PATH(FREETYPE_INCLUDE_DIR_ft2build ft2build.h
/usr/freeware/include
)
-FIND_PATH(FREETYPE_INCLUDE_DIR_freetype2 freetype/config/ftheader.h
+FIND_PATH(FREETYPE_INCLUDE_DIR_freetype2 freetype/config/ftheader.h config/ftheader.h
HINTS
$ENV{FREETYPE_DIR}/include/freetype2
PATHS
@@ -64,7 +64,7 @@ FIND_PATH(FREETYPE_INCLUDE_DIR_freetype2 freetype/config/ftheader.h
/sw/include
/opt/local/include
/usr/freeware/include
- PATH_SUFFIXES freetype2
+ PATH_SUFFIXES freetype freetype2
)
set(FREETYPE_NAMES ${FREETYPE_NAMES} freetype libfreetype freetype219 freetype239 freetype241MT_D freetype2411)
diff --git a/cmake/FindMySQL.cmake b/cmake/FindMySQL.cmake
index 1b5de7e..3bbf824 100644
--- a/cmake/FindMySQL.cmake
+++ b/cmake/FindMySQL.cmake
@@ -13,9 +13,10 @@ ENDIF (MYSQL_INCLUDE_DIR)
FIND_PATH(MYSQL_INCLUDE_DIR mysql.h
/usr/local/include/mysql
/usr/include/mysql
+ PATH_SUFFIXES mysql
)
-SET(MYSQL_NAMES mysqlclient mysqlclient_r)
+SET(MYSQL_NAMES mysqlclient mysqlclient_r libmysqlclient)
FIND_LIBRARY(MYSQL_LIBRARY
NAMES ${MYSQL_NAMES}
PATHS /usr/lib /usr/local/lib
diff --git a/cmake/FindPostgreSQL.cmake b/cmake/FindPostgreSQL.cmake
index c30a3db..9ed6dd5 100644
--- a/cmake/FindPostgreSQL.cmake
+++ b/cmake/FindPostgreSQL.cmake
@@ -5,10 +5,24 @@
# POSTGRESQL_LIBRARY, the libraries needed to use POSTGRESQL.
# POSTGRESQL_FOUND, If false, do not try to use PostgreSQL.
#
-# Copyright (c) 2013 Thomas Bonfort
+# Copyright (c) 2013 Thomas Bonfort, Andy Colson
#
+find_program(PG_CONFIG NAMES pg_config
+ PATHS
+ $ENV{ProgramFiles}/PostgreSQL/*/bin
+ $ENV{SystemDrive}/PostgreSQL/*/bin
+)
+
+if (PG_CONFIG)
+ exec_program( ${PG_CONFIG} ARGS "--includedir" OUTPUT_VARIABLE PG_INC_PATH )
+ exec_program( ${PG_CONFIG} ARGS "--libdir" OUTPUT_VARIABLE PG_LIB_PATH )
+else()
+ message(WARNING "pg_config not found, will try some defaults")
+endif()
+
find_path(POSTGRESQL_INCLUDE_DIR libpq-fe.h
+ ${PG_INC_PATH}
/usr/include/server
/usr/include/postgresql
/usr/include/pgsql/server
@@ -23,6 +37,7 @@ find_path(POSTGRESQL_INCLUDE_DIR libpq-fe.h
find_library(POSTGRESQL_LIBRARY NAMES pq libpq
PATHS
+ ${PG_LIB_PATH}
/usr/lib
/usr/local/lib
/usr/lib/postgresql
diff --git a/hittest.c b/hittest.c
index 6fdeaae..4c4b0a0 100644
--- a/hittest.c
+++ b/hittest.c
@@ -138,6 +138,9 @@ int msHitTestShape(mapObj *map, layerObj *layer, shapeObj *shape, int drawmode,
int msHitTestLayer(mapObj *map, layerObj *layer, layer_hittest *hittest) {
int status;
+#ifdef USE_GEOS
+ shapeObj searchpoly;
+#endif
if(!msLayerIsVisible(map,layer)) {
hittest->status = 0;
return MS_SUCCESS;
@@ -179,6 +182,10 @@ int msHitTestLayer(mapObj *map, layerObj *layer, layer_hittest *hittest) {
searchrect.maxx = map->width-1;
searchrect.maxy = map->height-1;
}
+#ifdef USE_GEOS
+ msInitShape(&searchpoly);
+ msRectToPolygon(searchrect,&searchpoly);
+#endif
status = msLayerWhichShapes(layer, searchrect, MS_FALSE);
if(status == MS_DONE) { /* no overlap */
@@ -203,6 +210,12 @@ int msHitTestLayer(mapObj *map, layerObj *layer, layer_hittest *hittest) {
while((status = msLayerNextShape(layer, &shape)) == MS_SUCCESS) {
int drawmode = MS_DRAWMODE_FEATURES;
+#ifdef USE_GEOS
+ if(!msGEOSIntersects(&shape,&searchpoly)) {
+ msFreeShape(&shape);
+ continue;
+ }
+#else
if(shape.type == MS_SHAPE_POLYGON) {
msClipPolygonRect(&shape, map->extent);
} else {
@@ -212,6 +225,7 @@ int msHitTestLayer(mapObj *map, layerObj *layer, layer_hittest *hittest) {
msFreeShape(&shape);
continue;
}
+#endif
/* Check if the shape size is ok to be drawn, we need to clip */
if((shape.type == MS_SHAPE_LINE || shape.type == MS_SHAPE_POLYGON) && (minfeaturesize > 0)) {
msTransformShape(&shape, map->extent, map->cellsize, NULL);
@@ -262,6 +276,11 @@ int msHitTestLayer(mapObj *map, layerObj *layer, layer_hittest *hittest) {
}
int msHitTestMap(mapObj *map, map_hittest *hittest) {
int i,status;
+ map->cellsize = msAdjustExtent(&(map->extent),map->width,map->height);
+ status = msCalculateScale(map->extent,map->units,map->width,map->height, map->resolution, &map->scaledenom);
+ if(status != MS_SUCCESS) {
+ return MS_FAILURE;
+ }
for(i=0; i<map->numlayers; i++) {
layerObj *lp = map->layers[i];
status = msHitTestLayer(map,lp,&hittest->layerhits[i]);
diff --git a/mapfile.c b/mapfile.c
index 1389d49..6e0ae01 100644
--- a/mapfile.c
+++ b/mapfile.c
@@ -665,9 +665,9 @@ static void writeColor(FILE *stream, int indent, const char *name, colorObj *def
sprintf(buffer+4, "%02x", color->blue);
sprintf(buffer+6, "%02x", color->alpha);
*(buffer+8) = 0;
- fprintf(stream, "%s \"#%s\"\n", name, buffer);
+ msIO_fprintf(stream, "%s \"#%s\"\n", name, buffer);
} else {
- fprintf(stream, "%s %d %d %d\n", name, color->red, color->green, color->blue);
+ msIO_fprintf(stream, "%s %d %d %d\n", name, color->red, color->green, color->blue);
}
#endif
}
diff --git a/maplabel.c b/maplabel.c
index cf97176..dbda6d6 100644
--- a/maplabel.c
+++ b/maplabel.c
@@ -351,25 +351,28 @@ int msAddLabelGroup(mapObj *map, int layerindex, int classindex, shapeObj *shape
MS_IMAGE_RENDERER(maskLayer->maskimage)->getRasterBufferHandle(maskLayer->maskimage,&rb);
x = MS_NINT(point->x);
y = MS_NINT(point->y);
+ /* Using label repeatdistance, we might have a point with x/y below 0. See #4764 */
+ if (x >= 0 && x < rb.width && y >= 0 && y < rb.height) {
#ifdef USE_GD
- if(rb.type == MS_BUFFER_BYTE_RGBA) {
+ if(rb.type == MS_BUFFER_BYTE_RGBA) {
+ alphapixptr = rb.data.rgba.a+rb.data.rgba.row_step*y + rb.data.rgba.pixel_step*x;
+ if(!*alphapixptr) {
+ /* label point does not intersect mask */
+ return MS_SUCCESS;
+ }
+ } else {
+ if(!gdImageGetPixel(rb.data.gd_img,x,y))
+ return MS_SUCCESS;
+ }
+#else
+ assert(rb.type == MS_BUFFER_BYTE_RGBA);
alphapixptr = rb.data.rgba.a+rb.data.rgba.row_step*y + rb.data.rgba.pixel_step*x;
if(!*alphapixptr) {
/* label point does not intersect mask */
return MS_SUCCESS;
}
- } else {
- if(!gdImageGetPixel(rb.data.gd_img,x,y))
- return MS_SUCCESS;
- }
-#else
- assert(rb.type == MS_BUFFER_BYTE_RGBA);
- alphapixptr = rb.data.rgba.a+rb.data.rgba.row_step*y + rb.data.rgba.pixel_step*x;
- if(!*alphapixptr) {
- /* label point does not intersect mask */
- return MS_SUCCESS;
- }
#endif
+ }
} else {
msSetError(MS_MISCERR, "Layer (%s) references references a mask layer, but the selected renderer does not support them", "msAddLabelGroup()", layerPtr->name);
return (MS_FAILURE);
@@ -543,54 +546,60 @@ int msAddLabel(mapObj *map, labelObj *label, int layerindex, int classindex, sha
if (point) {
int x = MS_NINT(point->x);
int y = MS_NINT(point->y);
+ /* Using label repeatdistance, we might have a point with x/y below 0. See #4764 */
+ if (x >= 0 && x < rb.width && y >= 0 && y < rb.height) {
#ifdef USE_GD
- if(rb.type == MS_BUFFER_BYTE_RGBA) {
+ if(rb.type == MS_BUFFER_BYTE_RGBA) {
+ alphapixptr = rb.data.rgba.a+rb.data.rgba.row_step*y + rb.data.rgba.pixel_step*x;
+ if(!*alphapixptr) {
+ /* label point does not intersect mask */
+ return MS_SUCCESS;
+ }
+ } else {
+ if(!gdImageGetPixel(rb.data.gd_img,x,y)) {
+ return MS_SUCCESS;
+ }
+ }
+#else
+ assert(rb.type == MS_BUFFER_BYTE_RGBA);
alphapixptr = rb.data.rgba.a+rb.data.rgba.row_step*y + rb.data.rgba.pixel_step*x;
if(!*alphapixptr) {
/* label point does not intersect mask */
return MS_SUCCESS;
}
- } else {
- if(!gdImageGetPixel(rb.data.gd_img,x,y)) {
- return MS_SUCCESS;
- }
- }
-#else
- assert(rb.type == MS_BUFFER_BYTE_RGBA);
- alphapixptr = rb.data.rgba.a+rb.data.rgba.row_step*y + rb.data.rgba.pixel_step*x;
- if(!*alphapixptr) {
- /* label point does not intersect mask */
- return MS_SUCCESS;
- }
#endif
+ }
} else if (labelpath) {
int i = 0;
for (i = 0; i < labelpath->path.numpoints; i++) {
int x = MS_NINT(labelpath->path.point[i].x);
int y = MS_NINT(labelpath->path.point[i].y);
+ /* Using label repeatdistance, we might have a point with x/y below 0. See #4764 */
+ if (x >= 0 && x < rb.width && y >= 0 && y < rb.height) {
#ifdef USE_GD
- if (rb.type == MS_BUFFER_BYTE_RGBA) {
+ if (rb.type == MS_BUFFER_BYTE_RGBA) {
+ alphapixptr = rb.data.rgba.a + rb.data.rgba.row_step * y + rb.data.rgba.pixel_step*x;
+ if (!*alphapixptr) {
+ /* label point does not intersect mask */
+ msFreeLabelPathObj(labelpath);
+ return MS_SUCCESS;
+ }
+ } else {
+ if (!gdImageGetPixel(rb.data.gd_img, x, y)) {
+ msFreeLabelPathObj(labelpath);
+ return MS_SUCCESS;
+ }
+ }
+#else
+ assert(rb.type == MS_BUFFER_BYTE_RGBA);
alphapixptr = rb.data.rgba.a + rb.data.rgba.row_step * y + rb.data.rgba.pixel_step*x;
if (!*alphapixptr) {
/* label point does not intersect mask */
msFreeLabelPathObj(labelpath);
return MS_SUCCESS;
}
- } else {
- if (!gdImageGetPixel(rb.data.gd_img, x, y)) {
- msFreeLabelPathObj(labelpath);
- return MS_SUCCESS;
- }
- }
-#else
- assert(rb.type == MS_BUFFER_BYTE_RGBA);
- alphapixptr = rb.data.rgba.a + rb.data.rgba.row_step * y + rb.data.rgba.pixel_step*x;
- if (!*alphapixptr) {
- /* label point does not intersect mask */
- msFreeLabelPathObj(labelpath);
- return MS_SUCCESS;
- }
#endif
+ }
}
}
} else {
diff --git a/maplegend.c b/maplegend.c
index cad44f8..d8b82f7 100644
--- a/maplegend.c
+++ b/maplegend.c
@@ -119,6 +119,7 @@ int msDrawLegendIcon(mapObj *map, layerObj *lp, classObj *theclass,
}
/* initialize the box used for polygons and for outlines */
+ msInitShape(&box);
box.line = (lineObj *)msSmallMalloc(sizeof(lineObj));
box.numlines = 1;
box.line[0].point = (pointObj *)msSmallMalloc(sizeof(pointObj)*5);
@@ -200,7 +201,6 @@ int msDrawLegendIcon(mapObj *map, layerObj *lp, classObj *theclass,
int symbolNum;
styleObj imgStyle;
symbolObj *symbol=NULL;
- for(symbolNum=0; symbolNum<theclass->numstyles; symbolNum++)
symbolNum = msAddImageSymbol(&(map->symbolset), msBuildPath(szPath, map->mappath, theclass->keyimage));
if(symbolNum == -1) {
msSetError(MS_GDERR, "Failed to open legend key image", "msCreateLegendIcon()");
@@ -244,6 +244,7 @@ int msDrawLegendIcon(mapObj *map, layerObj *lp, classObj *theclass,
else
offset = theclass->styles[0]->width/2;
}
+ msInitShape(&zigzag);
zigzag.line = (lineObj *)msSmallMalloc(sizeof(lineObj));
zigzag.numlines = 1;
zigzag.line[0].point = (pointObj *)msSmallMalloc(sizeof(pointObj)*4);
diff --git a/mapogcsld.c b/mapogcsld.c
index 1152c7c..9f019e2 100644
--- a/mapogcsld.c
+++ b/mapogcsld.c
@@ -1128,7 +1128,7 @@ int msSLDParseLineSymbolizer(CPLXMLNode *psRoot, layerObj *psLayer,
psOffset = CPLGetXMLNode(psRoot, "PerpendicularOffset");
if (psOffset && psOffset->psChild && psOffset->psChild->pszValue) {
psLayer->class[nClassId]->styles[iStyle]->offsetx = atoi(psOffset->psChild->pszValue);
- psLayer->class[nClassId]->styles[iStyle]->offsety = psLayer->class[nClassId]->styles[iStyle]->offsetx;
+ psLayer->class[nClassId]->styles[iStyle]->offsety = MS_STYLE_SINGLE_SIDED_OFFSET;
}
}
@@ -3030,7 +3030,7 @@ int ParseTextLinePlacement(CPLXMLNode *psRoot, classObj *psClass)
psOffset = CPLGetXMLNode(psRoot, "PerpendicularOffset");
if (psOffset && psOffset->psChild && psOffset->psChild->pszValue) {
psLabelObj->offsetx = atoi(psOffset->psChild->pszValue);
- psLabelObj->offsety = atoi(psOffset->psChild->pszValue);
+ psLabelObj->offsety = MS_LABEL_PERPENDICULAR_OFFSET;
/*if there is a PerpendicularOffset, we will assume that the
best setting for mapserver would be to use angle=0 and the
@@ -3039,6 +3039,7 @@ int ParseTextLinePlacement(CPLXMLNode *psRoot, classObj *psClass)
set the angles if the parameter is not set*/
if (!psAligned) {
psLabelObj->anglemode = MS_NONE;
+ psLabelObj->offsety = psLabelObj->offsetx;
}
}
diff --git a/mappostgis.c b/mappostgis.c
index 0631b79..bfee929 100644
--- a/mappostgis.c
+++ b/mappostgis.c
@@ -106,6 +106,7 @@ msPostGISLayerInfo *msPostGISCreateLayerInfo(void)
layerinfo->rownum = 0;
layerinfo->version = 0;
layerinfo->paging = MS_TRUE;
+ layerinfo->force2d = MS_TRUE;
return layerinfo;
}
@@ -1651,13 +1652,20 @@ char *msPostGISBuildSQLItems(layerObj *layer)
** which includes a 2D force in it) removes ordinates we don't
** need, saving transfer and encode/decode time.
*/
+ char *force2d = "";
#if TRANSFER_ENCODING == 64
- static char *strGeomTemplate = "encode(ST_AsBinary(ST_Force_2D(\"%s\"),'%s'),'base64') as geom,\"%s\"";
+ static char *strGeomTemplate = "encode(ST_AsBinary(%s(\"%s\"),'%s'),'base64') as geom,\"%s\"";
#else
- static char *strGeomTemplate = "encode(ST_AsBinary(ST_Force_2D(\"%s\"),'%s'),'hex') as geom,\"%s\"";
+ static char *strGeomTemplate = "encode(ST_AsBinary(%s(\"%s\"),'%s'),'hex') as geom,\"%s\"";
#endif
- strGeom = (char*)msSmallMalloc(strlen(strGeomTemplate) + strlen(strEndian) + strlen(layerinfo->geomcolumn) + strlen(layerinfo->uid));
- sprintf(strGeom, strGeomTemplate, layerinfo->geomcolumn, strEndian, layerinfo->uid);
+ if( layerinfo->force2d ) {
+ if( layerinfo->version >= 20100 )
+ force2d = "ST_Force2D";
+ else
+ force2d = "ST_Force_2D";
+ }
+ strGeom = (char*)msSmallMalloc(strlen(strGeomTemplate) + strlen(force2d) + strlen(strEndian) + strlen(layerinfo->geomcolumn) + strlen(layerinfo->uid));
+ sprintf(strGeom, strGeomTemplate, force2d, layerinfo->geomcolumn, strEndian, layerinfo->uid);
}
if( layer->debug > 1 ) {
@@ -2220,6 +2228,7 @@ int msPostGISLayerOpen(layerObj *layer)
#ifdef USE_POSTGIS
msPostGISLayerInfo *layerinfo;
int order_test = 1;
+ const char* force2d_processing;
assert(layer != NULL);
@@ -2328,6 +2337,13 @@ int msPostGISLayerOpen(layerObj *layer)
if (layer->debug)
msDebug("msPostGISLayerOpen: Got PostGIS version %d.\n", layerinfo->version);
+ force2d_processing = msLayerGetProcessingKey( layer, "FORCE2D" );
+ if(force2d_processing && !strcasecmp(force2d_processing,"no")) {
+ layerinfo->force2d = MS_FALSE;
+ }
+ if (layer->debug)
+ msDebug("msPostGISLayerOpen: Forcing 2D geometries: %s.\n", (layerinfo->force2d)?"yes":"no");
+
/* Save the layerinfo in the layerObj. */
layer->layerinfo = (void*)layerinfo;
@@ -3212,6 +3228,11 @@ int msPostGISLayerSetTimeFilter(layerObj *lp, const char *timestring, const char
if (!lp || !timestring || !timefield)
return MS_FALSE;
+ if( strchr(timestring,'\'') || strchr(timestring, '\\') ) {
+ msSetError(MS_MISCERR, "Invalid time filter.", "msPostGISLayerSetTimeFilter()");
+ return MS_FALSE;
+ }
+
/* discrete time */
if (strstr(timestring, ",") == NULL &&
strstr(timestring, "/") == NULL) { /* discrete time */
diff --git a/mappostgis.h b/mappostgis.h
index 4d3ced6..6ecd56a 100644
--- a/mappostgis.h
+++ b/mappostgis.h
@@ -64,6 +64,7 @@ typedef struct {
int endian; /* Endianness of the mapserver host */
int version; /* PostGIS version of the database */
int paging; /* Driver handling of pagination, enabled by default */
+ int force2d; /* Pass geometry through ST_Force2D */
}
msPostGISLayerInfo;
diff --git a/mapprimitive.c b/mapprimitive.c
index b90962d..9a02589 100644
--- a/mapprimitive.c
+++ b/mapprimitive.c
@@ -1754,14 +1754,14 @@ labelPathObj** msPolylineLabelPath(mapObj *map, imageObj *img,shapeObj *p, int m
labelpaths = (labelPathObj **) msSmallMalloc(sizeof(labelPathObj *) * labelpaths_size);
(*regular_lines) = (int *) msSmallMalloc(sizeof(int) * regular_lines_size);
- if(label->offsetx != 0 && (label->offsety == -99 || label->offsety == 99)) {
+ if(label->offsetx != 0 && IS_PERPENDICULAR_OFFSET(label->offsety)) {
double offset;
if(label->offsetx > 0) {
offset = label->offsetx + label->size/2;
} else {
offset = label->offsetx - label->size/2;
}
- if(label->offsety == 99 && p->numlines>0 && p->line[0].numpoints > 0) {
+ if(label->offsety == MS_LABEL_PERPENDICULAR_TOP_OFFSET && p->numlines>0 && p->line[0].numpoints > 0) {
/* is the line mostly left-to-right or right-to-left ?
* FIXME this should be done line by line, by stepping through shape->lines, however
* the OffsetPolyline function works on shapeObjs, not lineObjs
@@ -1799,7 +1799,7 @@ labelPathObj** msPolylineLabelPath(mapObj *map, imageObj *img,shapeObj *p, int m
/* set the number of paths in the array */
*numpaths = labelpaths_index;
*num_regular_lines = regular_lines_index;
- if(label->offsety == -99 && label->offsetx != 0) {
+ if(IS_PERPENDICULAR_OFFSET(label->offsety) && label->offsetx != 0) {
msFreeShape(p);
msFree(p);
}
diff --git a/maprasterquery.c b/maprasterquery.c
index 4075c08..17f039a 100644
--- a/maprasterquery.c
+++ b/maprasterquery.c
@@ -666,7 +666,7 @@ int msRasterQueryByRect(mapObj *map, layerObj *layer, rectObj queryRect)
int tileitemindex=-1, tilelayerindex=-1, tilesrsindex=-1;
shapeObj tshp;
char tilename[MS_PATH_LENGTH], tilesrsname[1024];
- int done;
+ int done, destroy_on_failure;
char szPath[MS_MAXPATHLEN];
rectObj searchrect;
@@ -675,7 +675,12 @@ int msRasterQueryByRect(mapObj *map, layerObj *layer, rectObj queryRect)
/* -------------------------------------------------------------------- */
/* Get the layer info. */
/* -------------------------------------------------------------------- */
- msRasterLayerInfoInitialize( layer );
+ if(!layer->layerinfo) {
+ msRasterLayerInfoInitialize( layer );
+ destroy_on_failure = 1;
+ } else {
+ destroy_on_failure = 0;
+ }
rlinfo = (rasterLayerInfo *) layer->layerinfo;
/* -------------------------------------------------------------------- */
@@ -849,12 +854,14 @@ cleanup:
/* On failure, or empty result set, cleanup the rlinfo since we */
/* likely won't ever have it accessed or cleaned up later. */
/* -------------------------------------------------------------------- */
- if( status == MS_FAILURE || rlinfo->query_results == 0 )
- msRasterLayerInfoFree( layer );
-
- /* populate the items/numitems layer-level values */
- if( layer->layerinfo != NULL )
+ if( status == MS_FAILURE || rlinfo->query_results == 0 ) {
+ if(destroy_on_failure) {
+ msRasterLayerInfoFree( layer );
+ }
+ } else {
+ /* populate the items/numitems layer-level values */
msRASTERLayerGetItems(layer);
+ }
return status;
#endif /* def USE_GDAL */
diff --git a/mapresample.c b/mapresample.c
index 1a47feb..419d07b 100644
--- a/mapresample.c
+++ b/mapresample.c
@@ -1253,12 +1253,20 @@ int msResampleGDALToMap( mapObj *map, layerObj *layer, imageObj *image,
resampleMode = "NEAREST";
if(layer->mask) {
- int ret;
- layerObj *maskLayer = GET_LAYER(map, msGetLayerIndex(map,layer->mask));
+ int ret, maskLayerIdx;
+ layerObj *maskLayer;
+ maskLayerIdx = msGetLayerIndex(map,layer->mask);
+ if(maskLayerIdx == -1) {
+ msSetError(MS_MISCERR, "Invalid mask layer specified", "msResampleGDALToMap()");
+ return -1;
+ }
+ maskLayer = GET_LAYER(map, maskLayerIdx);
mask_rb = msSmallCalloc(1,sizeof(rasterBufferObj));
ret = MS_IMAGE_RENDERER(maskLayer->maskimage)->getRasterBufferHandle(maskLayer->maskimage,mask_rb);
- if(ret != MS_SUCCESS)
+ if(ret != MS_SUCCESS) {
+ free(mask_rb);
return -1;
+ }
}
/* -------------------------------------------------------------------- */
diff --git a/mapscript/csharp/CMakeLists.txt b/mapscript/csharp/CMakeLists.txt
index 079a0c1..a1f03bb 100644
--- a/mapscript/csharp/CMakeLists.txt
+++ b/mapscript/csharp/CMakeLists.txt
@@ -16,6 +16,7 @@ if (WIN32)
else(CMAKE_CL_64)
set(PLATFORM_TARGET /platform:x86)
endif(CMAKE_CL_64)
+ set (KEYFILE_SPEC /keyfile:${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\mapscript.snk)
endif (NOT MSVC71)
if (MSVC10)
set(PLATFORM_TARGET ${PLATFORM_TARGET} /define:CLR4)
@@ -35,19 +36,21 @@ set_target_properties(csharpmapscript PROPERTIES OUTPUT_NAME "mapscript")
SWIG_LINK_LIBRARIES(csharpmapscript ${MAPSERVER_LIBMAPSERVER})
+
ADD_CUSTOM_COMMAND(TARGET csharpmapscript
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
POST_BUILD
- COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /t:library /out:mapscript_csharp.dll *.cs config\\AssemblyInfo.cs
- COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:shpdump.exe examples\\shpdump.cs
- COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:drawmap.exe examples\\drawmap.cs
- COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:shapeinfo.exe examples\\shapeinfo.cs
- COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:drawquery.exe examples\\drawquery.cs
- COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /r:System.Drawing.dll /out:getbytes.exe examples\\getbytes.cs
- COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:HTMLtemplate.exe examples\\HTMLtemplate.cs
- COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:RFC24.exe examples\\RFC24.cs
- COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /r:System.Drawing.dll /out:drawmapDirect.exe examples\\drawmapDirect.cs
- COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /r:System.Drawing.dll /out:drawmapDirectPrint.exe examples\\drawmapDirectPrint.cs
+ COMMAND copy /Y ..\\..\\..\\mapscript\\csharp\\mapscript.snk
+ COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /t:library /out:mapscript_csharp.dll ${KEYFILE_SPEC} *.cs ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\config\\AssemblyInfo.cs
+ COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:shpdump.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\shpdump.cs
+ COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:drawmap.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\drawmap.cs
+ COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:shapeinfo.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\shapeinfo.cs
+ COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:drawquery.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\drawquery.cs
+ COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /r:System.Drawing.dll /out:getbytes.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\getbytes.cs
+ COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:HTMLtemplate.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\HTMLtemplate.cs
+ COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:RFC24.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\RFC24.cs
+ COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /r:System.Drawing.dll /out:drawmapDirect.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\drawmapDirect.cs
+ COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /r:System.Drawing.dll /out:drawmapDirectPrint.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\drawmapDirectPrint.cs
COMMENT "Compiling c# source files"
)
diff --git a/mapscript/java/CMakeLists.txt b/mapscript/java/CMakeLists.txt
index dea06c3..9987d42 100644
--- a/mapscript/java/CMakeLists.txt
+++ b/mapscript/java/CMakeLists.txt
@@ -26,5 +26,5 @@ ADD_CUSTOM_COMMAND(TARGET javamapscript
)
get_target_property(LOC_MAPSCRIPT_LIB ${SWIG_MODULE_javamapscript_REAL_NAME} LOCATION)
-install(FILES ${LOC_MAPSCRIPT_LIB} DESTINATION lib)
+install(FILES ${LOC_MAPSCRIPT_LIB} DESTINATION ${CMAKE_INSTALL_LIBDIR})
diff --git a/mapscript/ruby/CMakeLists.txt b/mapscript/ruby/CMakeLists.txt
index 95f5982..9fbfe6b 100644
--- a/mapscript/ruby/CMakeLists.txt
+++ b/mapscript/ruby/CMakeLists.txt
@@ -11,7 +11,10 @@ SWIG_LINK_LIBRARIES(rubymapscript ${RUBY_LIBRARY} ${MAPSERVER_LIBMAPSERVER})
set_target_properties(${SWIG_MODULE_rubymapscript_REAL_NAME} PROPERTIES PREFIX "")
set_target_properties(${SWIG_MODULE_rubymapscript_REAL_NAME} PROPERTIES OUTPUT_NAME mapscript)
+if(APPLE)
+ set_target_properties(${SWIG_MODULE_rubymapscript_REAL_NAME} PROPERTIES SUFFIX ".bundle")
+endif(APPLE)
get_target_property(LOC_MAPSCRIPT_LIB ${SWIG_MODULE_rubymapscript_REAL_NAME} LOCATION)
-execute_process(COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "puts RbConfig::CONFIG['archdir']" OUTPUT_VARIABLE RUBY_ARCHDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
-install(FILES ${LOC_MAPSCRIPT_LIB} DESTINATION ${RUBY_ARCHDIR})
+execute_process(COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "puts RbConfig::CONFIG['sitearchdir']" OUTPUT_VARIABLE RUBY_SITEARCHDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
+install(FILES ${LOC_MAPSCRIPT_LIB} DESTINATION ${RUBY_SITEARCHDIR})
diff --git a/mapserver.h b/mapserver.h
index e6a9d8e..9267b40 100644
--- a/mapserver.h
+++ b/mapserver.h
@@ -946,7 +946,7 @@ extern "C" {
#define MS_STYLE_SINGLE_SIDED_OFFSET -99
#define MS_STYLE_DOUBLE_SIDED_OFFSET -999
-#define IS_PARALLEL_OFFSET(offsety) (offsety == MS_STYLE_SINGLE_SIDED_OFFSET || offsety == MS_STYLE_DOUBLE_SIDED_OFFSET)
+#define IS_PARALLEL_OFFSET(offsety) ((offsety) == MS_STYLE_SINGLE_SIDED_OFFSET || (offsety) == MS_STYLE_DOUBLE_SIDED_OFFSET)
@@ -1061,6 +1061,11 @@ extern "C" {
labelLeaderObj leader;
};
+#define MS_LABEL_PERPENDICULAR_OFFSET -99
+#define MS_LABEL_PERPENDICULAR_TOP_OFFSET 99
+#define IS_PERPENDICULAR_OFFSET(offsety) ((offsety) == MS_LABEL_PERPENDICULAR_OFFSET || (offsety) == MS_LABEL_PERPENDICULAR_TOP_OFFSET)
+
+
/************************************************************************/
/* classObj */
/* */
diff --git a/maputil.c b/maputil.c
index 8cce4e7..ef0d309 100644
--- a/maputil.c
+++ b/maputil.c
@@ -695,7 +695,7 @@ int msShapeGetAnnotation(layerObj *layer, shapeObj *shape)
continue; /* next label */
}
}
- if(msEvalExpression(layer, shape, &(lbl->expression), -1) != MS_TRUE) {
+ if(msEvalExpression(layer, shape, &(lbl->expression), layer->labelitemindex) != MS_TRUE) {
lbl->status = MS_OFF;
continue; /* next label */
}
@@ -1602,7 +1602,7 @@ imageObj *msImageCreate(int width, int height, outputFormatObj *format,
for( ; i > 0; )
image->img.raw_16bit[--i] = nv;
} else if( format->imagemode == MS_IMAGEMODE_FLOAT32 ) {
- float nv = atoi(nullvalue);
+ float nv = atof(nullvalue);
for( ; i > 0; )
image->img.raw_float[--i] = nv;
} else if( format->imagemode == MS_IMAGEMODE_BYTE ) {
diff --git a/mapuvraster.c b/mapuvraster.c
index 471fefc..dc7e8c2 100644
--- a/mapuvraster.c
+++ b/mapuvraster.c
@@ -338,7 +338,7 @@ int msUVRASTERLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery)
double map_cellsize;
unsigned int spacing;
int width, height, u_src_off, v_src_off, i, x, y;
- char **alteredProcessing = NULL;
+ char **alteredProcessing = NULL, *saved_layer_mask;
char **savedProcessing = NULL;
/*
@@ -446,11 +446,21 @@ int msUVRASTERLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery)
layer->processing = alteredProcessing;
}
+ /* disable masking at this level: we don't want to apply the mask at the raster level,
+ * it will be applied with the correct cellsize and image size in the vector rendering
+ * phase.
+ */
+ saved_layer_mask = layer->mask;
+ layer->mask = NULL;
if (msDrawRasterLayerLow(map_tmp, layer, image_tmp, NULL ) == MS_FAILURE) {
msSetError(MS_MISCERR, "Unable to draw raster data.", "msUVRASTERLayerWhichShapes()");
+ layer->mask = saved_layer_mask;
return MS_FAILURE;
}
+ /* restore layer mask */
+ layer->mask = saved_layer_mask;
+
/* restore the saved processing */
if (alteredProcessing != NULL) {
layer->processing = savedProcessing;
diff --git a/mapwfs.c b/mapwfs.c
index 8fc30bc..a1c726a 100644
--- a/mapwfs.c
+++ b/mapwfs.c
@@ -938,7 +938,20 @@ static void msWFSWriteItemElement(FILE *stream, gmlItemObj *item, const char *ta
element_name = item->name;
if(item->type)
- element_type = item->type;
+ {
+ /* Map from MapServer types to XSD types */
+ if( strcasecmp(item->type,"Integer") == 0 )
+ element_type = "integer";
+ else if( EQUAL(item->type,"Real") ||
+ EQUAL(item->type,"double") /* just in case someone provided the xsd type directly */ )
+ element_type = "double";
+ else if( EQUAL(item->type,"Character") )
+ element_type = "string";
+ else if( EQUAL(item->type,"Date") )
+ element_type = "date";
+ else if( EQUAL(item->type,"Boolean") )
+ element_type = "boolean";
+ }
msIO_fprintf(stream, "%s<element name=\"%s\" type=\"%s\"/>\n", tab, element_name, element_type);
--
Packaging for MapServer
More information about the Pkg-grass-devel
mailing list