json_object* OGRGeoJSONWriteMultiPoint( OGRMultiPoint* poGeometry, int nCoordPrecision ) { CPLAssert( NULL != poGeometry ); /* Generate "coordinates" object for 2D or 3D dimension. */ json_object* poObj = NULL; poObj = json_object_new_array(); for( int i = 0; i < poGeometry->getNumGeometries(); ++i ) { OGRGeometry* poGeom = poGeometry->getGeometryRef( i ); CPLAssert( NULL != poGeom ); OGRPoint* poPoint = static_cast<OGRPoint*>(poGeom); json_object* poObjPoint = NULL; poObjPoint = OGRGeoJSONWritePoint( poPoint, nCoordPrecision ); if( poObjPoint == NULL ) { json_object_put(poObj); return NULL; } json_object_array_add( poObj, poObjPoint ); } return poObj; }
json_object* OGRGeoJSONWriteGeometry( OGRGeometry* poGeometry, int nCoordPrecision ) { CPLAssert( NULL != poGeometry ); OGRwkbGeometryType eType = poGeometry->getGeometryType(); /* For point empty, return a null geometry. For other empty geometry types, */ /* we will generate an empty coordinate array, which is propably also */ /* borderline. */ if( (wkbPoint == eType || wkbPoint25D == eType) && poGeometry->IsEmpty() ) { return NULL; } json_object* poObj = json_object_new_object(); CPLAssert( NULL != poObj ); /* -------------------------------------------------------------------- */ /* Build "type" member of GeoJSOn "geometry" object. */ /* -------------------------------------------------------------------- */ // XXX - mloskot: workaround hack for pure JSON-C API design. char* pszName = const_cast<char*>(OGRGeoJSONGetGeometryName( poGeometry )); json_object_object_add( poObj, "type", json_object_new_string(pszName) ); /* -------------------------------------------------------------------- */ /* Build "coordinates" member of GeoJSOn "geometry" object. */ /* -------------------------------------------------------------------- */ json_object* poObjGeom = NULL; if( wkbGeometryCollection == eType || wkbGeometryCollection25D == eType ) { poObjGeom = OGRGeoJSONWriteGeometryCollection( static_cast<OGRGeometryCollection*>(poGeometry), nCoordPrecision ); json_object_object_add( poObj, "geometries", poObjGeom); } else { if( wkbPoint == eType || wkbPoint25D == eType ) poObjGeom = OGRGeoJSONWritePoint( static_cast<OGRPoint*>(poGeometry), nCoordPrecision ); else if( wkbLineString == eType || wkbLineString25D == eType ) poObjGeom = OGRGeoJSONWriteLineString( static_cast<OGRLineString*>(poGeometry), nCoordPrecision ); else if( wkbPolygon == eType || wkbPolygon25D == eType ) poObjGeom = OGRGeoJSONWritePolygon( static_cast<OGRPolygon*>(poGeometry), nCoordPrecision ); else if( wkbMultiPoint == eType || wkbMultiPoint25D == eType ) poObjGeom = OGRGeoJSONWriteMultiPoint( static_cast<OGRMultiPoint*>(poGeometry), nCoordPrecision ); else if( wkbMultiLineString == eType || wkbMultiLineString25D == eType ) poObjGeom = OGRGeoJSONWriteMultiLineString( static_cast<OGRMultiLineString*>(poGeometry), nCoordPrecision ); else if( wkbMultiPolygon == eType || wkbMultiPolygon25D == eType ) poObjGeom = OGRGeoJSONWriteMultiPolygon( static_cast<OGRMultiPolygon*>(poGeometry), nCoordPrecision ); else { CPLDebug( "GeoJSON", "Unsupported geometry type detected. " "Feature gets NULL geometry assigned." ); } json_object_object_add( poObj, "coordinates", poObjGeom); } return poObj; }