[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