99import java .io .IOException ;
1010import java .io .PrintStream ;
1111import java .io .PrintWriter ;
12+ import java .util .Arrays ;
1213import java .util .HashMap ;
1314import java .util .Iterator ;
1415import java .util .List ;
1516import java .util .Map ;
1617import java .util .Map .Entry ;
1718
18- import org .json .JSONArray ;
19- import org .json .JSONObject ;
19+ import org .apache .commons .lang .ArrayUtils ;
20+ import org .jglue .fluentjson .JsonBuilder ;
21+ import org .jglue .fluentjson .JsonBuilderFactory ;
22+ import org .jglue .fluentjson .JsonObjectBuilder ;
23+ import org .jglue .fluentjson .Mapper ;
2024import org .osm2world .core .GlobalValues ;
2125import org .osm2world .core .map_data .creation .LatLon ;
2226import org .osm2world .core .map_data .creation .MapProjection ;
3337import org .osm2world .core .target .common .rendering .Camera ;
3438import org .osm2world .core .target .common .rendering .Projection ;
3539
40+ import com .google .gson .JsonArray ;
41+ import com .google .gson .JsonObject ;
42+
3643/**
3744 * utility class for creating an Wavefront OBJ file
3845 */
@@ -45,6 +52,13 @@ private static final class TiledObjTargetProvider implements TargetProvider<Rend
4552 private File tilesFolder ;
4653 private MapProjection mapProjection ;
4754
55+ private static final class DoubleJsonArrayMapper implements Mapper <Double > {
56+ @ Override
57+ public JsonBuilder map (Double arg0 ) {
58+ return JsonBuilderFactory .buildPrimitive (arg0 );
59+ }
60+ }
61+
4862 private static final class TargetAndStream {
4963 ObjTarget target ;
5064 AxisAlignedBoundingBoxXZ boundingVolume ;
@@ -182,8 +196,7 @@ public void close() {
182196 double minY = 0 ;
183197 double maxY = 0 ;
184198
185- JSONObject tileset = new JSONObject ();
186- JSONArray children = new JSONArray ();
199+ JsonArray children = new JsonArray ();
187200
188201 for (Entry <String , TargetAndStream > entry : this .tile2Target .entrySet ()) {
189202 TargetAndStream t = entry .getValue ();
@@ -198,12 +211,13 @@ public void close() {
198211 }
199212
200213 if (generateMeta ) {
201- writeTileset (fullBBOX , minY , maxY , tileset , children );
214+ writeTileset (fullBBOX , minY , maxY , children );
202215 }
203216 }
204217
205- private void writeTileset (AxisAlignedBoundingBoxXZ fullBBOX , double minY , double maxY ,
206- JSONObject tileset , JSONArray children ) {
218+ private void writeTileset (AxisAlignedBoundingBoxXZ fullBBOX ,
219+ double minY , double maxY , JsonArray children ) {
220+
207221 File tilesetFile = new File (this .tilesetPath );
208222
209223 File metaFile = new File (this .tilesFolder .getPath () +
@@ -213,29 +227,36 @@ private void writeTileset(AxisAlignedBoundingBoxXZ fullBBOX, double minY, double
213227 metaFile = tilesetFile ;
214228 }
215229
216- tileset .put ("asset" , new JSONObject ().put ("version" , "0.0" ));
217-
218- JSONObject rootJson = new JSONObject ().put (
219- "boundingVolume" , new JSONObject ().put (
220- "region" , encodeRegion (minY , maxY , fullBBOX )));
221-
222230 LatLon origin = this .mapProjection .getOrigin ();
223231 VectorXYZ cartesianOrigin = WGS84Util .cartesianFromLatLon (origin , 0.0 );
224232 double [] transform = WGS84Util .eastNorthUpToFixedFrame (cartesianOrigin );
233+
234+ List <Double > regionList = Arrays .asList (ArrayUtils .toObject (encodeRegion (minY , maxY , fullBBOX )));
235+ List <Double > transformList = Arrays .asList (ArrayUtils .toObject (transform ));
236+ double extentDiagonal = (fullBBOX .sizeX () + fullBBOX .sizeZ ()) / 2 ;
225237
226- rootJson .put ("transform" , new JSONArray (transform ));
227-
228- tileset .put ("root" , rootJson );
229- double extentDiagonal = (fullBBOX .sizeX () + fullBBOX .sizeZ ()) / 20 ;
238+ JsonObject tileset = JsonBuilderFactory .buildObject ()
239+ .addObject ("asset" )
240+ .add ("version" , "0.0" )
241+ .end ()
242+ .addObject ("root" )
243+ .addObject ("boundingVolume" )
244+ .addArray ("region" ).addAll (new DoubleJsonArrayMapper (), regionList )
245+ .end ()
246+ .end ()
247+ .addArray ("transform" ).addAll (new DoubleJsonArrayMapper (), transformList )
248+ .end ()
249+ .add ("refine" , "ADD" )
250+ .add ("geometricError" , extentDiagonal )
251+ .end ()
252+ .add ("geometricError" , extentDiagonal )
253+ .getJson ();
230254
231- tileset .put ("geometricError" , extentDiagonal );
232- rootJson .put ("refine" , "add" );
233- rootJson .put ("children" , children );
234- rootJson .put ("geometricError" , extentDiagonal );
255+ tileset .getAsJsonObject ("root" ).add ("children" , children );
235256
236257 try {
237258 PrintWriter metaWriter = new PrintWriter (new FileOutputStream (metaFile ));
238- metaWriter .println (tileset .toString (2 ));
259+ metaWriter .println (tileset .toString ());
239260 metaWriter .flush ();
240261 metaWriter .close ();
241262 }
@@ -244,9 +265,8 @@ private void writeTileset(AxisAlignedBoundingBoxXZ fullBBOX, double minY, double
244265 }
245266 }
246267
247- private AxisAlignedBoundingBoxXZ generateMetaInfoForTile (JSONArray children ,
268+ private AxisAlignedBoundingBoxXZ generateMetaInfoForTile (JsonArray children ,
248269 String tms , TargetAndStream t , AxisAlignedBoundingBoxXZ fullBBOX ) {
249- JSONObject meta = new JSONObject ();
250270
251271 AxisAlignedBoundingBoxXZ tileBBOX =
252272 tile2boundingBox (Integer .valueOf (1 ), Integer .valueOf (2 ), Integer .valueOf (0 ));
@@ -262,20 +282,31 @@ private AxisAlignedBoundingBoxXZ generateMetaInfoForTile(JSONArray children,
262282 fullBBOX = AxisAlignedBoundingBoxXZ .union (union , fullBBOX );
263283 }
264284
265- meta .put ("boundingVolume" , new JSONObject ());
266- meta .getJSONObject ("boundingVolume" ).put ("region" , new JSONArray (region ));
285+ if (t .maxY == 0.0 ) {
286+ // Don't write epty tiles
287+ return fullBBOX ;
288+ }
267289
268- meta . put ( "geometricError" , t . maxY );
290+ List < Double > regionList = Arrays . asList ( ArrayUtils . toObject ( region ) );
269291
270- JSONObject content = new JSONObject ();
271292 double [] contentRegion = encodeRegion (t .minY , t .maxY , t .boundingVolume );
272-
273- content .put ("url" , tms + ".b3dm" );
274- content .put ("boundingVolume" , new JSONObject ());
275- content .getJSONObject ("boundingVolume" ).put ("region" , new JSONArray (contentRegion ));
276-
277- meta .put ("content" , content );
278- children .put (meta );
293+ List <Double > contentRegionList = Arrays .asList (ArrayUtils .toObject (contentRegion ));
294+
295+ JsonObjectBuilder <?,JsonObject > meta = JsonBuilderFactory .buildObject ()
296+ .addObject ("boundingVolume" )
297+ .addArray ("region" ).addAll (new DoubleJsonArrayMapper (), regionList )
298+ .end ()
299+ .end ()
300+ .add ("geometricError" , t .maxY * 8 )
301+ .addObject ("content" )
302+ .add ("url" , tms + ".b3dm" )
303+ .addObject ("boundingVolume" )
304+ .addArray ("region" ).addAll (new DoubleJsonArrayMapper (), contentRegionList )
305+ .end ()
306+ .end ()
307+ .end ();
308+
309+ children .add (meta .getJson ().getAsJsonObject ());
279310
280311 return fullBBOX ;
281312 }
0 commit comments