Changeset 13005
- Timestamp:
- 11/24/07 21:11:26 (9 months ago)
- Files:
-
- trunk/gdal/ogr/ogrsf_frmts/geojson/GNUmakefile (modified) (1 diff)
- trunk/gdal/ogr/ogrsf_frmts/geojson/makefile.vc (modified) (1 diff)
- trunk/gdal/ogr/ogrsf_frmts/geojson/ogr_geojson.h (modified) (5 diffs)
- trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsondatasource.cpp (modified) (5 diffs)
- trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonlayer.cpp (modified) (5 diffs)
- trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.cpp (modified) (2 diffs)
- trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.h (modified) (2 diffs)
- trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonutils.cpp (modified) (2 diffs)
- trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonutils.h (modified) (2 diffs)
- trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonwriter.cpp (added)
- trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonwriter.h (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/gdal/ogr/ogrsf_frmts/geojson/GNUmakefile
r12634 r13005 12 12 ogrgeojsonlayer.o \ 13 13 ogrgeojsonutils.o \ 14 ogrgeojsonreader.o 14 ogrgeojsonreader.o \ 15 ogrgeojsonwriter.o 15 16 16 17 CPPFLAGS := -Ijsonc -I.. -I../.. $(GDAL_INCLUDE) $(CPPFLAGS) trunk/gdal/ogr/ogrsf_frmts/geojson/makefile.vc
r12634 r13005 10 10 ogrgeojsonlayer.obj \ 11 11 ogrgeojsonutils.obj \ 12 ogrgeojsonreader.obj 13 12 ogrgeojsonreader.obj \ 13 ogrgeojsonwriter.obj 14 14 15 15 EXTRAFLAGS = -Ijsonc -I.. -I..\.. trunk/gdal/ogr/ogrsf_frmts/geojson/ogr_geojson.h
r12876 r13005 34 34 #include <vector> // used by OGRGeoJSONLayer 35 35 36 class OGRGeoJSONDataSource; 37 36 38 /************************************************************************/ 37 39 /* OGRGeoJSONLayer */ … … 49 51 OGRSpatialReference* poSRS, 50 52 OGRwkbGeometryType eGType, 51 char** papszOptions); 53 char** papszOptions, 54 OGRGeoJSONDataSource* poDS ); 52 55 ~OGRGeoJSONLayer(); 53 56 … … 63 66 OGRFeature* GetFeature( long nFID ); 64 67 OGRErr CreateFeature( OGRFeature* poFeature ); 68 OGRErr CreateField(OGRFieldDefn* poField, int bApproxOK); 65 69 int TestCapability( const char* pszCap ); 66 70 const char* GetFIDColumn(); … … 80 84 FeaturesSeq seqFeatures_; 81 85 FeaturesSeq::iterator iterCurrent_; 86 87 OGRGeoJSONDataSource* poDS_; 82 88 OGRFeatureDefn* poFeatureDefn_; 83 89 OGRSpatialReference* poSRS_; 84 90 CPLString sFIDColumn_; 91 int nOutCounter_; 85 92 }; 86 93 … … 113 120 // 114 121 int Create( const char* pszName, char** papszOptions ); 122 FILE* GetOutputFile() const { return fpOut_; } 115 123 116 124 enum GeometryTranslation trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsondatasource.cpp
r12876 r13005 54 54 { 55 55 Clear(); 56 57 if( NULL != fpOut_ ) 58 { 59 if ( fpOut_ != stdout ) 60 VSIFClose( fpOut_ ); 61 } 56 62 } 57 63 … … 179 185 { 180 186 OGRGeoJSONLayer* poLayer = NULL; 181 poLayer = new OGRGeoJSONLayer( pszName_, poSRS, eGType, papszOptions );187 poLayer = new OGRGeoJSONLayer( pszName_, poSRS, eGType, papszOptions, this ); 182 188 183 189 /* -------------------------------------------------------------------- */ … … 192 198 193 199 papoLayers_[nLayers_++] = poLayer; 200 201 if( NULL != fpOut_ ) 202 { 203 VSIFPrintf( fpOut_, "{\n\"type\": \"FeatureCollection\",\n\"features\": [\n" ); 204 } 194 205 195 206 return poLayer; … … 218 229 /* -------------------------------------------------------------------- */ 219 230 VSIStatBufL sStatBuf; 220 if( VSIStatL( pszName, &sStatBuf ) == 0)231 if( 0 == VSIStatL( pszName, &sStatBuf ) ) 221 232 { 222 233 CPLError( CE_Failure, CPLE_NotSupported, … … 454 465 { 455 466 // TODO: Think about better name selection 456 poLayer = reader.ReadLayer( OGRGeoJSONLayer::DefaultName );467 poLayer = reader.ReadLayer( OGRGeoJSONLayer::DefaultName, this ); 457 468 } 458 469 trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonlayer.cpp
r12876 r13005 28 28 ****************************************************************************/ 29 29 #include "ogr_geojson.h" 30 #include "ogrgeojsonwriter.h" 31 #include <json.h> // JSON-C 30 32 #include <algorithm> // for_each, find_if 31 33 … … 45 47 OGRSpatialReference* poSRSIn, 46 48 OGRwkbGeometryType eGType, 47 char** papszOptions ) 48 : poFeatureDefn_(new OGRFeatureDefn( pszName ) ), 49 poSRS_( NULL ) 50 { 49 char** papszOptions, 50 OGRGeoJSONDataSource* poDS ) 51 : poDS_( poDS ), poFeatureDefn_(new OGRFeatureDefn( pszName ) ), poSRS_( NULL ), nOutCounter_( 0 ) 52 { 53 CPLAssert( NULL != poDS_ ); 51 54 CPLAssert( NULL != poFeatureDefn_ ); 52 55 53 56 poFeatureDefn_->Reference(); 54 57 poFeatureDefn_->SetGeomType( eGType ); … … 66 69 OGRGeoJSONLayer::~OGRGeoJSONLayer() 67 70 { 71 FILE* fp = poDS_->GetOutputFile(); 72 if( NULL != fp ) 73 { 74 VSIFPrintf( fp, "\n]\n}\n" ); 75 } 76 68 77 std::for_each(seqFeatures_.begin(), seqFeatures_.end(), 69 78 OGRFeature::DestroyFeature); … … 234 243 OGRErr OGRGeoJSONLayer::CreateFeature( OGRFeature* poFeature ) 235 244 { 245 FILE* fp = poDS_->GetOutputFile(); 246 if( NULL == poFeature ) 247 { 248 CPLDebug( "GeoJSON", "Target datasource file is invalid." ); 249 return CE_Failure; 250 } 251 236 252 if( NULL == poFeature ) 237 253 { … … 240 256 } 241 257 242 OGRFeature* poNewFeature = NULL; 243 poNewFeature = poFeature->Clone(); 244 seqFeatures_.push_back( poNewFeature ); 258 json_object* poObj = OGRGeoJSONWriteFeature( poFeature ); 259 CPLAssert( NULL != poObj ); 260 261 if( nOutCounter_ > 0 ) 262 { 263 /* Separate "Feature" entries in "FeatureCollection" object. */ 264 VSIFPrintf( fp, ",\n" ); 265 } 266 VSIFPrintf( fp, "%s\n", json_object_to_json_string( poObj ) ); 267 268 json_object_put( poObj ); 269 270 ++nOutCounter_; 271 272 return OGRERR_NONE; 273 } 274 275 OGRErr OGRGeoJSONLayer::CreateField(OGRFieldDefn* poField, int bApproxOK) 276 { 277 for( int i = 0; i < poFeatureDefn_->GetFieldCount(); ++i ) 278 { 279 OGRFieldDefn* poDefn = poFeatureDefn_->GetFieldDefn(i); 280 CPLAssert( NULL != poDefn ); 281 282 if( EQUAL( poDefn->GetNameRef(), poField->GetNameRef() ) ) 283 { 284 CPLDebug( "GeoJSON", "Field '%s' already present in schema", 285 poField->GetNameRef() ); 286 287 // TODO - mloskot: Is this return code correct? 288 return OGRERR_NONE; 289 } 290 } 291 292 poFeatureDefn_->AddFieldDefn( poField ); 245 293 246 294 return OGRERR_NONE; trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.cpp
r12948 r13005 95 95 /************************************************************************/ 96 96 97 OGRGeoJSONLayer* OGRGeoJSONReader::ReadLayer( const char* pszName ) 97 OGRGeoJSONLayer* OGRGeoJSONReader::ReadLayer( const char* pszName, 98 OGRGeoJSONDataSource* poDS ) 98 99 { 99 100 CPLAssert( NULL == poLayer_ ); … … 109 110 poLayer_ = new OGRGeoJSONLayer( pszName, NULL, 110 111 OGRGeoJSONLayer::DefaultGeometryType, 111 NULL );112 NULL, poDS ); 112 113 113 114 if( !GenerateLayerDefn() ) trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.h
r12948 r13005 81 81 /************************************************************************/ 82 82 83 class OGRGeoJSONDataSource; 84 83 85 class OGRGeoJSONReader 84 86 { … … 92 94 93 95 OGRErr Parse( const char* pszText ); 94 OGRGeoJSONLayer* ReadLayer( const char* pszName );96 OGRGeoJSONLayer* ReadLayer( const char* pszName, OGRGeoJSONDataSource* poDS ); 95 97 96 98 private: trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonutils.cpp
r12663 r13005 30 30 #include <cpl_port.h> 31 31 #include <cpl_conv.h> 32 #include <ogr_geometry.h> 32 33 #include <json.h> // JSON-C 33 34 … … 123 124 return OFTString; /* null, object */ 124 125 } 126 127 /************************************************************************/ 128 /* OGRGeoJSONGetGeometryName() */ 129 /************************************************************************/ 130 131 const char* OGRGeoJSONGetGeometryName( OGRGeometry const* poGeometry ) 132 { 133 CPLAssert( NULL != poGeometry ); 134 135 OGRwkbGeometryType eType = poGeometry->getGeometryType(); 136 137 if( wkbPoint == eType ) 138 return "Point"; 139 else if( wkbLineString == eType ) 140 return "LineString"; 141 else if( wkbPolygon == eType ) 142 return "Polygon"; 143 else if( wkbMultiPoint == eType ) 144 return "MultiPoint"; 145 else if( wkbMultiLineString == eType ) 146 return "MultiLineString"; 147 else if( wkbMultiPolygon == eType ) 148 return "MultiPolygon"; 149 else if( wkbGeometryCollection == eType ) 150 return "GeometryCollection"; 151 else 152 return "Unknown"; 153 } trunk/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonutils.h
r12634 r13005 32 32 #include <ogr_core.h> 33 33 #include <json.h> // JSON-C 34 35 class OGRGeometry; 34 36 35 37 /************************************************************************/ … … 87 89 OGRFieldType GeoJSONPropertyToFieldType( json_object* poObject ); 88 90 91 /************************************************************************/ 92 /* OGRGeoJSONGetGeometryName */ 93 /************************************************************************/ 94 95 const char* OGRGeoJSONGetGeometryName( OGRGeometry const* poGeometry ); 96 89 97 #endif /* OGR_GEOJSONUTILS_H_INCLUDED */
