亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ogrmultipolygon.cpp

?? mitab,讀取MapInfo的地圖文件
?? CPP
字號:
/******************************************************************************
 * $Id: ogrmultipolygon.cpp 10646 2007-01-18 02:38:10Z warmerdam $
 *
 * Project:  OpenGIS Simple Features Reference Implementation
 * Purpose:  The OGRMultiPolygon class.
 * Author:   Frank Warmerdam, warmerdam@pobox.com
 *
 ******************************************************************************
 * Copyright (c) 1999, Frank Warmerdam
 *
 * 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.
 ****************************************************************************/

#include "ogr_geometry.h"
#include "ogr_p.h"

CPL_CVSID("$Id: ogrmultipolygon.cpp 10646 2007-01-18 02:38:10Z warmerdam $");

/************************************************************************/
/*                          OGRMultiPolygon()                           */
/************************************************************************/

OGRMultiPolygon::OGRMultiPolygon()
{
}

/************************************************************************/
/*                          getGeometryType()                           */
/************************************************************************/

OGRwkbGeometryType OGRMultiPolygon::getGeometryType() const

{
    if( getCoordinateDimension() == 3 )
        return wkbMultiPolygon25D;
    else
        return wkbMultiPolygon;
}

/************************************************************************/
/*                          getGeometryName()                           */
/************************************************************************/

const char * OGRMultiPolygon::getGeometryName() const

{
    return "MULTIPOLYGON";
}

/************************************************************************/
/*                        addGeometryDirectly()                         */
/************************************************************************/

OGRErr OGRMultiPolygon::addGeometryDirectly( OGRGeometry * poNewGeom )

{
    if( poNewGeom->getGeometryType() != wkbPolygon 
        && poNewGeom->getGeometryType() != wkbPolygon25D )
        return OGRERR_UNSUPPORTED_GEOMETRY_TYPE;

    return OGRGeometryCollection::addGeometryDirectly( poNewGeom );
}

/************************************************************************/
/*                               clone()                                */
/************************************************************************/

OGRGeometry *OGRMultiPolygon::clone() const

{
    OGRMultiPolygon     *poNewGC;

    poNewGC = new OGRMultiPolygon;
    poNewGC->assignSpatialReference( getSpatialReference() );

    for( int i = 0; i < getNumGeometries(); i++ )
    {
        poNewGC->addGeometry( getGeometryRef(i) );
    }

    return poNewGC;
}

/************************************************************************/
/*                           importFromWkt()                            */
/*                                                                      */
/*      Instantiate from well known text format.  Currently this is     */
/*      `MULTIPOLYGON ((x y, x y, ...),(x y, ...),...)'.                */
/************************************************************************/

OGRErr OGRMultiPolygon::importFromWkt( char ** ppszInput )

{
    char        szToken[OGR_WKT_TOKEN_MAX];
    const char  *pszInput = *ppszInput;
    OGRErr      eErr = OGRERR_NONE;

/* -------------------------------------------------------------------- */
/*      Clear existing rings.                                           */
/* -------------------------------------------------------------------- */
    empty();

/* -------------------------------------------------------------------- */
/*      Read and verify the MULTIPOLYGON keyword token.                 */
/* -------------------------------------------------------------------- */
    pszInput = OGRWktReadToken( pszInput, szToken );

    if( !EQUAL(szToken,getGeometryName()) )
        return OGRERR_CORRUPT_DATA;

/* -------------------------------------------------------------------- */
/*      The next character should be a ( indicating the start of the    */
/*      list of polygons.                                               */
/* -------------------------------------------------------------------- */
    pszInput = OGRWktReadToken( pszInput, szToken );

    if( EQUAL(szToken,"EMPTY") )
    {
        *ppszInput = (char *) pszInput;
        return OGRERR_NONE;
    }

    if( szToken[0] != '(' )
        return OGRERR_CORRUPT_DATA;

/* -------------------------------------------------------------------- */
/*      If the next token is EMPTY, then verify that we have proper     */
/*      EMPTY format will a trailing closing bracket.                   */
/* -------------------------------------------------------------------- */
    OGRWktReadToken( pszInput, szToken );
    if( EQUAL(szToken,"EMPTY") )
    {
        pszInput = OGRWktReadToken( pszInput, szToken );
        pszInput = OGRWktReadToken( pszInput, szToken );
        
        *ppszInput = (char *) pszInput;

        if( !EQUAL(szToken,")") )
            return OGRERR_CORRUPT_DATA;
        else
            return OGRERR_NONE;
    }

/* ==================================================================== */
/*      Read each polygon in turn.  Note that we try to reuse the same  */
/*      point list buffer from ring to ring to cut down on              */
/*      allocate/deallocate overhead.                                   */
/* ==================================================================== */
    OGRRawPoint *paoPoints = NULL;
    int         nMaxPoints = 0;
    double      *padfZ = NULL;
    
    do
    {
        OGRPolygon      *poPolygon = new OGRPolygon();

/* -------------------------------------------------------------------- */
/*      The next character should be a ( indicating the start of the    */
/*      list of polygons.                                               */
/* -------------------------------------------------------------------- */
        pszInput = OGRWktReadToken( pszInput, szToken );
        if( szToken[0] != '(' )
        {
            eErr = OGRERR_CORRUPT_DATA;
            break;
        }

/* -------------------------------------------------------------------- */
/*      Loop over each ring in this polygon.                            */
/* -------------------------------------------------------------------- */
        do
        {
            int     nPoints = 0;

/* -------------------------------------------------------------------- */
/*      Read points for one line from input.                            */
/* -------------------------------------------------------------------- */
            pszInput = OGRWktReadPoints( pszInput, &paoPoints, &padfZ, &nMaxPoints,
                                         &nPoints );

            if( pszInput == NULL )
            {
                eErr = OGRERR_CORRUPT_DATA;
                break;
            }
        
/* -------------------------------------------------------------------- */
/*      Create the new line, and add to collection.                     */
/* -------------------------------------------------------------------- */
            OGRLinearRing       *poLine;

            poLine = new OGRLinearRing();
            poLine->setPoints( nPoints, paoPoints, padfZ );

            poPolygon->addRingDirectly( poLine ); 

/* -------------------------------------------------------------------- */
/*      Read the delimeter following the ring.                          */
/* -------------------------------------------------------------------- */
        
            pszInput = OGRWktReadToken( pszInput, szToken );
        } while( szToken[0] == ',' && eErr == OGRERR_NONE );

/* -------------------------------------------------------------------- */
/*      Verify that we have a closing bracket.                          */
/* -------------------------------------------------------------------- */
        if( eErr == OGRERR_NONE )
        {
            if( szToken[0] != ')' )
                eErr = OGRERR_CORRUPT_DATA;
            else
                pszInput = OGRWktReadToken( pszInput, szToken );
        }
        
/* -------------------------------------------------------------------- */
/*      Add the polygon to the MULTIPOLYGON.                            */
/* -------------------------------------------------------------------- */
        if( eErr == OGRERR_NONE )
            eErr = addGeometryDirectly( poPolygon );

    } while( szToken[0] == ',' && eErr == OGRERR_NONE );

/* -------------------------------------------------------------------- */
/*      freak if we don't get a closing bracket.                        */
/* -------------------------------------------------------------------- */
    CPLFree( paoPoints );
    CPLFree( padfZ );
   
    if( eErr != OGRERR_NONE )
        return eErr;

    if( szToken[0] != ')' )
        return OGRERR_CORRUPT_DATA;
    
    *ppszInput = (char *) pszInput;
    return OGRERR_NONE;
}

/************************************************************************/
/*                            exportToWkt()                             */
/*                                                                      */
/*      Translate this structure into it's well known text format       */
/*      equivelent.  This could be made alot more CPU efficient!        */
/************************************************************************/

OGRErr OGRMultiPolygon::exportToWkt( char ** ppszDstText ) const

{
    char        **papszLines;
    int         iLine, nCumulativeLength = 0, nValidPolys=0;
    OGRErr      eErr;

/* -------------------------------------------------------------------- */
/*      Build a list of strings containing the stuff for each ring.     */
/* -------------------------------------------------------------------- */
    papszLines = (char **) CPLCalloc(sizeof(char *),getNumGeometries());

    for( iLine = 0; iLine < getNumGeometries(); iLine++ )
    {
        eErr = getGeometryRef(iLine)->exportToWkt( &(papszLines[iLine]) );
        if( eErr != OGRERR_NONE )
            return eErr;

        if( !EQUALN(papszLines[iLine],"POLYGON (", 9) )
        {
            CPLDebug( "OGR", "OGRMultiPolygon::exportToWkt() - skipping %s.",
                      papszLines[iLine] );
            CPLFree( papszLines[iLine] );
            papszLines[iLine] = NULL;
            continue;
        }
        
        nCumulativeLength += strlen(papszLines[iLine] + 8);
        nValidPolys++;
    }
    
/* -------------------------------------------------------------------- */
/*      Return MULTIPOLYGON EMPTY if we get no valid polygons.          */
/* -------------------------------------------------------------------- */
    if( nValidPolys == 0 )
    {
        *ppszDstText = CPLStrdup("MULTIPOLYGON EMPTY");
        return OGRERR_NONE;
    }

/* -------------------------------------------------------------------- */
/*      Allocate exactly the right amount of space for the              */
/*      aggregated string.                                              */
/* -------------------------------------------------------------------- */
    *ppszDstText = (char *) VSIMalloc(nCumulativeLength+getNumGeometries()+20);

    if( *ppszDstText == NULL )
        return OGRERR_NOT_ENOUGH_MEMORY;

/* -------------------------------------------------------------------- */
/*      Build up the string, freeing temporary strings as we go.        */
/* -------------------------------------------------------------------- */
    strcpy( *ppszDstText, "MULTIPOLYGON (" );

    for( iLine = 0; iLine < getNumGeometries(); iLine++ )
    {                                                           
        if( papszLines[iLine] == NULL )
            continue;

        if( iLine > 0 )
            strcat( *ppszDstText, "," );
        
        strcat( *ppszDstText, papszLines[iLine] + 8 );
        VSIFree( papszLines[iLine] );
    }

    strcat( *ppszDstText, ")" );

    CPLFree( papszLines );

    return OGRERR_NONE;
}

/************************************************************************/
/*                              get_Area()                              */
/************************************************************************/

/**
 * Compute area of multipolygon.
 *
 * The area is computed as the sum of the areas of all polygon members
 * in this collection.
 *
 * @return computed area.
 */

double OGRMultiPolygon::get_Area() const

{
    double dfArea = 0.0;
    int iPoly;

    for( iPoly = 0; iPoly < getNumGeometries(); iPoly++ )
    {
        OGRPolygon *poPoly = (OGRPolygon *) getGeometryRef( iPoly );

        dfArea += poPoly->get_Area();
    }

    return dfArea;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品久久久久久国产精华液| 麻豆91在线看| 亚洲成a人在线观看| 一区二区在线观看不卡| 国产精品99久久久久久宅男| 色美美综合视频| 2020国产精品自拍| 日韩电影在线一区二区三区| 国产99精品视频| 欧美日韩激情在线| 国产日韩精品久久久| 男女男精品视频| 一本色道**综合亚洲精品蜜桃冫| 欧美大片在线观看一区二区| 亚洲第一综合色| 99久久伊人精品| 久久综合久久久久88| 亚洲综合自拍偷拍| 成人免费毛片片v| 日韩欧美高清一区| 一区二区高清免费观看影视大全| 成人美女视频在线看| 日韩一区二区三区在线| 亚洲精品亚洲人成人网| 国产高清精品网站| 欧美不卡在线视频| 亚洲成人高清在线| 在线电影院国产精品| 亚洲乱码国产乱码精品精小说| 久草热8精品视频在线观看| 欧美一级夜夜爽| 中文字幕在线观看不卡| 国内精品国产三级国产a久久| 91精品国产全国免费观看| 亚洲精品久久久久久国产精华液| 91麻豆swag| 日韩理论片一区二区| 国产剧情av麻豆香蕉精品| 久久综合久色欧美综合狠狠| 精品一区二区三区视频| 欧美电视剧在线观看完整版| 国产美女久久久久| 久久伊99综合婷婷久久伊| 久久99热99| 国产日韩av一区| 99视频精品全部免费在线| 国产清纯美女被跳蛋高潮一区二区久久w| 狠狠狠色丁香婷婷综合激情| 欧美变态口味重另类| 国产尤物一区二区在线| 国产区在线观看成人精品| 成人免费黄色大片| 综合久久一区二区三区| 国产一区二区在线电影| 精品国产91亚洲一区二区三区婷婷 | 亚洲视频中文字幕| 欧美在线免费播放| 亚洲亚洲精品在线观看| 欧美日韩中文另类| 极品少妇xxxx精品少妇偷拍| 久久精品一区二区| 成人中文字幕在线| 亚洲一区精品在线| 欧美高清精品3d| 老汉av免费一区二区三区| 精品999在线播放| 日本久久一区二区三区| 亚洲精品自拍动漫在线| 制服丝袜激情欧洲亚洲| 久久国产人妖系列| 国产精品女同互慰在线看| 在线观看欧美日本| 日本美女视频一区二区| 欧美日韩一区 二区 三区 久久精品| 日本欧美一区二区在线观看| 国产精品久久三| 在线免费精品视频| 美女mm1313爽爽久久久蜜臀| 在线播放中文字幕一区| caoporen国产精品视频| 亚洲国产成人精品视频| 日韩久久精品一区| 91国在线观看| 麻豆精品视频在线观看视频| 中文字幕精品综合| 日韩午夜精品电影| 色综合天天天天做夜夜夜夜做| 午夜精彩视频在线观看不卡| 日本一区二区三区国色天香 | 亚洲免费观看高清完整版在线观看熊| 欧美日韩中文字幕一区二区| 黄页网站大全一区二区| 午夜久久久久久久久| 国产午夜精品一区二区| 暴力调教一区二区三区| 美女爽到高潮91| 亚洲精品高清在线| 国产亚洲综合性久久久影院| 99精品国产99久久久久久白柏| 激情av综合网| 日本美女视频一区二区| 一区二区三区产品免费精品久久75| 欧美日韩视频在线第一区| 色噜噜狠狠成人中文综合| 国产真实乱对白精彩久久| 亚洲一区二区三区四区不卡| 国产婷婷色一区二区三区四区 | 丝瓜av网站精品一区二区| 中文字幕av一区二区三区高 | 99re热这里只有精品免费视频 | 亚洲黄色免费网站| 综合久久久久久| 国产欧美视频一区二区三区| 欧美电影免费观看高清完整版| 8v天堂国产在线一区二区| 91在线视频官网| 国产成a人亚洲| 国产 欧美在线| 国产成人三级在线观看| 亚洲成人免费视| 亚洲超碰精品一区二区| 亚洲女与黑人做爰| 欧美激情综合五月色丁香| 久久久噜噜噜久久中文字幕色伊伊| 欧美一级日韩免费不卡| 欧美日韩不卡视频| 7777精品伊人久久久大香线蕉经典版下载 | 精品少妇一区二区三区在线播放| 在线播放91灌醉迷j高跟美女 | 欧美色精品在线视频| 欧美日本在线看| 精品国产一区久久| 国产精品青草久久| 亚洲欧美日韩国产手机在线| 一区二区三区四区av| 青椒成人免费视频| 国产剧情一区二区| 日本韩国一区二区三区视频| 在线视频你懂得一区二区三区| 欧美人与禽zozo性伦| 精品国产在天天线2019| 亚洲色图欧洲色图婷婷| 夜夜夜精品看看| 激情图片小说一区| 99久久精品免费看国产| 欧美精品乱码久久久久久按摩| 欧美成人一区二区三区在线观看| 欧美激情一区二区三区不卡 | 一区二区三区在线影院| 婷婷久久综合九色国产成人| 国产一区二区三区国产| 色视频一区二区| 久久女同精品一区二区| 亚洲另类春色校园小说| 久久成人av少妇免费| 91亚洲资源网| 亚洲精品一区二区三区四区高清 | 日韩精品1区2区3区| 国产精品一品二品| 欧美亚洲高清一区| 国产日韩欧美不卡| 日韩精品色哟哟| 99久免费精品视频在线观看| 日韩一区二区免费视频| 自拍偷在线精品自拍偷无码专区| 久久成人av少妇免费| 欧美日韩中文另类| 最新不卡av在线| 国产精品 日产精品 欧美精品| 欧美亚洲综合久久| 国产精品灌醉下药二区| 国产综合久久久久影院| 欧美专区日韩专区| 中文字幕av一区 二区| 久久99久久精品欧美| 欧美视频完全免费看| 国产精品不卡在线| 国产盗摄女厕一区二区三区| 日韩欧美久久久| 午夜精品123| 欧美日韩不卡视频| 亚洲永久免费av| 91香蕉视频mp4| 国产精品护士白丝一区av| 国产精品一区二区x88av| 日韩精品影音先锋| 日韩av成人高清| 欧美丰满少妇xxxbbb| 亚洲国产成人porn| 欧美日韩一区二区三区四区五区 | 最新日韩在线视频| 国产成人精品影视| 国产婷婷色一区二区三区在线| 国产一区二区在线电影| 久久久综合精品| 国产精品一区三区| 欧美国产禁国产网站cc| 成人aa视频在线观看| 中文字幕精品一区二区精品绿巨人| 国产91丝袜在线播放九色|