📄 ogrlinestring.cpp
字号:
/* -------------------------------------------------------------------- */ pabyData[0] = (unsigned char) eByteOrder;/* -------------------------------------------------------------------- *//* Set the geometry feature type. *//* -------------------------------------------------------------------- */ GUInt32 nGType = getGeometryType(); if( eByteOrder == wkbNDR ) nGType = CPL_LSBWORD32( nGType ); else nGType = CPL_MSBWORD32( nGType ); memcpy( pabyData + 1, &nGType, 4 ); /* -------------------------------------------------------------------- *//* Copy in the data count. *//* -------------------------------------------------------------------- */ memcpy( pabyData+5, &nPointCount, 4 );/* -------------------------------------------------------------------- *//* Copy in the raw data. *//* -------------------------------------------------------------------- */ int i; if( getCoordinateDimension() == 3 ) { for( i = 0; i < nPointCount; i++ ) { memcpy( pabyData + 9 + 24*i, paoPoints+i, 16 ); memcpy( pabyData + 9 + 16 + 24*i, padfZ+i, 8 ); } } else memcpy( pabyData+9, paoPoints, 16 * nPointCount );/* -------------------------------------------------------------------- *//* Swap if needed. *//* -------------------------------------------------------------------- */ if( OGR_SWAP( eByteOrder ) ) { int nCount; nCount = CPL_SWAP32( nPointCount ); memcpy( pabyData+5, &nCount, 4 ); for( i = getCoordinateDimension() * nPointCount - 1; i >= 0; i-- ) { CPL_SWAP64PTR( pabyData + 9 + 8 * i ); } } return OGRERR_NONE;}/************************************************************************//* importFromWkt() *//* *//* Instantiate from well known text format. Currently this is *//* `LINESTRING ( x y, x y, ...)', *//************************************************************************/OGRErr OGRLineString::importFromWkt( char ** ppszInput ){ char szToken[OGR_WKT_TOKEN_MAX]; const char *pszInput = *ppszInput; if( paoPoints != NULL ) { nPointCount = 0; CPLFree( paoPoints ); paoPoints = NULL; CPLFree( padfZ ); padfZ = NULL; }/* -------------------------------------------------------------------- *//* Read and verify the ``LINESTRING'' keyword token. *//* -------------------------------------------------------------------- */ pszInput = OGRWktReadToken( pszInput, szToken ); if( !EQUAL(szToken,getGeometryName()) ) return OGRERR_CORRUPT_DATA;/* -------------------------------------------------------------------- *//* Read the point list. *//* -------------------------------------------------------------------- */ int nMaxPoint = 0; nPointCount = 0; pszInput = OGRWktReadPoints( pszInput, &paoPoints, &padfZ, &nMaxPoint, &nPointCount ); if( pszInput == NULL ) 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 OGRLineString::exportToWkt( char ** ppszDstText ){ int nMaxString = nPointCount * 20 * 3 + 20; int nRetLen = 0; *ppszDstText = (char *) VSIMalloc( nMaxString ); if( *ppszDstText == NULL ) return OGRERR_NOT_ENOUGH_MEMORY; sprintf( *ppszDstText, "%s (", getGeometryName() ); for( int i = 0; i < nPointCount; i++ ) { if( nMaxString <= (int) strlen(*ppszDstText+nRetLen) + 32 + nRetLen ) { CPLDebug( "OGR", "OGRLineString::exportToWkt() ... buffer overflow.\n" "nMaxString=%d, strlen(*ppszDstText) = %d, i=%d\n" "*ppszDstText = %s", nMaxString, strlen(*ppszDstText), i, *ppszDstText ); VSIFree( *ppszDstText ); *ppszDstText = NULL; return OGRERR_NOT_ENOUGH_MEMORY; } if( i > 0 ) strcat( *ppszDstText + nRetLen, "," ); nRetLen += strlen(*ppszDstText + nRetLen); if( getCoordinateDimension() == 3 ) OGRMakeWktCoordinate( *ppszDstText + nRetLen, paoPoints[i].x, paoPoints[i].y, padfZ[i] ); else OGRMakeWktCoordinate( *ppszDstText + nRetLen, paoPoints[i].x, paoPoints[i].y, 0.0 ); nRetLen += strlen(*ppszDstText + nRetLen); } strcat( *ppszDstText+nRetLen, ")" ); return OGRERR_NONE;}/************************************************************************//* get_Length() *//* *//* For now we return a simple euclidian 2D distance. *//************************************************************************/double OGRLineString::get_Length(){ double dfLength = 0; int i; for( i = 0; i < nPointCount-1; i++ ) { double dfDeltaX, dfDeltaY; dfDeltaX = paoPoints[i+1].x - paoPoints[i].x; dfDeltaY = paoPoints[i+1].y - paoPoints[i].y; dfLength += sqrt(dfDeltaX*dfDeltaX + dfDeltaY*dfDeltaY); } return dfLength;}/************************************************************************//* StartPoint() *//************************************************************************/void OGRLineString::StartPoint( OGRPoint * poPoint ){ getPoint( 0, poPoint );}/************************************************************************//* EndPoint() *//************************************************************************/void OGRLineString::EndPoint( OGRPoint * poPoint ){ getPoint( nPointCount-1, poPoint );}/************************************************************************//* Value() *//* *//* Get an interpolated point at some distance along the curve. *//************************************************************************/void OGRLineString::Value( double dfDistance, OGRPoint * poPoint ){ double dfLength = 0; int i; if( dfDistance < 0 ) { StartPoint( poPoint ); return; } for( i = 0; i < nPointCount-1; i++ ) { double dfDeltaX, dfDeltaY, dfSegLength; dfDeltaX = paoPoints[i+1].x - paoPoints[i].x; dfDeltaY = paoPoints[i+1].y - paoPoints[i].y; dfSegLength = sqrt(dfDeltaX*dfDeltaX + dfDeltaY*dfDeltaY); if( dfLength <= dfDistance && dfLength + dfSegLength >= dfDistance ) { double dfRatio; dfRatio = (dfDistance - dfLength) / dfSegLength; poPoint->setX( paoPoints[i].x * (1 - dfRatio) + paoPoints[i+1].x * dfRatio ); poPoint->setY( paoPoints[i].y * (1 - dfRatio) + paoPoints[i+1].y * dfRatio ); if( getCoordinateDimension() == 3 ) poPoint->setZ( padfZ[i] * (1 - dfRatio) + padfZ[i] * dfRatio ); return; } } EndPoint( poPoint );}/************************************************************************//* getEnvelope() *//************************************************************************/void OGRLineString::getEnvelope( OGREnvelope * psEnvelope ){ double dfMinX, dfMinY, dfMaxX, dfMaxY; if( nPointCount == 0 ) return; dfMinX = dfMaxX = paoPoints[0].x; dfMinY = dfMaxY = paoPoints[0].y; for( int iPoint = 1; iPoint < nPointCount; iPoint++ ) { if( dfMaxX < paoPoints[iPoint].x ) dfMaxX = paoPoints[iPoint].x; if( dfMaxY < paoPoints[iPoint].y ) dfMaxY = paoPoints[iPoint].y; if( dfMinX > paoPoints[iPoint].x ) dfMinX = paoPoints[iPoint].x; if( dfMinY > paoPoints[iPoint].y ) dfMinY = paoPoints[iPoint].y; } psEnvelope->MinX = dfMinX; psEnvelope->MaxX = dfMaxX; psEnvelope->MinY = dfMinY; psEnvelope->MaxY = dfMaxY;}/************************************************************************//* Equal() *//************************************************************************/OGRBoolean OGRLineString::Equal( OGRGeometry * poOther ){ OGRLineString *poOLine = (OGRLineString *) poOther; if( poOther == this ) return TRUE; if( poOther->getGeometryType() != getGeometryType() ) return FALSE; // we should eventually test the SRS. if( getNumPoints() != poOLine->getNumPoints() ) return FALSE; for( int iPoint = 0; iPoint < getNumPoints(); iPoint++ ) { if( getX(iPoint) != poOLine->getX(iPoint) || getY(iPoint) != poOLine->getY(iPoint) || getZ(iPoint) != poOLine->getZ(iPoint) ) return FALSE; } return TRUE;}/************************************************************************//* transform() *//************************************************************************/OGRErr OGRLineString::transform( OGRCoordinateTransformation *poCT ){#ifdef DISABLE_OGRGEOM_TRANSFORM return OGRERR_FAILURE;#else double *xyz; int i;/* -------------------------------------------------------------------- *//* Because we don't want to partially transform this geometry *//* (if some points fail after some have succeeded) we will *//* instead make a copy of the points to operate on. *//* -------------------------------------------------------------------- */ xyz = (double *) CPLMalloc(sizeof(double) * nPointCount * 3); if( xyz == NULL ) return OGRERR_NOT_ENOUGH_MEMORY; for( i = 0; i < nPointCount; i++ ) { xyz[i ] = paoPoints[i].x; xyz[i+nPointCount] = paoPoints[i].y; if( padfZ ) xyz[i+nPointCount*2] = padfZ[i]; else xyz[i+nPointCount*2] = 0.0; }/* -------------------------------------------------------------------- *//* Transform and reapply. *//* -------------------------------------------------------------------- */ if( !poCT->Transform( nPointCount, xyz, xyz + nPointCount, xyz+nPointCount*2 ) ) { CPLFree( xyz ); return OGRERR_FAILURE; } else { setPoints( nPointCount, xyz, xyz+nPointCount, xyz+nPointCount*2 ); CPLFree( xyz ); assignSpatialReference( poCT->GetTargetCS() ); return OGRERR_NONE; }#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -