55
55
OGRGeoJSONDataSource* poDS )
56
56
: iterCurrent_( seqFeatures_.end() ), poDS_( poDS ), poFeatureDefn_(new OGRFeatureDefn( pszName ) ), poSRS_( NULL ), nOutCounter_( 0 )
58
UNREFERENCED_PARAM(papszOptions);
58
bWriteBBOX = CSLTestBoolean(CSLFetchNameValueDef(papszOptions, "WRITE_BBOX", "FALSE"));
60
61
CPLAssert( NULL != poDS_ );
61
62
CPLAssert( NULL != poFeatureDefn_ );
76
79
OGRGeoJSONLayer::~OGRGeoJSONLayer()
78
FILE* fp = poDS_->GetOutputFile();
81
VSILFILE* fp = poDS_->GetOutputFile();
81
VSIFPrintfL( fp, "\n]\n}\n" );
84
VSIFPrintfL( fp, "\n]" );
86
if( bWriteBBOX && sEnvelopeLayer.IsInit() )
88
json_object* poObjBBOX = json_object_new_array();
89
json_object_array_add(poObjBBOX,
90
json_object_new_double_with_precision(sEnvelopeLayer.MinX, nCoordPrecision));
91
json_object_array_add(poObjBBOX,
92
json_object_new_double_with_precision(sEnvelopeLayer.MinY, nCoordPrecision));
94
json_object_array_add(poObjBBOX,
95
json_object_new_double_with_precision(sEnvelopeLayer.MinZ, nCoordPrecision));
96
json_object_array_add(poObjBBOX,
97
json_object_new_double_with_precision(sEnvelopeLayer.MaxX, nCoordPrecision));
98
json_object_array_add(poObjBBOX,
99
json_object_new_double_with_precision(sEnvelopeLayer.MaxY, nCoordPrecision));
101
json_object_array_add(poObjBBOX,
102
json_object_new_double_with_precision(sEnvelopeLayer.MaxZ, nCoordPrecision));
104
const char* pszBBOX = json_object_to_json_string( poObjBBOX );
105
if( poDS_->GetFpOutputIsSeekable() )
107
VSIFSeekL(fp, poDS_->GetBBOXInsertLocation(), SEEK_SET);
108
if (strlen(pszBBOX) + 9 < SPACE_FOR_BBOX)
109
VSIFPrintfL( fp, "\"bbox\": %s,", pszBBOX );
110
VSIFSeekL(fp, 0, SEEK_END);
114
VSIFPrintfL( fp, ",\n\"bbox\": %s", pszBBOX );
117
json_object_put( poObjBBOX );
120
VSIFPrintfL( fp, "\n}\n" );
84
123
std::for_each(seqFeatures_.begin(), seqFeatures_.end(),
215
254
return OGRERR_INVALID_HANDLE;
218
json_object* poObj = OGRGeoJSONWriteFeature( poFeature );
257
json_object* poObj = OGRGeoJSONWriteFeature( poFeature, bWriteBBOX, nCoordPrecision );
219
258
CPLAssert( NULL != poObj );
221
260
if( nOutCounter_ > 0 )
271
OGRGeometry* poGeometry = poFeature->GetGeometryRef();
272
if ( bWriteBBOX && !poGeometry->IsEmpty() )
274
OGREnvelope3D sEnvelope;
275
poGeometry->getEnvelope(&sEnvelope);
277
if( poGeometry->getCoordinateDimension() == 3 )
280
sEnvelopeLayer.Merge(sEnvelope);
232
283
return OGRERR_NONE;
326
377
void OGRGeoJSONLayer::DetectGeometryType()
379
if (poFeatureDefn_->GetGeomType() != wkbUnknown)
328
382
OGRwkbGeometryType featType = wkbUnknown;
329
383
OGRGeometry* poGeometry = NULL;
330
384
FeaturesSeq::const_iterator it = seqFeatures_.begin();