mirror of
https://git.osgeo.org/gitea/postgis/postgis
synced 2024-10-24 00:52:40 +00:00
b8b3a16c0d
Closes #2178 git-svn-id: http://svn.osgeo.org/postgis/trunk@11004 b70326c6-7e19-0410-871a-916f4a2858ee
174 lines
3.8 KiB
C
174 lines
3.8 KiB
C
/**********************************************************************
|
|
*
|
|
* PostGIS - Spatial Types for PostgreSQL
|
|
* http://postgis.refractions.net
|
|
*
|
|
* Copyright (C) 2004 Refractions Research Inc.
|
|
*
|
|
* This is free software; you can redistribute and/or modify it under
|
|
* the terms of the GNU General Public Licence. See the COPYING file.
|
|
*
|
|
**********************************************************************/
|
|
|
|
#include "lwgeom_log.h"
|
|
#include "liblwgeom.h"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
/* Place to hold the ZM string used in other summaries */
|
|
static char tflags[6];
|
|
|
|
static char *
|
|
lwgeom_flagchars(LWGEOM *lwg)
|
|
{
|
|
int flagno = 0;
|
|
if ( FLAGS_GET_Z(lwg->flags) ) tflags[flagno++] = 'Z';
|
|
if ( FLAGS_GET_M(lwg->flags) ) tflags[flagno++] = 'M';
|
|
if ( FLAGS_GET_BBOX(lwg->flags) ) tflags[flagno++] = 'B';
|
|
if ( FLAGS_GET_GEODETIC(lwg->flags) ) tflags[flagno++] = 'G';
|
|
if ( lwg->srid != SRID_UNKNOWN ) tflags[flagno++] = 'S';
|
|
tflags[flagno] = '\0';
|
|
|
|
LWDEBUGF(4, "Flags: %s - returning %p", flags, tflags);
|
|
|
|
return tflags;
|
|
}
|
|
|
|
/*
|
|
* Returns an alloced string containing summary for the LWGEOM object
|
|
*/
|
|
static char *
|
|
lwpoint_summary(LWPOINT *point, int offset)
|
|
{
|
|
char *result;
|
|
char *pad="";
|
|
char *zmflags = lwgeom_flagchars((LWGEOM*)point);
|
|
|
|
result = (char *)lwalloc(128+offset);
|
|
|
|
sprintf(result, "%*.s%s[%s]",
|
|
offset, pad, lwtype_name(point->type),
|
|
zmflags);
|
|
return result;
|
|
}
|
|
|
|
static char *
|
|
lwline_summary(LWLINE *line, int offset)
|
|
{
|
|
char *result;
|
|
char *pad="";
|
|
char *zmflags = lwgeom_flagchars((LWGEOM*)line);
|
|
|
|
result = (char *)lwalloc(128+offset);
|
|
|
|
sprintf(result, "%*.s%s[%s] with %d points",
|
|
offset, pad, lwtype_name(line->type),
|
|
zmflags,
|
|
line->points->npoints);
|
|
return result;
|
|
}
|
|
|
|
|
|
static char *
|
|
lwcollection_summary(LWCOLLECTION *col, int offset)
|
|
{
|
|
size_t size = 128;
|
|
char *result;
|
|
char *tmp;
|
|
int i;
|
|
static char *nl = "\n";
|
|
char *pad="";
|
|
char *zmflags = lwgeom_flagchars((LWGEOM*)col);
|
|
|
|
LWDEBUG(2, "lwcollection_summary called");
|
|
|
|
result = (char *)lwalloc(size);
|
|
|
|
sprintf(result, "%*.s%s[%s] with %d elements\n",
|
|
offset, pad, lwtype_name(col->type),
|
|
zmflags,
|
|
col->ngeoms);
|
|
|
|
for (i=0; i<col->ngeoms; i++)
|
|
{
|
|
tmp = lwgeom_summary(col->geoms[i], offset+2);
|
|
size += strlen(tmp)+1;
|
|
result = lwrealloc(result, size);
|
|
|
|
LWDEBUGF(4, "Reallocated %d bytes for result", size);
|
|
if ( i > 0 ) strcat(result,nl);
|
|
|
|
strcat(result, tmp);
|
|
lwfree(tmp);
|
|
}
|
|
|
|
LWDEBUG(3, "lwcollection_summary returning");
|
|
|
|
return result;
|
|
}
|
|
|
|
static char *
|
|
lwpoly_summary(LWPOLY *poly, int offset)
|
|
{
|
|
char tmp[256];
|
|
size_t size = 64*(poly->nrings+1)+128;
|
|
char *result;
|
|
int i;
|
|
char *pad="";
|
|
static char *nl = "\n";
|
|
char *zmflags = lwgeom_flagchars((LWGEOM*)poly);
|
|
|
|
LWDEBUG(2, "lwpoly_summary called");
|
|
|
|
result = (char *)lwalloc(size);
|
|
|
|
sprintf(result, "%*.s%s[%s] with %i rings\n",
|
|
offset, pad, lwtype_name(poly->type),
|
|
zmflags,
|
|
poly->nrings);
|
|
|
|
for (i=0; i<poly->nrings; i++)
|
|
{
|
|
sprintf(tmp,"%s ring %i has %i points",
|
|
pad, i, poly->rings[i]->npoints);
|
|
if ( i > 0 ) strcat(result,nl);
|
|
strcat(result,tmp);
|
|
}
|
|
|
|
LWDEBUG(3, "lwpoly_summary returning");
|
|
|
|
return result;
|
|
}
|
|
|
|
char *
|
|
lwgeom_summary(const LWGEOM *lwgeom, int offset)
|
|
{
|
|
char *result;
|
|
|
|
switch (lwgeom->type)
|
|
{
|
|
case POINTTYPE:
|
|
return lwpoint_summary((LWPOINT *)lwgeom, offset);
|
|
|
|
case LINETYPE:
|
|
return lwline_summary((LWLINE *)lwgeom, offset);
|
|
|
|
case POLYGONTYPE:
|
|
return lwpoly_summary((LWPOLY *)lwgeom, offset);
|
|
|
|
case MULTIPOINTTYPE:
|
|
case MULTILINETYPE:
|
|
case MULTIPOLYGONTYPE:
|
|
case COLLECTIONTYPE:
|
|
return lwcollection_summary((LWCOLLECTION *)lwgeom, offset);
|
|
default:
|
|
result = (char *)lwalloc(256);
|
|
sprintf(result, "Object is of unknown type: %d",
|
|
lwgeom->type);
|
|
return result;
|
|
}
|
|
|
|
return NULL;
|
|
}
|