Search code examples
javajsongeojson

Returning a GeoJSON object in java


I am new to GeoJSON and im currently running into an issue that I just don't know how to do it.

Here is a snippet of what my FeatureCollection looks like

        FeatureCollection fc = new FeatureCollection();
        Map<String, Object> properties = new HashMap<String, Object>();
        
        for(int i = 0; i < platforms.size(); i ++) {
            Feature feature = new Feature();
            Point geometry = new Point();
            Dto dto = platforms.get(i);
            Position position = new Position(dto.getLat(), dto.getLon());

            fc.addFeature(feature);
            geometry.setCoordinates(position);
            feature.setGeometry(geometry);
            feature.setProperties(properties);

            properties.put("name", dto.getName());
            properties.put("msl", dto.getMsl());
            properties.put("id", dto.getId());
 
        }
        return fc.toString();

I want my output to look like this:

{
                "type":"FeatureCollection"
                features":[ 
                {
                            "type":"Feature"
                            "geometry": {
                                "type":"Point"
                                "coordinates":[
                                   -120.200000,
                                     10.100000 
                                     ] 
                                  }, 
                                  "properties": {
                                     "name": "1"
                                     "height": "100.00"
                                     "id": "null"
                                  }
                               }
                {
                            "type":"Feature"
                            "geometry": {
                                "type":"Point"
                                "coordinates\":[
                                  -130.200000,
                                     20.100000
                                    ] \n "
                                  }, \n "
                                  "properties": { "
                                     "name": "2"
                                     "height": "100.00"
                                     "id": "null"
                                  } 
                              } 
                            ] 
                 }  

As far as I can tell, through debugging, the correct information is being placed into the feature but whenever I return the featureCollection I get this:

mil.nga.sf.geojson.FeatureCollection@366ac49b

I don't know much about geojson but it seems like I'm incorrectly returning the FeatureCollection and its printing out its name or whatever.

Simply put, how do I print the contents of a FeatureCollection?

EDIT: This is the output that I get after implementing gson.

{
  "features": [
    {
      "feature": {
        "geometry": {
          "x": 10.1,
          "y": -120.2,
          "z": null,
          "m": null,
          "geometryType": "POINT",
          "hasZ": false,
          "hasM": false
        },
        "properties": {
          "msl": 100.0,
          "name": "1",
          "id": null
        }
      },
      "id": null,
      "bbox": null,
      "foreignMembers": {}
    },
    {
      "feature": {
        "geometry": {
          "x": 20.1,
          "y": -130.2,
          "z": null,
          "m": null,
          "geometryType": "POINT",
          "hasZ": false,
          "hasM": false
        },
        "properties": {
          "msl": 100.0,
          "name": "2",
          "id": null
        }
      },
      "id": null,
      "bbox": null,
      "foreignMembers": {}
    }
  ],
  "bbox": null,
  "foreignMembers": {}

I am unsure what to do moving forward to get this to mirror my desired output.


Solution

  • Your problem is that you're calling fc.toString();, which will hit the default Object.toString() method. This will dump some classname+address/id-like String, depending on th JVM used.

    Instead of calling toString(), you should use a JSON library like google gson, and add a few lines to the bottom of your code:

        final GsonBuilder gb = new GsonBuilder();
        gb.setPrettyPrinting();
        gb.serializeNulls();
        // gb.excludeFieldsWithoutExposeAnnotation(); // maybe use for more control
    
        final Gson gson = gb.create();
        final String jsonText = gson.toJson(fc);
        return jsonText;
    

    Also consider writing a utility class that does this for you with default settings that you choose:

    public class MyJsonUtil {
        static public String toJSON(final Object pObject) {
            final GsonBuilder gb = new GsonBuilder();
            gb.setPrettyPrinting();
            gb.serializeNulls();
            // gb.excludeFieldsWithoutExposeAnnotation(); // maybe use for more control
    
            final Gson gson = gb.create();
            final String jsonText = gson.toJson(pObject);
            return jsonText;
        }
    }
    

    and then at the end of your code you simply call return MyJsonUtil.toJSON(fc).