本文整理汇总了C++中OGRFeature类的典型用法代码示例。如果您正苦于以下问题:C++ OGRFeature类的具体用法?C++ OGRFeature怎么用?C++ OGRFeature使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了OGRFeature类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ReportOnLayer
static void ReportOnLayer( OGRLayer * poLayer, int bVerbose )
{
OGRFeatureDefn *poDefn = poLayer->GetLayerDefn();
/* -------------------------------------------------------------------- */
/* Report various overall information. */
/* -------------------------------------------------------------------- */
printf( "\n" );
printf( "Layer name: %s\n", poLayer->GetName() );
if( bVerbose )
{
int nGeomFieldCount =
poLayer->GetLayerDefn()->GetGeomFieldCount();
if( nGeomFieldCount > 1 )
{
for(int iGeom = 0;iGeom < nGeomFieldCount; iGeom ++ )
{
OGRGeomFieldDefn* poGFldDefn =
poLayer->GetLayerDefn()->GetGeomFieldDefn(iGeom);
printf( "Geometry (%s): %s\n", poGFldDefn->GetNameRef(),
OGRGeometryTypeToName( poGFldDefn->GetType() ) );
}
}
else
{
printf( "Geometry: %s\n",
OGRGeometryTypeToName( poLayer->GetGeomType() ) );
}
printf( "Feature Count: " CPL_FRMT_GIB "\n", poLayer->GetFeatureCount() );
OGREnvelope oExt;
if( nGeomFieldCount > 1 )
{
for(int iGeom = 0;iGeom < nGeomFieldCount; iGeom ++ )
{
if (poLayer->GetExtent(iGeom, &oExt, TRUE) == OGRERR_NONE)
{
OGRGeomFieldDefn* poGFldDefn =
poLayer->GetLayerDefn()->GetGeomFieldDefn(iGeom);
CPLprintf("Extent (%s): (%f, %f) - (%f, %f)\n",
poGFldDefn->GetNameRef(),
oExt.MinX, oExt.MinY, oExt.MaxX, oExt.MaxY);
}
}
}
else if ( poLayer->GetExtent(&oExt, TRUE) == OGRERR_NONE)
{
CPLprintf("Extent: (%f, %f) - (%f, %f)\n",
oExt.MinX, oExt.MinY, oExt.MaxX, oExt.MaxY);
}
char *pszWKT;
if( nGeomFieldCount > 1 )
{
for(int iGeom = 0;iGeom < nGeomFieldCount; iGeom ++ )
{
OGRGeomFieldDefn* poGFldDefn =
poLayer->GetLayerDefn()->GetGeomFieldDefn(iGeom);
OGRSpatialReference* poSRS = poGFldDefn->GetSpatialRef();
if( poSRS == NULL )
pszWKT = CPLStrdup( "(unknown)" );
else
{
poSRS->exportToPrettyWkt( &pszWKT );
}
printf( "SRS WKT (%s):\n%s\n",
poGFldDefn->GetNameRef(), pszWKT );
CPLFree( pszWKT );
}
}
else
{
if( poLayer->GetSpatialRef() == NULL )
pszWKT = CPLStrdup( "(unknown)" );
else
{
poLayer->GetSpatialRef()->exportToPrettyWkt( &pszWKT );
}
printf( "Layer SRS WKT:\n%s\n", pszWKT );
CPLFree( pszWKT );
}
if( strlen(poLayer->GetFIDColumn()) > 0 )
printf( "FID Column = %s\n",
poLayer->GetFIDColumn() );
for(int iGeom = 0;iGeom < nGeomFieldCount; iGeom ++ )
{
OGRGeomFieldDefn* poGFldDefn =
poLayer->GetLayerDefn()->GetGeomFieldDefn(iGeom);
if( nGeomFieldCount == 1 &&
EQUAL(poGFldDefn->GetNameRef(), "") && poGFldDefn->IsNullable() )
break;
//.........这里部分代码省略.........
示例2: ParseObject
static void ParseObject(const char* pszId,
json_object* poObj, OGRGeoJSONLayer* poLayer,
json_object* poArcsDB, ScalingParams* psParams)
{
json_object* poType = OGRGeoJSONFindMemberByName(poObj, "type");
if( poType == NULL || json_object_get_type(poType) != json_type_string )
return;
const char* pszType = json_object_get_string(poType);
json_object* poArcsObj = OGRGeoJSONFindMemberByName(poObj, "arcs");
json_object* poCoordinatesObj = OGRGeoJSONFindMemberByName(poObj, "coordinates");
if( strcmp(pszType, "Point") == 0 || strcmp(pszType, "MultiPoint") == 0 )
{
if( poCoordinatesObj == NULL || json_type_array != json_object_get_type(poCoordinatesObj) )
return;
}
else
{
if( poArcsObj == NULL || json_type_array != json_object_get_type(poArcsObj) )
return;
}
if( pszId == NULL )
{
json_object* poId = OGRGeoJSONFindMemberByName(poObj, "id");
if( poId != NULL &&
(json_type_string == json_object_get_type(poId) ||
json_type_int == json_object_get_type(poId)) )
{
pszId = json_object_get_string(poId);
}
}
OGRFeature* poFeature = new OGRFeature(poLayer->GetLayerDefn());
if( pszId != NULL )
poFeature->SetField("id", pszId);
json_object* poProperties = OGRGeoJSONFindMemberByName(poObj, "properties");
if( poProperties != NULL && json_type_object == json_object_get_type(poProperties) )
{
json_object* poName = OGRGeoJSONFindMemberByName(poProperties, "name");
if( poName != NULL && json_type_string == json_object_get_type(poName) )
{
const char* pszName = json_object_get_string(poName);
poFeature->SetField("name", pszName);
}
}
OGRGeometry* poGeom = NULL;
if( strcmp(pszType, "Point") == 0 )
{
double dfX = 0.0, dfY = 0.0;
if( ParsePoint( poCoordinatesObj, &dfX, &dfY ) )
{
dfX = dfX * psParams->dfScale0 + psParams->dfTranslate0;
dfY = dfY * psParams->dfScale1 + psParams->dfTranslate1;
poGeom = new OGRPoint(dfX, dfY);
}
else
poGeom = new OGRPoint();
}
else if( strcmp(pszType, "MultiPoint") == 0 )
{
OGRMultiPoint* poMP = new OGRMultiPoint();
poGeom = poMP;
int nTuples = json_object_array_length(poCoordinatesObj);
for(int i=0; i<nTuples; i++)
{
json_object* poPair = json_object_array_get_idx(poCoordinatesObj, i);
double dfX = 0.0, dfY = 0.0;
if( ParsePoint( poPair, &dfX, &dfY ) )
{
dfX = dfX * psParams->dfScale0 + psParams->dfTranslate0;
dfY = dfY * psParams->dfScale1 + psParams->dfTranslate1;
poMP->addGeometryDirectly(new OGRPoint(dfX, dfY));
}
}
}
else if( strcmp(pszType, "LineString") == 0 )
{
OGRLineString* poLS = new OGRLineString();
poGeom = poLS;
ParseLineString(poLS, poArcsObj, poArcsDB, psParams);
}
else if( strcmp(pszType, "MultiLineString") == 0 )
{
OGRMultiLineString* poMLS = new OGRMultiLineString();
poGeom = poMLS;
ParseMultiLineString(poMLS, poArcsObj, poArcsDB, psParams);
}
else if( strcmp(pszType, "Polygon") == 0 )
{
OGRPolygon* poPoly = new OGRPolygon();
poGeom = poPoly;
ParsePolygon(poPoly, poArcsObj, poArcsDB, psParams);
}
else if( strcmp(pszType, "MultiPolygon") == 0 )
{
OGRMultiPolygon* poMultiPoly = new OGRMultiPolygon();
poGeom = poMultiPoly;
//.........这里部分代码省略.........
示例3: while
OGRFeature *OGRHTFSoundingLayer::GetNextRawFeature()
{
const char* pszLine;
OGRLinearRing oLR;
while( (pszLine = CPLReadLine2L(fpHTF, 1024, NULL)) != NULL)
{
if (pszLine[0] == ';')
{
/* comment */ ;
}
else if (pszLine[0] == 0)
{
bEOF = true;
return NULL;
}
else if (strcmp(pszLine, "END OF SOUNDING DATA") == 0)
{
bEOF = true;
return NULL;
}
else
break;
}
if (pszLine == NULL)
{
bEOF = true;
return NULL;
}
double dfEasting = 0;
double dfNorthing = 0;
OGRFeature* poFeature = new OGRFeature(poFeatureDefn);
char* pszStr = const_cast<char *>(pszLine);
for( int i=0; i < poFeatureDefn->GetFieldCount(); i++ )
{
if (!panFieldPresence[i])
continue;
char* pszSpace = strchr(pszStr, ' ');
if (pszSpace)
*pszSpace = '\0';
if (strcmp(pszStr, "*") != 0)
poFeature->SetField(i, pszStr);
if (i == nEastingIndex)
dfEasting = poFeature->GetFieldAsDouble(i);
else if (i == nNorthingIndex)
dfNorthing = poFeature->GetFieldAsDouble(i);
if (pszSpace == NULL)
break;
pszStr = pszSpace + 1;
}
OGRPoint* poPoint = new OGRPoint(dfEasting, dfNorthing);
poPoint->assignSpatialReference(poSRS);
poFeature->SetGeometryDirectly(poPoint);
poFeature->SetFID(nNextFID++);
return poFeature;
}
示例4: GetLayerDefn
void OGRPDFLayer::Fill( GDALPDFArray* poArray )
{
for(int i=0;i<poArray->GetLength();i++)
{
GDALPDFObject* poFeatureObj = poArray->Get(i);
if (poFeatureObj->GetType() != PDFObjectType_Dictionary)
continue;
GDALPDFObject* poA = poFeatureObj->GetDictionary()->Get("A");
if (!(poA != NULL && poA->GetType() == PDFObjectType_Dictionary))
continue;
GDALPDFObject* poP = poA->GetDictionary()->Get("P");
if (!(poP != NULL && poP->GetType() == PDFObjectType_Array))
continue;
GDALPDFObject* poK = poFeatureObj->GetDictionary()->Get("K");
int nK = -1;
if (poK != NULL && poK->GetType() == PDFObjectType_Int)
nK = poK->GetInt();
GDALPDFArray* poPArray = poP->GetArray();
int j;
for(j = 0;j<poPArray->GetLength();j++)
{
GDALPDFObject* poKV = poPArray->Get(j);
if (poKV->GetType() == PDFObjectType_Dictionary)
{
GDALPDFObject* poN = poKV->GetDictionary()->Get("N");
GDALPDFObject* poV = poKV->GetDictionary()->Get("V");
if (poN != NULL && poN->GetType() == PDFObjectType_String &&
poV != NULL)
{
int nIdx = GetLayerDefn()->GetFieldIndex( poN->GetString().c_str() );
OGRFieldType eType = OFTString;
if (poV->GetType() == PDFObjectType_Int)
eType = OFTInteger;
else if (poV->GetType() == PDFObjectType_Real)
eType = OFTReal;
if (nIdx < 0)
{
OGRFieldDefn oField(poN->GetString().c_str(), eType);
CreateField(&oField);
}
else if (GetLayerDefn()->GetFieldDefn(nIdx)->GetType() != eType &&
GetLayerDefn()->GetFieldDefn(nIdx)->GetType() != OFTString)
{
OGRFieldDefn oField(poN->GetString().c_str(), OFTString);
AlterFieldDefn( nIdx, &oField, ALTER_TYPE_FLAG );
}
}
}
}
OGRFeature* poFeature = new OGRFeature(GetLayerDefn());
for(j = 0;j<poPArray->GetLength();j++)
{
GDALPDFObject* poKV = poPArray->Get(j);
if (poKV->GetType() == PDFObjectType_Dictionary)
{
GDALPDFObject* poN = poKV->GetDictionary()->Get("N");
GDALPDFObject* poV = poKV->GetDictionary()->Get("V");
if (poN != NULL && poN->GetType() == PDFObjectType_String &&
poV != NULL)
{
if (poV->GetType() == PDFObjectType_String)
poFeature->SetField(poN->GetString().c_str(), poV->GetString().c_str());
else if (poV->GetType() == PDFObjectType_Int)
poFeature->SetField(poN->GetString().c_str(), poV->GetInt());
else if (poV->GetType() == PDFObjectType_Real)
poFeature->SetField(poN->GetString().c_str(), poV->GetReal());
}
}
}
if (nK >= 0)
{
OGRGeometry* poGeom = poDS->GetGeometryFromMCID(nK);
if (poGeom)
{
poGeom->assignSpatialReference(GetSpatialRef());
poFeature->SetGeometry(poGeom);
}
}
OGRGeometry* poGeom = poFeature->GetGeometryRef();
if( !bGeomTypeMixed && poGeom != NULL )
{
if (!bGeomTypeSet)
{
bGeomTypeSet = TRUE;
GetLayerDefn()->SetGeomType(poGeom->getGeometryType());
}
else if (GetLayerDefn()->GetGeomType() != poGeom->getGeometryType())
{
bGeomTypeMixed = TRUE;
GetLayerDefn()->SetGeomType(wkbUnknown);
}
}
ICreateFeature(poFeature);
//.........这里部分代码省略.........
示例5: OGRFeature
OGRFeature *OGRPCIDSKLayer::GetFeature( long nFID )
{
/* -------------------------------------------------------------------- */
/* Create the OGR feature. */
/* -------------------------------------------------------------------- */
OGRFeature *poFeature;
poFeature = new OGRFeature( poFeatureDefn );
poFeature->SetFID( (int) nFID );
/* -------------------------------------------------------------------- */
/* Set attributes for any indicated attribute records. */
/* -------------------------------------------------------------------- */
try {
std::vector<PCIDSK::ShapeField> aoFields;
unsigned int i;
poVecSeg->GetFields( (int) nFID, aoFields );
for( i=0; i < aoFields.size(); i++ )
{
if( (int) i == iRingStartField )
continue;
switch( aoFields[i].GetType() )
{
case PCIDSK::FieldTypeNone:
// null field value.
break;
case PCIDSK::FieldTypeInteger:
poFeature->SetField( i, aoFields[i].GetValueInteger() );
break;
case PCIDSK::FieldTypeFloat:
poFeature->SetField( i, aoFields[i].GetValueFloat() );
break;
case PCIDSK::FieldTypeDouble:
poFeature->SetField( i, aoFields[i].GetValueDouble() );
break;
case PCIDSK::FieldTypeString:
poFeature->SetField( i, aoFields[i].GetValueString().c_str() );
break;
case PCIDSK::FieldTypeCountedInt:
std::vector<PCIDSK::int32> list = aoFields[i].GetValueCountedInt();
poFeature->SetField( i, list.size(), &(list[0]) );
break;
}
}
/* -------------------------------------------------------------------- */
/* Translate the geometry. */
/* -------------------------------------------------------------------- */
std::vector<PCIDSK::ShapeVertex> aoVertices;
poVecSeg->GetVertices( (int) nFID, aoVertices );
/* -------------------------------------------------------------------- */
/* Point */
/* -------------------------------------------------------------------- */
if( poFeatureDefn->GetGeomType() == wkbPoint25D
|| (wkbFlatten(poFeatureDefn->GetGeomType()) == wkbUnknown
&& aoVertices.size() == 1) )
{
if( aoVertices.size() == 1 )
{
OGRPoint* poPoint =
new OGRPoint( aoVertices[0].x,
aoVertices[0].y,
aoVertices[0].z );
if (poSRS)
poPoint->assignSpatialReference(poSRS);
poFeature->SetGeometryDirectly(poPoint);
}
else
{
// report issue?
}
}
/* -------------------------------------------------------------------- */
/* LineString */
/* -------------------------------------------------------------------- */
else if( poFeatureDefn->GetGeomType() == wkbLineString25D
|| (wkbFlatten(poFeatureDefn->GetGeomType()) == wkbUnknown
&& aoVertices.size() > 1) )
{
// We should likely be applying ringstart to break things into
// a multilinestring in some cases.
if( aoVertices.size() > 1 )
{
OGRLineString *poLS = new OGRLineString();
poLS->setNumPoints( aoVertices.size() );
for( i = 0; i < aoVertices.size(); i++ )
//.........这里部分代码省略.........
示例6: GetExtent
OGRErr OGRLayer::GetExtent(OGREnvelope *psExtent, int bForce )
{
OGRFeature *poFeature;
OGREnvelope oEnv;
GBool bExtentSet = FALSE;
psExtent->MinX = 0.0;
psExtent->MaxX = 0.0;
psExtent->MinY = 0.0;
psExtent->MaxY = 0.0;
/* -------------------------------------------------------------------- */
/* If this layer has a none geometry type, then we can */
/* reasonably assume there are not extents available. */
/* -------------------------------------------------------------------- */
if( GetLayerDefn()->GetGeomType() == wkbNone )
return OGRERR_FAILURE;
/* -------------------------------------------------------------------- */
/* If not forced, we should avoid having to scan all the */
/* features and just return a failure. */
/* -------------------------------------------------------------------- */
if( !bForce )
return OGRERR_FAILURE;
/* -------------------------------------------------------------------- */
/* OK, we hate to do this, but go ahead and read through all */
/* the features to collect geometries and build extents. */
/* -------------------------------------------------------------------- */
ResetReading();
while( (poFeature = GetNextFeature()) != NULL )
{
OGRGeometry *poGeom = poFeature->GetGeometryRef();
if (poGeom == NULL || poGeom->IsEmpty())
{
/* Do nothing */
}
else if (!bExtentSet)
{
poGeom->getEnvelope(psExtent);
bExtentSet = TRUE;
}
else
{
poGeom->getEnvelope(&oEnv);
if (oEnv.MinX < psExtent->MinX)
psExtent->MinX = oEnv.MinX;
if (oEnv.MinY < psExtent->MinY)
psExtent->MinY = oEnv.MinY;
if (oEnv.MaxX > psExtent->MaxX)
psExtent->MaxX = oEnv.MaxX;
if (oEnv.MaxY > psExtent->MaxY)
psExtent->MaxY = oEnv.MaxY;
}
delete poFeature;
}
ResetReading();
return (bExtentSet ? OGRERR_NONE : OGRERR_FAILURE);
}
示例7: AVCE00ReadOpenE00
OGRFeature *OGRAVCE00Layer::GetFeature( long nFID )
{
/* -------------------------------------------------------------------- */
/* If we haven't started yet, open the file now. */
/* -------------------------------------------------------------------- */
if( psRead == NULL )
{
psRead = AVCE00ReadOpenE00(psSection->pszFilename);
if (psRead == NULL)
return NULL;
/* advance to the specified line number */
if (AVCE00ReadGotoSectionE00(psRead, psSection, 0) != 0)
return NULL;
nNextFID = 1;
}
/* -------------------------------------------------------------------- */
/* Read the raw feature - the -3 fid is a special flag */
/* indicating serial access. */
/* -------------------------------------------------------------------- */
void *pFeature;
if( nFID == -3 )
{
while( (pFeature = AVCE00ReadNextObjectE00(psRead)) != NULL
&& psRead->hParseInfo->eFileType != AVCFileUnknown
&& !MatchesSpatialFilter( pFeature ) )
{
nNextFID++;
}
}
else
{
bNeedReset = TRUE;
if (nNextFID > nFID)
{
/* advance to the specified line number */
if (AVCE00ReadGotoSectionE00(psRead, psSection, 0) != 0)
return NULL;
}
do
{
pFeature = AVCE00ReadNextObjectE00(psRead);
++nNextFID;
}
while (NULL != pFeature && nNextFID <= nFID);
}
if( pFeature == NULL )
return NULL;
/* -------------------------------------------------------------------- */
/* Translate the feature. */
/* -------------------------------------------------------------------- */
OGRFeature *poFeature;
poFeature = TranslateFeature( pFeature );
if( poFeature == NULL )
return NULL;
/* -------------------------------------------------------------------- */
/* LAB's we have to assign the FID to directly, since it */
/* doesn't seem to be stored in the file structure. */
/* -------------------------------------------------------------------- */
if( psSection->eType == AVCFileLAB )
{
if( nFID == -3 )
poFeature->SetFID( nNextFID++ );
else
poFeature->SetFID( nFID );
}
/* -------------------------------------------------------------------- */
/* If this is a polygon layer, try to assemble the arcs to form */
/* the whole polygon geometry. */
/* -------------------------------------------------------------------- */
if( psSection->eType == AVCFilePAL
|| psSection->eType == AVCFileRPL )
{
FormPolygonGeometry( poFeature, (AVCPal *) pFeature );
}
/* -------------------------------------------------------------------- */
/* If we have an attribute table, append the attributes now. */
/* -------------------------------------------------------------------- */
AppendTableFields( poFeature );
return poFeature;
}
示例8: while
OGRFeature *OGRAeronavFAARouteLayer::GetNextRawFeature()
{
OGRFeature* poFeature = nullptr;
OGRLineString* poLS = nullptr;
while( true )
{
const char* pszLine = nullptr;
if (!osLastReadLine.empty())
pszLine = osLastReadLine.c_str();
else
pszLine = CPLReadLine2L(fpAeronavFAA, 87, nullptr);
osLastReadLine = "";
if (pszLine == nullptr)
{
bEOF = true;
break;
}
if (strlen(pszLine) != 85)
continue;
if (bIsDPOrSTARS && STARTS_WITH(pszLine, "===") && pszLine[3] != '=')
{
osAPTName = pszLine + 3;
const char* pszComma = strchr(pszLine + 3, ',');
if (pszComma)
{
osAPTName.resize(pszComma - (pszLine + 3));
osStateName = pszComma + 2;
const char* pszEqual = strchr(pszComma + 2, '=');
if (pszEqual)
osStateName.resize(pszEqual - (pszComma + 2));
}
else
{
const char* pszEqual = strchr(pszLine + 3, '=');
if (pszEqual)
osAPTName.resize(pszEqual - (pszLine + 3));
osStateName = "";
}
}
if (STARTS_WITH(pszLine + 2, "FACILITY OR"))
continue;
if (STARTS_WITH(pszLine + 2, "INTERSECTION"))
continue;
if (strcmp(pszLine, "================================DELETIONS LIST=================================198326") == 0)
{
bEOF = true;
break;
}
if (poFeature == nullptr)
{
if (pszLine[2] == ' ' || pszLine[2] == '-' )
{
continue;
}
if (STARTS_WITH(pszLine + 29, " ") ||
strchr(pszLine, '(') != nullptr)
{
CPLString osName = pszLine + 2;
osName.resize(60);
while(!osName.empty() && osName.back() == ' ')
{
osName.resize(osName.size()-1);
}
if (strcmp(osName.c_str(), "(DELETIONS LIST)") == 0)
{
bEOF = true;
return nullptr;
}
poFeature = new OGRFeature(poFeatureDefn);
poFeature->SetFID(nNextFID ++);
if (bIsDPOrSTARS)
{
poFeature->SetField(0, osAPTName);
poFeature->SetField(1, osStateName);
poFeature->SetField(2, osName);
}
else
poFeature->SetField(0, osName);
poLS = new OGRLineString();
}
continue;
}
if (STARTS_WITH(pszLine, " 0"))
{
if (poLS->getNumPoints() == 0)
continue;
else
break;
}
//.........这里部分代码省略.........
示例9: if
// This function does NOT work for now
bool GdaCache::CacheLayer(std::string ext_ds_name,
OGRLayerProxy* ext_layer_proxy)
{
OGRLayer* poSrcLayer = ext_layer_proxy->layer;
// get information from current layer: geomtype, layer_name
// (NOTE: we don't consider coodinator system and translation here)
OGRFeatureDefn *poSrcFDefn = poSrcLayer->GetLayerDefn();
int eGType = poSrcFDefn->GetGeomType();
const char* pszNewLayerName = poSrcLayer->GetName();
int bForceToPolygon = FALSE;
int bForceToMultiPolygon = FALSE;
int bForceToMultiLineString = FALSE;
if( wkbFlatten(eGType) == wkbPolygon )
bForceToPolygon = TRUE;
else if( wkbFlatten(eGType) == wkbMultiPolygon )
bForceToMultiPolygon = TRUE;
else if( wkbFlatten(eGType) == wkbMultiLineString )
bForceToMultiLineString = TRUE;
//Setup coordinate transformation if we need it.
OGRCoordinateTransformation *poCT = NULL;
bool bTransform = FALSE;
OGRSpatialReference *poSourceSRS = NULL;
// todo
OGRSpatialReference *poOutputSRS = new OGRSpatialReference("EPSG:4326");
// Cache
char *papszLCO[] = {"OVERWRITE=yes","FORMAT=Spatialite"};
std::string cache_layer_name = ext_ds_name + "_"+ext_layer_proxy->name;
GDALDataset *poDstDS = cach_ds_proxy->ds;
OGRLayer *poDstLayer = poDstDS->CreateLayer(cache_layer_name.c_str(),
poOutputSRS,
(OGRwkbGeometryType)eGType,
papszLCO);
if (poDstLayer == NULL) {
// raise create cache failed.
return false;
}
// Process Layer style table
poDstLayer->SetStyleTable( poSrcLayer->GetStyleTable () );
// Add fields. here to copy all field.
int nSrcFieldCount = poSrcFDefn->GetFieldCount();
int iField;
OGRFeatureDefn *poDstFDefn = poDstLayer->GetLayerDefn();
for( iField = 0; iField < nSrcFieldCount; iField++ )
{
OGRFieldDefn* poSrcFieldDefn = poSrcFDefn->GetFieldDefn(iField);
OGRFieldDefn oFieldDefn( poSrcFieldDefn );
// The field may have been already created at layer creation
if (poDstLayer->CreateField( &oFieldDefn ) == OGRERR_NONE)
{
// now that we've created a field, GetLayerDefn() won't return NULL
if (poDstFDefn == NULL)
poDstFDefn = poDstLayer->GetLayerDefn();
}
}
// Transfer feature from Source Layer to Dest Layer
OGRFeature *poFeature;
GIntBig nFeaturesWritten = 0;
poSrcLayer->ResetReading();
while (poFeature = poSrcLayer->GetNextFeature())
{
OGRFeature *poDstFeature = OGRFeature::CreateFeature(
poDstLayer->GetLayerDefn() );
poDstFeature->SetFrom(poFeature);
OGRGeometry *poDstGeometry = poDstFeature->GetGeometryRef();
if (poDstGeometry != NULL)
{
if( bForceToPolygon )
{
poDstFeature->SetGeometryDirectly(
OGRGeometryFactory::forceToPolygon(
poDstFeature->StealGeometry()));
}
else if( bForceToMultiPolygon )
{
poDstFeature->SetGeometryDirectly(
OGRGeometryFactory::forceToMultiPolygon(
poDstFeature->StealGeometry() ) );
}
else if ( bForceToMultiLineString )
{
poDstFeature->SetGeometryDirectly(
OGRGeometryFactory::forceToMultiLineString(
poDstFeature->StealGeometry() ) );
}
}
if( poDstLayer->CreateFeature( poDstFeature ) == OGRERR_NONE )
{
nFeaturesWritten ++;
}
//.........这里部分代码省略.........
示例10: switch
boost::optional<mapnik::datasource::geometry_t> ogr_datasource::get_geometry_type() const
{
boost::optional<mapnik::datasource::geometry_t> result;
if (dataset_ && layer_.is_valid())
{
OGRLayer* layer = layer_.layer();
// NOTE: wkbFlatten macro in ogr flattens 2.5d types into base 2d type
#if GDAL_VERSION_NUM < 1800
switch (wkbFlatten(layer->GetLayerDefn()->GetGeomType()))
#else
switch (wkbFlatten(layer->GetGeomType()))
#endif
{
case wkbPoint:
case wkbMultiPoint:
result.reset(mapnik::datasource::Point);
break;
case wkbLinearRing:
case wkbLineString:
case wkbMultiLineString:
result.reset(mapnik::datasource::LineString);
break;
case wkbPolygon:
case wkbMultiPolygon:
result.reset(mapnik::datasource::Polygon);
break;
case wkbGeometryCollection:
result.reset(mapnik::datasource::Collection);
break;
case wkbNone:
case wkbUnknown:
{
// fallback to inspecting first actual geometry
// TODO - csv and shapefile inspect first 4 features
if (dataset_ && layer_.is_valid())
{
layer = layer_.layer();
// only new either reset of setNext
//layer->ResetReading();
layer->SetNextByIndex(0);
OGRFeature *poFeature;
while ((poFeature = layer->GetNextFeature()) != NULL)
{
OGRGeometry* geom = poFeature->GetGeometryRef();
if (geom && ! geom->IsEmpty())
{
switch (wkbFlatten(geom->getGeometryType()))
{
case wkbPoint:
case wkbMultiPoint:
result.reset(mapnik::datasource::Point);
break;
case wkbLinearRing:
case wkbLineString:
case wkbMultiLineString:
result.reset(mapnik::datasource::LineString);
break;
case wkbPolygon:
case wkbMultiPolygon:
result.reset(mapnik::datasource::Polygon);
break;
case wkbGeometryCollection:
result.reset(mapnik::datasource::Collection);
break;
default:
break;
}
}
OGRFeature::DestroyFeature( poFeature );
break;
}
}
break;
}
default:
break;
}
}
return result;
}
示例11: CPL_TO_BOOL
int OGRCARTODataSource::Open( const char * pszFilename,
char** papszOpenOptionsIn,
int bUpdateIn )
{
bReadWrite = CPL_TO_BOOL(bUpdateIn);
bBatchInsert = CPLTestBool(
CSLFetchNameValueDef(papszOpenOptionsIn, "BATCH_INSERT", "YES"));
pszName = CPLStrdup( pszFilename );
if( CSLFetchNameValue(papszOpenOptionsIn, "ACCOUNT") )
pszAccount = CPLStrdup(CSLFetchNameValue(papszOpenOptionsIn, "ACCOUNT"));
else
{
if( STARTS_WITH_CI(pszFilename, "CARTODB:") )
pszAccount = CPLStrdup(pszFilename + strlen("CARTODB:"));
else
pszAccount = CPLStrdup(pszFilename + strlen("CARTO:"));
char* pchSpace = strchr(pszAccount, ' ');
if( pchSpace )
*pchSpace = '\0';
if( pszAccount[0] == 0 )
{
CPLError(CE_Failure, CPLE_AppDefined, "Missing account name");
return FALSE;
}
}
osAPIKey = CSLFetchNameValueDef(
papszOpenOptionsIn, "API_KEY",
CPLGetConfigOption("CARTO_API_KEY",
CPLGetConfigOption("CARTODB_API_KEY", "")));
CPLString osTables = OGRCARTOGetOptionValue(pszFilename, "tables");
/*if( osTables.size() == 0 && osAPIKey.size() == 0 )
{
CPLError(CE_Failure, CPLE_AppDefined,
"When not specifying tables option, CARTO_API_KEY must be defined");
return FALSE;
}*/
bUseHTTPS = CPLTestBool(
CPLGetConfigOption("CARTO_HTTPS",
CPLGetConfigOption("CARTODB_HTTPS", "YES")));
OGRLayer* poSchemaLayer = ExecuteSQLInternal("SELECT current_schema()");
if( poSchemaLayer )
{
OGRFeature* poFeat = poSchemaLayer->GetNextFeature();
if( poFeat )
{
if( poFeat->GetFieldCount() == 1 )
{
osCurrentSchema = poFeat->GetFieldAsString(0);
}
delete poFeat;
}
ReleaseResultSet(poSchemaLayer);
}
if( osCurrentSchema.size() == 0 )
return FALSE;
/* -------------------------------------------------------------------- */
/* Find out PostGIS version */
/* -------------------------------------------------------------------- */
if( bReadWrite )
{
OGRLayer* poPostGISVersionLayer = ExecuteSQLInternal("SELECT postgis_version()");
if( poPostGISVersionLayer )
{
OGRFeature* poFeat = poPostGISVersionLayer->GetNextFeature();
if( poFeat )
{
if( poFeat->GetFieldCount() == 1 )
{
const char* pszVersion = poFeat->GetFieldAsString(0);
nPostGISMajor = atoi(pszVersion);
const char* pszDot = strchr(pszVersion, '.');
nPostGISMinor = 0;
if( pszDot )
nPostGISMinor = atoi(pszDot + 1);
}
delete poFeat;
}
ReleaseResultSet(poPostGISVersionLayer);
}
}
if( osAPIKey.size() && bUpdateIn )
{
ExecuteSQLInternal(
"DROP FUNCTION IF EXISTS ogr_table_metadata(TEXT,TEXT); "
"CREATE OR REPLACE FUNCTION ogr_table_metadata(schema_name TEXT, table_name TEXT) RETURNS TABLE "
"(attname TEXT, typname TEXT, attlen INT, format_type TEXT, "
"attnum INT, attnotnull BOOLEAN, indisprimary BOOLEAN, "
"defaultexpr TEXT, dim INT, srid INT, geomtyp TEXT, srtext TEXT) AS $$ "
"SELECT a.attname::text, t.typname::text, a.attlen::int, "
"format_type(a.atttypid,a.atttypmod)::text, "
"a.attnum::int, "
//.........这里部分代码省略.........
示例12: GDALAllRegister
bool Shape::load(const std::string& filename) {
GDALAllRegister();
GDALDataset* poDS;
poDS = (GDALDataset*)GDALOpenEx(filename.c_str(), GDAL_OF_VECTOR, NULL, NULL, NULL);
if (poDS == NULL) return false;
// 初期化
shapeObjects.clear();
minBound.x = std::numeric_limits<float>::max();
minBound.y = std::numeric_limits<float>::max();
minBound.z = std::numeric_limits<float>::max();
maxBound.x = -std::numeric_limits<float>::max();
maxBound.y = -std::numeric_limits<float>::max();
maxBound.z = -std::numeric_limits<float>::max();
int nLayers = poDS->GetLayerCount();
int i = 0;
for (int n = 0; n < nLayers; ++n) {
OGRLayer* poLayer = poDS->GetLayer(n);
shapeType = poLayer->GetGeomType();
shapeObjects.resize(shapeObjects.size() + poLayer->GetFeatureCount());
OGRFeature* poFeature;
poLayer->ResetReading();
while ((poFeature = poLayer->GetNextFeature()) != NULL) {
// 属性の名前を読み込む
std::vector<std::string> fieldNames;
for (int j = 0; j < poFeature->GetFieldCount(); ++j) {
OGRFieldDefn* poFieldDefn = poFeature->GetFieldDefnRef(j);
fieldNames.push_back(poFieldDefn->GetNameRef());
}
// 属性の値を読み込む
OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
for (int j = 0; j < poFDefn->GetFieldCount(); ++j) {
OGRFieldDefn* poFieldDefn = poFDefn->GetFieldDefn(j);
if (poFieldDefn->GetType() == OFTInteger) {
shapeObjects[i].attributes[fieldNames[j]] = Variant(poFeature->GetFieldAsInteger(j));
}
else if (poFieldDefn->GetType() == OFTInteger64) {
shapeObjects[i].attributes[fieldNames[j]] = Variant(poFeature->GetFieldAsInteger(j));
}
else if (poFieldDefn->GetType() == OFTReal) {
shapeObjects[i].attributes[fieldNames[j]] = Variant(poFeature->GetFieldAsDouble(j));
}
else if (poFieldDefn->GetType() == OFTString) {
shapeObjects[i].attributes[fieldNames[j]] = Variant(poFeature->GetFieldAsString(j));
}
else {
shapeObjects[i].attributes[fieldNames[j]] = Variant(poFeature->GetFieldAsString(j));
}
}
// このshapeのベクトルデータを読み込む
OGRGeometry* poGeometry = poFeature->GetGeometryRef();
if (poGeometry != NULL) {
if (wkbFlatten(poGeometry->getGeometryType()) == wkbPoint) {
shapeObjects[i].parts.resize(1);
shapeObjects[i].parts[0].points.resize(1);
OGRPoint* poPoint = (OGRPoint*)poGeometry;
shapeObjects[i].parts[0].points[0].x = poPoint->getX();
shapeObjects[i].parts[0].points[0].y = poPoint->getY();
updateBounds(poPoint);
}
else if (wkbFlatten(poGeometry->getGeometryType()) == wkbLineString) {
OGRLineString* poLineString = (OGRLineString*)poGeometry;
readLineString(poLineString, shapeObjects[i]);
}
else if (wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon) {
OGRPolygon* poPolygon = (OGRPolygon*)poGeometry;
readPolygon(poPolygon, shapeObjects[i]);
}
else if (wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPolygon) {
OGRMultiPolygon* poMultiPolygon = (OGRMultiPolygon*)poGeometry;
readMultiPolygon(poMultiPolygon, shapeObjects[i]);
}
else {
// not supported
}
}
// shapeObjectsのインデックスをインクリメント
i++;
// OGRが取得したメモリを開放
OGRFeature::DestroyFeature(poFeature);
}
}
GDALClose(poDS);
return true;
}
示例13: while
OGRFeature *OGROpenAirLayer::GetNextRawFeature()
{
const char* pszLine;
CPLString osCLASS, osNAME, osFLOOR, osCEILING;
OGRLinearRing oLR;
double dfLastLat = 0, dfLastLon = 0;
int bFirst = TRUE;
int bClockWise = TRUE;
double dfCenterLat = 0, dfCenterLon = 0;
int bHasCenter = FALSE;
OpenAirStyle sStyle;
sStyle.penStyle = -1;
sStyle.penWidth = -1;
sStyle.penR = sStyle.penG = sStyle.penB = -1;
sStyle.fillR = sStyle.fillG = sStyle.fillB = -1;
if (bEOF)
return NULL;
while(TRUE)
{
if (bFirst && bHasLastLine)
{
pszLine = osLastLine.c_str();
bFirst = FALSE;
}
else
{
pszLine = CPLReadLine2L(fpOpenAir, 1024, NULL);
if (pszLine == NULL)
{
bEOF = TRUE;
if (oLR.getNumPoints() == 0)
return NULL;
if (osCLASS.size() != 0 &&
oStyleMap.find(osCLASS) != oStyleMap.end())
{
memcpy(&sStyle, oStyleMap[osCLASS], sizeof(sStyle));
}
break;
}
osLastLine = pszLine;
bHasLastLine = TRUE;
}
if (pszLine[0] == '*' || pszLine[0] == '\0')
continue;
if (EQUALN(pszLine, "AC ", 3) || EQUALN(pszLine, "AC,", 3))
{
if (osCLASS.size() != 0)
{
if (sStyle.penStyle != -1 || sStyle.fillR != -1)
{
if (oLR.getNumPoints() == 0)
{
OpenAirStyle* psStyle;
if (oStyleMap.find(osCLASS) == oStyleMap.end())
{
psStyle = (OpenAirStyle*)CPLMalloc(
sizeof(OpenAirStyle));
oStyleMap[osCLASS] = psStyle;
}
else
psStyle = oStyleMap[osCLASS];
memcpy(psStyle, &sStyle, sizeof(sStyle));
}
else
break;
}
else if (oStyleMap.find(osCLASS) != oStyleMap.end())
{
memcpy(&sStyle, oStyleMap[osCLASS], sizeof(sStyle));
break;
}
else
break;
}
sStyle.penStyle = -1;
sStyle.penWidth = -1;
sStyle.penR = sStyle.penG = sStyle.penB = -1;
sStyle.fillR = sStyle.fillG = sStyle.fillB = -1;
osCLASS = pszLine + 3;
bClockWise = TRUE;
bHasCenter = FALSE;
}
else if (EQUALN(pszLine, "AN ", 3))
{
if (osNAME.size() != 0)
break;
osNAME = pszLine + 3;
}
else if (EQUALN(pszLine, "AH ", 3))
osCEILING = pszLine + 3;
else if (EQUALN(pszLine, "AL ", 3))
osFLOOR = pszLine + 3;
else if (EQUALN(pszLine, "AT ", 3))
{
/* Ignored for that layer*/
//.........这里部分代码省略.........
示例14: OGRFeature
OGRFeature *OGRWalkLayer::GetNextRawFeature()
{
if( GetStatement() == nullptr )
return nullptr;
/* -------------------------------------------------------------------- */
/* If we are marked to restart then do so, and fetch a record. */
/* -------------------------------------------------------------------- */
if( !poStmt->Fetch() )
{
delete poStmt;
poStmt = nullptr;
return nullptr;
}
/* -------------------------------------------------------------------- */
/* Create a feature from the current result. */
/* -------------------------------------------------------------------- */
OGRFeature *poFeature = new OGRFeature( poFeatureDefn );
if( pszFIDColumn != nullptr && poStmt->GetColId(pszFIDColumn) > -1 )
poFeature->SetFID(
atoi(poStmt->GetColData(poStmt->GetColId(pszFIDColumn))) );
else
poFeature->SetFID( iNextShapeId );
iNextShapeId++;
m_nFeaturesRead++;
/* -------------------------------------------------------------------- */
/* Set the fields. */
/* -------------------------------------------------------------------- */
for( int iField = 0; iField < poFeatureDefn->GetFieldCount(); iField++ )
{
int iSrcField = panFieldOrdinals[iField]-1;
const char *pszValue = poStmt->GetColData( iSrcField );
if( pszValue == nullptr )
poFeature->SetFieldNull( iField );
else if( poFeature->GetFieldDefnRef(iField)->GetType() == OFTBinary )
poFeature->SetField( iField,
poStmt->GetColDataLength(iSrcField),
(GByte *) pszValue );
else
poFeature->SetField( iField, pszValue );
}
/* -------------------------------------------------------------------- */
/* Try to extract a geometry. */
/* -------------------------------------------------------------------- */
if( pszGeomColumn != nullptr )
{
int iField = poStmt->GetColId( pszGeomColumn );
const char *pszGeomBin = poStmt->GetColData( iField );
int nGeomLength = poStmt->GetColDataLength( iField );
OGRGeometry *poGeom = nullptr;
OGRErr eErr = OGRERR_NONE;
if( pszGeomBin != nullptr && bGeomColumnWKB )
{
WKBGeometry *WalkGeom = (WKBGeometry *)CPLMalloc(sizeof(WKBGeometry));
if( Binary2WkbGeom((unsigned char *)pszGeomBin, WalkGeom, nGeomLength)
!= OGRERR_NONE )
{
CPLFree(WalkGeom);
return nullptr;
}
eErr = TranslateWalkGeom(&poGeom, WalkGeom);
DeleteWKBGeometry(*WalkGeom);
CPLFree(WalkGeom);
}
if ( eErr != OGRERR_NONE )
{
const char *pszMessage = nullptr;
switch ( eErr )
{
case OGRERR_NOT_ENOUGH_DATA:
pszMessage = "Not enough data to deserialize";
break;
case OGRERR_UNSUPPORTED_GEOMETRY_TYPE:
pszMessage = "Unsupported geometry type";
break;
case OGRERR_CORRUPT_DATA:
pszMessage = "Corrupt data";
break;
default:
pszMessage = "Unrecognized error";
}
CPLError(CE_Failure, CPLE_AppDefined,
"GetNextRawFeature(): %s", pszMessage);
}
if( poGeom != nullptr && eErr == OGRERR_NONE )
{
poGeom->assignSpatialReference( poSRS );
poFeature->SetGeometryDirectly( poGeom );
//.........这里部分代码省略.........
示例15: ResetReading
OGRFeature *OGRNASLayer::GetNextFeature()
{
GMLFeature *poNASFeature = NULL;
OGRGeometry *poGeom = NULL;
if( iNextNASId == 0 )
ResetReading();
/* ==================================================================== */
/* Loop till we find and translate a feature meeting all our */
/* requirements. */
/* ==================================================================== */
while( TRUE )
{
/* -------------------------------------------------------------------- */
/* Cleanup last feature, and get a new raw nas feature. */
/* -------------------------------------------------------------------- */
delete poNASFeature;
delete poGeom;
poNASFeature = NULL;
poGeom = NULL;
poNASFeature = poDS->GetReader()->NextFeature();
if( poNASFeature == NULL )
return NULL;
/* -------------------------------------------------------------------- */
/* Is it of the proper feature class? */
/* -------------------------------------------------------------------- */
// We count reading low level NAS features as a feature read for
// work checking purposes, though at least we didn't necessary
// have to turn it into an OGRFeature.
m_nFeaturesRead++;
if( poNASFeature->GetClass() != poFClass )
continue;
iNextNASId++;
/* -------------------------------------------------------------------- */
/* Does it satisfy the spatial query, if there is one? */
/* -------------------------------------------------------------------- */
const CPLXMLNode* const * papsGeometry = poNASFeature->GetGeometryList();
if (papsGeometry[0] != NULL)
{
poGeom = (OGRGeometry*) OGR_G_CreateFromGMLTree(papsGeometry[0]);
if( EQUAL( papsGeometry[0]->pszValue, "CompositeCurve" ) ||
EQUAL( papsGeometry[0]->pszValue, "MultiCurve" ) ||
EQUAL( papsGeometry[0]->pszValue, "LineString" ) ||
EQUAL( papsGeometry[0]->pszValue, "MultiLineString" ) ||
EQUAL( papsGeometry[0]->pszValue, "Curve" ) )
{
poGeom = OGRGeometryFactory::forceToLineString( poGeom, false );
}
// poGeom->dumpReadable( 0, "NAS: " );
// We assume the OGR_G_CreateFromGMLTree() function would have already
// reported an error.
if( poGeom == NULL )
{
delete poNASFeature;
return NULL;
}
if( m_poFilterGeom != NULL && !FilterGeometry( poGeom ) )
continue;
}
/* -------------------------------------------------------------------- */
/* Convert the whole feature into an OGRFeature. */
/* -------------------------------------------------------------------- */
int iField;
OGRFeature *poOGRFeature = new OGRFeature( GetLayerDefn() );
poOGRFeature->SetFID( iNextNASId );
for( iField = 0; iField < poFClass->GetPropertyCount(); iField++ )
{
const GMLProperty *psGMLProperty = poNASFeature->GetProperty( iField );
if( psGMLProperty == NULL || psGMLProperty->nSubProperties == 0 )
continue;
switch( poFClass->GetProperty(iField)->GetType() )
{
case GMLPT_Real:
{
poOGRFeature->SetField( iField, CPLAtof(psGMLProperty->papszSubProperties[0]) );
}
break;
case GMLPT_IntegerList:
{
int nCount = psGMLProperty->nSubProperties;
int *panIntList = (int *) CPLMalloc(sizeof(int) * nCount );
int i;
//.........这里部分代码省略.........