📄 ogrocilayer.cpp
字号:
poCollection = new OGRGeometryCollection(); else if( ORA_GTYPE_MATCH(nGType,ORA_GTYPE_MULTIPOINT) ) poCollection = new OGRMultiPoint(); else if( ORA_GTYPE_MATCH(nGType,ORA_GTYPE_MULTILINESTRING) ) poCollection = new OGRMultiLineString(); else if( ORA_GTYPE_MATCH(nGType,ORA_GTYPE_MULTIPOLYGON) ) poCollection = new OGRMultiPolygon();/* ==================================================================== *//* Loop over the component elements. *//* ==================================================================== */ ub4 nNextStartOrdinal = 1; for( int iElement = 0; iElement < nElemCount; iElement += 3 ) { boolean bExists; OCINumber *hNumber; ub4 nInterpretation, nEType; int nStartOrdinal = nNextStartOrdinal;/* -------------------------------------------------------------------- *//* Get the details about element from the elem_info array. *//* -------------------------------------------------------------------- */ OCICollGetElem(poSession->hEnv, poSession->hError, (OCIColl *)(hLastGeom->sdo_elem_info), (sb4)(iElement+1), (boolean *)&bExists, (dvoid **)&hNumber, NULL ); OCINumberToInt(poSession->hError, hNumber, (uword)sizeof(ub4), OCI_NUMBER_UNSIGNED, (dvoid *) &nEType ); OCICollGetElem(poSession->hEnv, poSession->hError, (OCIColl *)(hLastGeom->sdo_elem_info), (sb4)(iElement+2), (boolean *)&bExists, (dvoid **)&hNumber, NULL ); OCINumberToInt(poSession->hError, hNumber, (uword)sizeof(ub4), OCI_NUMBER_UNSIGNED, (dvoid *) &nInterpretation ); if( iElement < nElemCount-3 ) { OCICollGetElem(poSession->hEnv, poSession->hError, (OCIColl *)(hLastGeom->sdo_elem_info), (sb4)(iElement+3), (boolean *)&bExists, (dvoid **)&hNumber,NULL); OCINumberToInt(poSession->hError, hNumber, (uword)sizeof(ub4), OCI_NUMBER_UNSIGNED, (dvoid *) &nNextStartOrdinal ); } else nNextStartOrdinal = nOrdCount+1;/* -------------------------------------------------------------------- *//* Translate this element. *//* -------------------------------------------------------------------- */ OGRGeometry *poGeom; poGeom = TranslateGeometryElement( nGType, nDimension, nEType, nInterpretation, nStartOrdinal - 1, nNextStartOrdinal - nStartOrdinal ); if( poGeom == NULL ) return NULL;/* -------------------------------------------------------------------- *//* Based on GType do what is appropriate. *//* -------------------------------------------------------------------- */ if( ORA_GTYPE_MATCH(nGType,ORA_GTYPE_LINESTRING) ) { CPLAssert(wkbFlatten(poGeom->getGeometryType()) == wkbLineString); return poGeom; } else if( ORA_GTYPE_MATCH(nGType,ORA_GTYPE_POINT) ) { CPLAssert(wkbFlatten(poGeom->getGeometryType()) == wkbPoint); return poGeom; } else if( ORA_GTYPE_MATCH(nGType,ORA_GTYPE_POLYGON) ) { CPLAssert(wkbFlatten(poGeom->getGeometryType()) == wkbLineString ); poPolygon->addRingDirectly( (OGRLinearRing *) poGeom ); } else { CPLAssert( poCollection != NULL ); if( wkbFlatten(poGeom->getGeometryType()) == wkbMultiPoint ) { int i; OGRMultiPoint *poMP = (OGRMultiPoint *) poGeom; for( i = 0; i < poMP->getNumGeometries(); i++ ) poCollection->addGeometry( poMP->getGeometryRef(i) ); delete poMP; } else if( nEType % 1000 == 3 ) { /* its one poly ring, create new poly or add to existing */ if( nEType > 999 && nEType < 2999 ) { if( poPolygon != NULL && poPolygon->getExteriorRing() != NULL ) { poCollection->addGeometryDirectly( poPolygon ); poPolygon = NULL; } poPolygon = new OGRPolygon(); } if( poPolygon != NULL ) poPolygon->addRingDirectly( (OGRLinearRing *) poGeom ); else { CPLAssert( poPolygon != NULL ); } } else poCollection->addGeometryDirectly( poGeom ); } } if( poCollection != NULL && poPolygon != NULL ) poCollection->addGeometryDirectly( poPolygon );/* -------------------------------------------------------------------- *//* Return resulting collection geometry. *//* -------------------------------------------------------------------- */ if( poCollection == NULL ) return poPolygon; else return poCollection;}/************************************************************************//* TranslateGeometryElement() *//************************************************************************/OGRGeometry *OGROCILayer::TranslateGeometryElement( int nGType, int nDimension, int nEType, int nInterpretation, int nStartOrdinal, int nOrdCount ){/* -------------------------------------------------------------------- *//* Handle line strings. For now we treat line strings of *//* curves as if they were simple point line strings. *//* -------------------------------------------------------------------- */ if( nEType == 1 && nInterpretation == 1 ) { OGRPoint *poPoint = new OGRPoint(); double dfX, dfY, dfZ = 0.0; GetOrdinalPoint( nStartOrdinal, nDimension, &dfX, &dfY, &dfZ ); poPoint->setX( dfX ); poPoint->setY( dfY ); poPoint->setZ( dfZ ); return poPoint; }/* -------------------------------------------------------------------- *//* Handle line strings. For now we treat line strings of *//* curves as if they were simple point line strings. *//* -------------------------------------------------------------------- */ else if( nEType == 1 ) { OGRMultiPoint *poMP = new OGRMultiPoint(); double dfX, dfY, dfZ = 0.0; int i; CPLAssert( nInterpretation == nOrdCount / nDimension ); for( i = 0; i < nInterpretation; i++ ) { GetOrdinalPoint( nStartOrdinal + i*nDimension, nDimension, &dfX, &dfY, &dfZ ); OGRPoint *poPoint = new OGRPoint( dfX, dfY, dfZ ); poMP->addGeometryDirectly( poPoint ); } return poMP; }/* -------------------------------------------------------------------- *//* Handle line strings. For now we treat line strings of *//* curves as if they were simple point line strings. *//* -------------------------------------------------------------------- */ else if( nEType == 2 ) { OGRLineString *poLS = new OGRLineString(); int nPointCount = nOrdCount / nDimension, i; poLS->setNumPoints( nPointCount ); for( i = 0; i < nPointCount; i++ ) { double dfX, dfY, dfZ = 0.0; GetOrdinalPoint( i*nDimension + nStartOrdinal, nDimension, &dfX, &dfY, &dfZ ); poLS->setPoint( i, dfX, dfY, dfZ ); } return poLS; }/* -------------------------------------------------------------------- *//* Handle polygon rings. *//* -------------------------------------------------------------------- */ else if( nEType % 1000 == 3 && (nInterpretation == 1 || nInterpretation == 2 ) ) { OGRLinearRing *poLS = new OGRLinearRing(); int nPointCount = nOrdCount / nDimension, i; poLS->setNumPoints( nPointCount ); for( i = 0; i < nPointCount; i++ ) { double dfX, dfY, dfZ = 0.0; GetOrdinalPoint( i*nDimension + nStartOrdinal, nDimension, &dfX, &dfY, &dfZ ); poLS->setPoint( i, dfX, dfY, dfZ ); } return poLS; }/* -------------------------------------------------------------------- *//* Handle rectangle definitions ... translate into a linear ring. *//* -------------------------------------------------------------------- */ else if( nEType % 1000 == 3 && nInterpretation == 3 ) { OGRLinearRing *poLS = new OGRLinearRing(); double dfX1, dfY1, dfZ1 = 0.0; double dfX2, dfY2, dfZ2 = 0.0; GetOrdinalPoint( nStartOrdinal, nDimension, &dfX1, &dfY1, &dfZ1 ); GetOrdinalPoint( nStartOrdinal + nDimension, nDimension, &dfX2, &dfY2, &dfZ2 ); poLS->setNumPoints( 5 ); poLS->setPoint( 0, dfX1, dfY1, dfZ1 ); poLS->setPoint( 1, dfX2, dfY1, dfZ1 ); poLS->setPoint( 2, dfX2, dfY2, dfZ2 ); poLS->setPoint( 3, dfX1, dfY2, dfZ2 ); poLS->setPoint( 4, dfX1, dfY1, dfZ1 ); return poLS; } return NULL;}/************************************************************************//* GetOrdinalPoint() *//************************************************************************/int OGROCILayer::GetOrdinalPoint( int iOrdinal, int nDimension, double *pdfX, double *pdfY, double *pdfZ ){ OGROCISession *poSession = poDS->GetSession(); boolean bExists; OCINumber *hNumber; OCICollGetElem( poSession->hEnv, poSession->hError, (OCIColl *)(hLastGeom->sdo_ordinates), (sb4)iOrdinal+0, (boolean *)&bExists, (dvoid **)&hNumber, NULL ); OCINumberToReal(poSession->hError, hNumber, (uword)sizeof(double), (dvoid *)pdfX); OCICollGetElem( poSession->hEnv, poSession->hError, (OCIColl *)(hLastGeom->sdo_ordinates), (sb4)iOrdinal + 1, (boolean *)&bExists, (dvoid **)&hNumber, NULL ); OCINumberToReal(poSession->hError, hNumber, (uword)sizeof(double), (dvoid *)pdfY); if( nDimension == 3 ) { OCICollGetElem( poSession->hEnv, poSession->hError, (OCIColl *)(hLastGeom->sdo_ordinates), (sb4)iOrdinal + 2, (boolean *)&bExists, (dvoid **)&hNumber, NULL ); OCINumberToReal(poSession->hError, hNumber, (uword)sizeof(double), (dvoid *)pdfZ); } return TRUE;} /************************************************************************//* TestCapability() *//************************************************************************/int OGROCILayer::TestCapability( const char * pszCap ){ if( EQUAL(pszCap,OLCRandomRead) ) return TRUE; else if( EQUAL(pszCap,OLCFastFeatureCount) ) return m_poFilterGeom == NULL; else if( EQUAL(pszCap,OLCFastSpatialFilter) ) return TRUE; else if( EQUAL(pszCap,OLCTransactions) ) return TRUE; else return FALSE;}/************************************************************************//* LookupTableSRID() *//* *//* Note that the table name may also be prefixed by the owner *//* with a dot separator. *//************************************************************************/int OGROCILayer::LookupTableSRID(){/* -------------------------------------------------------------------- *//* If we don't have a geometry column, there isn't much point *//* in trying. *//* -------------------------------------------------------------------- */ if( pszGeomName == NULL ) return -1; /* -------------------------------------------------------------------- *//* Split out the owner if available. *//* -------------------------------------------------------------------- */ const char *pszTableName = GetLayerDefn()->GetName(); char *pszOwner = NULL; if( strstr(pszTableName,".") != NULL ) { pszOwner = CPLStrdup(pszTableName); pszTableName = strstr(pszTableName,".") + 1; *(strstr(pszOwner,".")) = '\0'; }/* -------------------------------------------------------------------- *//* Build our query command. *//* -------------------------------------------------------------------- */ OGROCIStringBuf oCommand; oCommand.Appendf( 1000, "SELECT SRID FROM ALL_SDO_GEOM_METADATA " "WHERE TABLE_NAME = '%s' AND COLUMN_NAME = '%s'", pszTableName, pszGeomName ); if( pszOwner != NULL ) { oCommand.Appendf( 500, " AND OWNER = '%s'", pszOwner ); CPLFree( pszOwner ); }/* -------------------------------------------------------------------- *//* Execute query command. *//* -------------------------------------------------------------------- */ OGROCIStatement oGetTables( poDS->GetSession() ); int nSRID = -1; if( oGetTables.Execute( oCommand.GetString() ) == CE_None ) { char **papszRow = oGetTables.SimpleFetchRow(); if( papszRow != NULL && papszRow[0] != NULL ) nSRID = atoi( papszRow[0] ); } return nSRID;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -