[mapserver-commits] r9256 - sandbox/davidK

svn at osgeo.org svn at osgeo.org
Sun Aug 16 11:55:10 EDT 2009


Author: davidK
Date: 2009-08-16 11:55:09 -0400 (Sun, 16 Aug 2009)
New Revision: 9256

Modified:
   sandbox/davidK/mapdraw.c
   sandbox/davidK/mapkmlrenderer.cpp
   sandbox/davidK/mapkmlrenderer.h
Log:
implemented writing shape attributes into KML

Modified: sandbox/davidK/mapdraw.c
===================================================================
--- sandbox/davidK/mapdraw.c	2009-08-14 17:16:26 UTC (rev 9255)
+++ sandbox/davidK/mapdraw.c	2009-08-16 15:55:09 UTC (rev 9256)
@@ -931,6 +931,19 @@
 /* ==================================================================== */
   if(image && MS_RENDERER_SWF(image->format))
     status = msLayerWhichItems(layer, MS_FALSE, msLookupHashTable(&(layer->metadata), "SWFDUMPATTRIBUTES"));                                
+  else if((MS_RENDERER_PLUGIN(image->format) && image->format->renderer == MS_RENDER_WITH_KML))
+  {
+	char *attribVal = msLookupHashTable(&layer->metadata, "kml_dumpattributes");
+	if (attribVal)
+	{
+		if (strcasecmp(attribVal, "0") == 0 || strcasecmp(attribVal, "NO") == 0 || strcasecmp(attribVal, "FALSE") == 0)
+			status = msLayerWhichItems(layer, MS_FALSE, NULL);
+		else
+			status = msLayerWhichItems(layer, MS_FALSE, attribVal);
+	}
+	else
+		status = msLayerWhichItems(layer, MS_TRUE, NULL); // Dump all attributes
+  }
   else        
     status = msLayerWhichItems(layer, MS_FALSE, NULL);
 

Modified: sandbox/davidK/mapkmlrenderer.cpp
===================================================================
--- sandbox/davidK/mapkmlrenderer.cpp	2009-08-14 17:16:26 UTC (rev 9255)
+++ sandbox/davidK/mapkmlrenderer.cpp	2009-08-16 15:55:09 UTC (rev 9256)
@@ -39,9 +39,11 @@
 
 KmlRenderer::KmlRenderer(int width, int height, colorObj* color/*=NULL*/) 
 	:	XmlDoc(NULL), LayerNode(NULL), GroundOverlayNode(NULL), Width(width), Height(height),
-		FirstLayer(true), RasterizerOutputFormat(NULL), InternalImg(NULL),
-		VectorMode(true), RasterMode(false), MapCellsize(1.0),
-		PlacemarkNode(NULL), GeomNode(NULL), MaxFeatureCount(100)
+		FirstLayer(MS_TRUE), RasterizerOutputFormat(NULL), InternalImg(NULL),
+		VectorMode(MS_TRUE), RasterMode(MS_FALSE), MapCellsize(1.0),
+		PlacemarkNode(NULL), GeomNode(NULL), MaxFeatureCount(100),
+		Items(NULL), NumItems(0)
+
 {
 	//	Create document.
     XmlDoc = xmlNewDoc(BAD_CAST "1.0");
@@ -89,16 +91,22 @@
 
 int KmlRenderer::saveImage(imageObj *img, FILE *fp, outputFormatObj *format)
 {
-	// 
 	if (InternalImg)
 	{
-		char fileName[512];
+		char fileName[MS_MAXPATHLEN];
+		char fileUrl[MS_MAXPATHLEN];
 
 		rendererVTableObj *r = RasterizerOutputFormat->vtable;
 
-		//FILE *stream = fopen(msBuildPath(szPath, map->mappath, filename), "wb");
+		if (img->imagepath)
+		{
+			char *tmpFileName = msTmpFile(MapPath, img->imagepath, MS_IMAGE_EXTENSION(RasterizerOutputFormat));
+			sprintf(fileName, "%s", tmpFileName);
+			msFree(tmpFileName);
+		}
+		else
+			sprintf(fileName, "kml_ground_overlay_%ld%d.%s", (long)time(NULL), (int)getpid(), MS_IMAGE_EXTENSION(RasterizerOutputFormat)); // __TODO__ add WEB IMAGEURL path;
 
-		sprintf(fileName, "kml_ground_overlay_%ld%d.%s", (long)time(NULL), (int)getpid(), MS_IMAGE_EXTENSION(RasterizerOutputFormat)); // __TODO__ add WEB IMAGEURL path;
 		FILE *stream = fopen(fileName, "wb");
 
 		if(r->supports_pixel_buffer)
@@ -113,7 +121,14 @@
 		}
 		fclose(stream);
 
-		createGroundOverlayNode(fileName);
+		if (img->imageurl)
+			sprintf(fileUrl, "%s%s.%s", img->imageurl, msGetBasename(fileName), MS_IMAGE_EXTENSION(RasterizerOutputFormat));
+		else
+			sprintf(fileUrl, "%s", fileName);
+
+		createGroundOverlayNode(fileUrl);
+
+		r->freeImage(InternalImg);
 	}
 	else
 	{
@@ -133,14 +148,9 @@
 	if( msIO_needBinaryStdout() == MS_FAILURE )
 		return MS_FAILURE;
 
-	xmlDocDumpFormatMemoryEnc(XmlDoc, &buf, &bufSize, "ISO-8859-1", 1);
+	xmlDocDumpFormatMemoryEnc(XmlDoc, &buf, &bufSize, "UTF-8", 1);
 
 	context = msIO_getHandler(fp);
-        /*
-          header is sent in mapserv.c. This should not be necessary
-	if (context)
-		msIO_printf("Content-type: %s%c%c",format->mimetype,10,10);
-        */
 
 	int chunkSize = 4096;
 	for (int i=0; i<bufSize; i+=chunkSize)
@@ -155,17 +165,11 @@
 			msIO_fwrite(buf+i, 1, size, fp);
 	}
 
-	//msIO_fprintf(fp, "%s", buffer);
-
 	xmlFree(buf);
 
 	return(MS_SUCCESS);
 }
 
-void KmlRenderer::freeImage(imageObj *image)
-{
-}
-
 void KmlRenderer::startNewLayer(imageObj *img, layerObj *layer)
 {
 	LayerNode = xmlNewNode(NULL, BAD_CAST "Folder");
@@ -177,15 +181,51 @@
 
 	xmlNewChild(LayerNode, NULL, BAD_CAST "styleUrl", BAD_CAST LAYER_FOLDER_STYLE_URL);
 
-	VectorMode = true;
-	RasterMode = true;
+	VectorMode = MS_TRUE;
+	RasterMode = MS_TRUE;
 
-	setupRenderingParams(&layer->metadata);
+	if (!msLayerIsOpen(layer))
+	{
+		if (msLayerOpen(layer) != MS_SUCCESS)
+		{
+			msSetError(MS_MISCERR, "msLayerOpen failed", "KmlRenderer::startNewLayer" );
+		}
+	}
 
+	DumpAttributes = MS_TRUE;
+	char *attribVal = msLookupHashTable(&layer->metadata, "kml_dumpattributes");
+	if (attribVal)
+	{
+		if (strcasecmp(attribVal, "0") == 0 || strcasecmp(attribVal, "NO") == 0 || strcasecmp(attribVal, "FALSE") == 0)
+		{	
+			DumpAttributes = MS_FALSE;
+			msLayerWhichItems(layer, MS_FALSE, NULL);
+		}
+		else
+		{
+			msLayerWhichItems(layer, MS_FALSE, attribVal);
+		}
+	}
+	else
+	{
+		msLayerWhichItems(layer, MS_TRUE, NULL);
+	}
+
+	NumItems = layer->numitems;
+	if (NumItems)
+	{
+		Items = (char **)calloc(NumItems, sizeof(char *));
+		for (int i=0; i<NumItems; i++)
+			Items[i] = strdup(layer->items[i]);
+	}
+
 	if (FirstLayer)
 	{
-		FirstLayer = false;
+		FirstLayer = MS_FALSE;
 
+		if (layer->map->mappath)
+			sprintf(MapPath, "%s", layer->map->mappath);
+
 		// map rect for ground overlay
 		MapExtent = layer->map->extent;
 		MapCellsize = layer->map->cellsize;
@@ -234,6 +274,8 @@
 	FeatureCount = 0;
 
 	TempImg = RasterMode ? createInternalImage() : NULL;
+
+	setupRenderingParams(&layer->metadata);
 }
 
 void KmlRenderer::closeNewLayer(imageObj *img, layerObj *layer)
@@ -266,6 +308,13 @@
 	{
 		xmlAddChild(DocNode, LayerNode);
 	}
+
+	if(Items)
+	{
+		msFreeCharArray(Items, NumItems);
+		Items = NULL;
+		NumItems = 0;
+	}
 }
 
 
@@ -303,10 +352,10 @@
 	{
 		MaxFeatureCount = atoi(maxFeatureVal);
 		if (MaxFeatureCount >= 999999)
-			RasterMode = false;
+			RasterMode = MS_FALSE;
 
 		if (MaxFeatureCount == 0)
-			VectorMode = false;
+			VectorMode = MS_FALSE;
 	}
 }
 
@@ -338,7 +387,7 @@
 	FeatureCount++;
 	if (FeatureCount > MaxFeatureCount)
 	{
-		VectorMode = false;
+		VectorMode = MS_FALSE;
 		return NULL;
 	}
 
@@ -570,8 +619,10 @@
 	// internal renderer used for rasterizing
 	rendererVTableObj *r = RasterizerOutputFormat->vtable;
 
-	RasterizerOutputFormat->imagemode = MS_IMAGEMODE_RGBA;
+	//RasterizerOutputFormat->imagemode = MS_IMAGEMODE_RGBA;
 	imageObj *tmpImg = r->createImage(symbol->sizex, symbol->sizey, RasterizerOutputFormat, NULL);
+	if (!tmpImg)
+		return MS_FAILURE;
 
 	double scale = style->scale; // save symbol scale
 	style->scale = 1.0; // render symbol in default size
@@ -617,6 +668,8 @@
         status = r->saveImage(tmpImg, fOut, RasterizerOutputFormat);
     }
 
+	r->freeImage(tmpImg);
+
 	fclose(fOut);
 
 	return status;
@@ -630,7 +683,7 @@
 	if (!PlacemarkNode)
 		return;
 
-	sprintf(SymbolUrl, "%s", lookupSymbolUrl(symbol, style));
+	sprintf(SymbolUrl, "%s", lookupSymbolUrl(img, symbol, style));
 	SymbologyFlag[Symbol] = 1;
 
 	xmlNodePtr geomNode = getGeomParentNode("Point");
@@ -754,6 +807,11 @@
 	PlacemarkNode = NULL;
 	GeomNode = NULL;
 
+	if (VectorMode && DumpAttributes && NumItems)
+		DescriptionNode = createDescriptionNode(shape);
+	else
+		DescriptionNode = NULL;
+
 	memset(SymbologyFlag, 0, NumSymbologyFlag);
 }
 
@@ -781,7 +839,7 @@
 	}
 }
 
-char* KmlRenderer::lookupSymbolUrl(symbolObj *symbol, symbolStyleObj *style)
+char* KmlRenderer::lookupSymbolUrl(imageObj *img, symbolObj *symbol, symbolStyleObj *style)
 {
 	/*	
 	<Style id="randomColorIcon">
@@ -801,10 +859,20 @@
 	char *symbolUrl = msLookupHashTable(StyleHashTable, SymbolName);
 	if (!symbolUrl)
 	{
-		// __TODO__ add WEB IMAGEURL path
+		char iconFileName[MS_MAXPATHLEN];
+		char iconUrl[MS_MAXPATHLEN];
 
-		char iconFileName[512];
-		sprintf(iconFileName, "symbol_%s_%.1f.%s", symbol->name, style->scale, MS_IMAGE_EXTENSION(RasterizerOutputFormat));
+		if (img->imagepath)
+		{
+			char *tmpFileName = msTmpFile(MapPath, img->imagepath, MS_IMAGE_EXTENSION(RasterizerOutputFormat));
+			sprintf(iconFileName, "%s", tmpFileName);
+			msFree(tmpFileName);
+		}
+		else
+		{
+			sprintf(iconFileName, "symbol_%s_%.1f.%s", symbol->name, style->scale, MS_IMAGE_EXTENSION(RasterizerOutputFormat));
+		}
+
 		if (createIconImage(iconFileName, symbol, style) != MS_SUCCESS)
 		{
 			char errMsg[512];
@@ -813,7 +881,12 @@
 			return NULL;
 		}
 
-		hashObj *hash = msInsertHashTable(StyleHashTable, SymbolName, iconFileName);
+		if (img->imageurl)
+			sprintf(iconUrl, "%s%s.%s", img->imageurl, msGetBasename(iconFileName), MS_IMAGE_EXTENSION(RasterizerOutputFormat));
+		else
+			sprintf(iconUrl, "%s", iconFileName);
+
+		hashObj *hash = msInsertHashTable(StyleHashTable, SymbolName, iconUrl);
 		symbolUrl = hash->data;
 	}
 
@@ -822,9 +895,9 @@
 
 char* KmlRenderer::lookupPlacemarkStyle()
 {
-	char	lineHexColor[16];
-	char	polygonHexColor[16];
-	char	labelHexColor[16];
+	char	lineHexColor[32];
+	char	polygonHexColor[32];
+	char	labelHexColor[32];
 
 	char styleName[128];
 	sprintf(styleName, "style");
@@ -866,7 +939,7 @@
 
 		sprintf(polygonHexColor,"%02x%02x%02x%02x", PolygonColor.alpha, PolygonColor.blue, PolygonColor.green, PolygonColor.red);
 
-		char polygonStyleName[32];
+		char polygonStyleName[64];
 		sprintf(polygonStyleName, "_polygon_%s", polygonHexColor);
 		strcat(styleName, polygonStyleName);
 	}
@@ -888,7 +961,7 @@
 
 		// __TODO__ add label scale
 
-		char labelStyleName[32];
+		char labelStyleName[64];
 		sprintf(labelStyleName, "_label_%s", labelHexColor);
 		strcat(styleName, labelStyleName);
 	}
@@ -909,7 +982,7 @@
 		*/
 
 		// __TODO__ add label scale
-		char symbolStyleName[32];
+		char symbolStyleName[64];
 		sprintf(symbolStyleName, "_%s", SymbolName);
 		strcat(styleName, symbolStyleName);
 	}
@@ -917,7 +990,7 @@
 	char *styleUrl = msLookupHashTable(StyleHashTable, styleName);
 	if (!styleUrl)
 	{
-		char styleValue[32];
+		char styleValue[64];
 		sprintf(styleValue, "#%s", styleName);
 
 		hashObj *hash = msInsertHashTable(StyleHashTable, styleName, styleValue);
@@ -976,10 +1049,44 @@
 		char *styleUrl = lookupPlacemarkStyle();
 		xmlNewChild(PlacemarkNode, NULL, BAD_CAST "styleUrl", BAD_CAST styleUrl);
 
+		if (DescriptionNode)
+			xmlAddChild(PlacemarkNode, DescriptionNode);
+
 		if (GeomNode)
 			xmlAddChild(PlacemarkNode, GeomNode);
 	}
 }
 
+xmlNodePtr KmlRenderer::createDescriptionNode(shapeObj *shape)
+{
+	/*
+	<description>
+	<![CDATA[
+	  special characters here
+	]]> 
+	<description>
+	*/
 
+	char lineBuf[512];
+	xmlNodePtr descriptionNode = xmlNewNode(NULL, BAD_CAST "description");
+
+	//xmlNodeAddContent(descriptionNode, BAD_CAST "\n\t<![CDATA[\n");
+	xmlNodeAddContent(descriptionNode, BAD_CAST "<table>");
+
+	for (int i=0; i<shape->numvalues; i++)
+	{
+		if (shape->values[i] && strlen(shape->values[i]))
+			sprintf(lineBuf, "<tr><td><b>%s</b></td><td>%s</td></tr>\n", Items[i], shape->values[i]);
+		else
+			sprintf(lineBuf, "<tr><td><b>%s</b></td><td></td></tr>\n", Items[i]);
+
+		xmlNodeAddContent(descriptionNode, BAD_CAST lineBuf);
+	}
+
+	xmlNodeAddContent(descriptionNode, BAD_CAST "</table>");
+	//xmlNodeAddContent(descriptionNode, BAD_CAST "\t]]>\n");
+
+	return descriptionNode;
+}
+
 #endif

Modified: sandbox/davidK/mapkmlrenderer.h
===================================================================
--- sandbox/davidK/mapkmlrenderer.h	2009-08-14 17:16:26 UTC (rev 9255)
+++ sandbox/davidK/mapkmlrenderer.h	2009-08-16 15:55:09 UTC (rev 9256)
@@ -46,6 +46,7 @@
 	rectObj			MapExtent;
 	double			MapCellsize;
 	colorObj		BgColor;
+	char			MapPath[MS_MAXPATHLEN];
 
 	// xml nodes pointers
     xmlDocPtr	XmlDoc;
@@ -55,8 +56,12 @@
 
 	xmlNodePtr	PlacemarkNode;
 	xmlNodePtr	GeomNode;
+	xmlNodePtr	DescriptionNode;
 
 	shapeObj	*CurrentShape;
+	char		**Items;
+	int			NumItems;
+	int			DumpAttributes;
 
 	// placemark symbology
 	hashTableObj	*StyleHashTable;
@@ -90,9 +95,12 @@
 	// END	
 	//
 	// value can be specified also in layer metadata
+	// LAYER
+	// ...
 	// METADATA
 	//	kml_maxfeaturecount	"512"
 	// END	
+	// END
 	int				MaxFeatureCount;
 
 	// if FeatureCount is greater than MaxFeatureCount, layer is rasterized and
@@ -117,8 +125,9 @@
 	imageObj* createInternalImage();
 	xmlNodePtr createPlacemarkNode(xmlNodePtr parentNode, char *styleUrl);
 	xmlNodePtr createGroundOverlayNode(char *imageHref);
+	xmlNodePtr createDescriptionNode(shapeObj *shape);
 
-	char* lookupSymbolUrl(symbolObj *symbol, symbolStyleObj *style);
+	char* lookupSymbolUrl(imageObj *img, symbolObj *symbol, symbolStyleObj *style);
 
 	void addCoordsNode(xmlNodePtr parentNode, pointObj *pts, int numPts);
 
@@ -148,7 +157,6 @@
 
     imageObj* createImage(int width, int height, outputFormatObj *format, colorObj* bg);
     int saveImage(imageObj *img, FILE *fp, outputFormatObj *format);
-    void freeImage(imageObj *image);
     
 	void startNewLayer(imageObj *img, layerObj *layer);
 	void closeNewLayer(imageObj *img, layerObj *layer);



More information about the mapserver-commits mailing list