⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogr2gmlgeometry.cpp

📁 在linux环境下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** * $Id: ogr2gmlgeometry.cpp,v 1.6 2003/04/17 08:22:06 dron Exp $ * * Project:  GML Translator * Purpose:  Code to translate OGRGeometry to GML string representation. * Author:   Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2002, Frank Warmerdam <warmerdam@pobox.com> * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: *  * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. *  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER  * DEALINGS IN THE SOFTWARE. ***************************************************************************** * * Independent Security Audit 2003/04/17 Andrey Kiselev: *   Completed audit of this module. All functions may be used without buffer *   overflows and stack corruptions if caller could be trusted. * * Security Audit 2003/03/28 warmerda: *   Completed security audit.  I believe that this module may be safely used  *   to generate GML from arbitrary but well formed OGRGeomety objects that *   come from a potentially hostile source, but through a trusted OGR importer *   without compromising the system. * * $Log: ogr2gmlgeometry.cpp,v $ * Revision 1.6  2003/04/17 08:22:06  dron * Completed secutity audit, fix in MakeGMLCoordinate(). * * Revision 1.5  2003/03/28 06:00:14  warmerda * Completed security audit.  Fixed issue with very large coordinate values * potentially causing a buffer overrun. * * Revision 1.4  2003/03/18 17:13:03  warmerda * Improve precision (and use %g) for latlong coordinates. * * Revision 1.3  2003/03/12 20:52:07  warmerda * implemented support for gml:Box * * Revision 1.2  2003/03/07 21:30:15  warmerda * expand tabs * * Revision 1.1  2003/03/06 20:28:38  warmerda * Migrated to here (gdal/ogr) from gdal/ogr/ogrsf_frmts/gml. * Changed to implement the C API entry points (OGR_G_*). * Added API to take/return CPLXMLNode's directly. * * Revision 1.5  2002/03/11 22:34:08  warmerda * Avoid multiple defining iMember. * * Revision 1.4  2002/03/11 17:29:04  warmerda * added multipolygon support * * Revision 1.3  2002/03/07 22:38:04  warmerda * use ogr_gml_geom.h * * Revision 1.2  2002/01/25 21:00:31  warmerda * fix some small bugs found by MS VC++ * * Revision 1.1  2002/01/25 20:37:02  warmerda * New */#include "cpl_minixml.h"#include "ogr_geometry.h"#include "ogr_api.h"#include "cpl_error.h"#include "cpl_conv.h"/************************************************************************//*                        MakeGMLCoordinate()                           *//************************************************************************/static void MakeGMLCoordinate( char *pszTarget,                                double x, double y, double z, int b3D ){    if( !b3D )    {        if( x == (int) x && y == (int) y )            sprintf( pszTarget, "%d,%d", (int) x, (int) y );        else if( fabs(x) < 370 && fabs(y) < 370 )            sprintf( pszTarget, "%.16g,%.16g", x, y );        else if( fabs(x) > 100000000.0 || fabs(y) > 100000000.0 )            sprintf( pszTarget, "%.16g,%.16g", x, y );        else            sprintf( pszTarget, "%.3f,%.3f", x, y );    }    else    {        if( x == (int) x && y == (int) y && z == (int) z )            sprintf( pszTarget, "%d,%d,%d", (int) x, (int) y, (int) z );        else if( fabs(x) < 370 && fabs(y) < 370 )            sprintf( pszTarget, "%.16g,%.16g,%.16g", x, y, z );        else if( fabs(x) > 100000000.0 || fabs(y) > 100000000.0                  || fabs(z) > 100000000.0 )            sprintf( pszTarget, "%.16g,%.16g,%.16g", x, y, z );        else            sprintf( pszTarget, "%.3f,%.3f,%.3f", x, y, z );    }}/************************************************************************//*                            _GrowBuffer()                             *//************************************************************************/static void _GrowBuffer( int nNeeded, char **ppszText, int *pnMaxLength ){    if( nNeeded+1 >= *pnMaxLength )    {        *pnMaxLength = MAX(*pnMaxLength * 2,nNeeded+1);        *ppszText = (char *) CPLRealloc(*ppszText, *pnMaxLength);    }}/************************************************************************//*                            AppendString()                            *//************************************************************************/static void AppendString( char **ppszText, int *pnLength, int *pnMaxLength,                          const char *pszTextToAppend ){    _GrowBuffer( *pnLength + strlen(pszTextToAppend) + 1,                  ppszText, pnMaxLength );    strcat( *ppszText + *pnLength, pszTextToAppend );    *pnLength += strlen( *ppszText + *pnLength );}/************************************************************************//*                        AppendCoordinateList()                        *//************************************************************************/static void AppendCoordinateList( OGRLineString *poLine,                                   char **ppszText, int *pnLength,                                   int *pnMaxLength ){    char        szCoordinate[256];    int         b3D = (poLine->getGeometryType() & 0x8000);    *pnLength += strlen(*ppszText + *pnLength);    _GrowBuffer( *pnLength + 20, ppszText, pnMaxLength );    strcat( *ppszText + *pnLength, "<gml:coordinates>" );    *pnLength += strlen(*ppszText + *pnLength);        for( int iPoint = 0; iPoint < poLine->getNumPoints(); iPoint++ )    {        MakeGMLCoordinate( szCoordinate,                            poLine->getX(iPoint),                           poLine->getY(iPoint),                           poLine->getZ(iPoint),                           b3D );        _GrowBuffer( *pnLength + strlen(szCoordinate)+1,                      ppszText, pnMaxLength );        if( iPoint != 0 )            strcat( *ppszText + *pnLength, " " );                    strcat( *ppszText + *pnLength, szCoordinate );        *pnLength += strlen(*ppszText + *pnLength);    }        _GrowBuffer( *pnLength + 20, ppszText, pnMaxLength );    strcat( *ppszText + *pnLength, "</gml:coordinates>" );    *pnLength += strlen(*ppszText + *pnLength);}/************************************************************************//*                       OGR2GMLGeometryAppend()                        *//************************************************************************/static int OGR2GMLGeometryAppend( OGRGeometry *poGeometry,                                   char **ppszText, int *pnLength,                                   int *pnMaxLength ){/* -------------------------------------------------------------------- *//*      2D Point                                                        *//* -------------------------------------------------------------------- */    if( poGeometry->getGeometryType() == wkbPoint )    {        char    szCoordinate[256];        OGRPoint *poPoint = (OGRPoint *) poGeometry;        MakeGMLCoordinate( szCoordinate,                            poPoint->getX(), poPoint->getY(), 0.0, FALSE );                                   _GrowBuffer( *pnLength + strlen(szCoordinate) + 60,                      ppszText, pnMaxLength );        sprintf( *ppszText + *pnLength,                 "<gml:Point><gml:coordinates>%s</gml:coordinates></gml:Point>",                 szCoordinate );        *pnLength += strlen( *ppszText + *pnLength );    }/* -------------------------------------------------------------------- *//*      3D Point                                                        *//* -------------------------------------------------------------------- */    else if( poGeometry->getGeometryType() == wkbPoint25D )    {        char    szCoordinate[256];        OGRPoint *poPoint = (OGRPoint *) poGeometry;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -