001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.plugins.streetside.utils.api;
003
004import java.util.Objects;
005
006import javax.json.Json;
007import javax.json.JsonArrayBuilder;
008import javax.json.JsonObjectBuilder;
009
010import org.openstreetmap.josm.plugins.streetside.StreetsideImage;
011
012import org.openstreetmap.josm.plugins.streetside.StreetsideLocationChangeset;
013
014
015public final class JsonLocationChangesetEncoder {
016  private JsonLocationChangesetEncoder() {
017    // Private constructor to avoid instantiation
018  }
019
020  public static JsonObjectBuilder encodeLocationChangeset(StreetsideLocationChangeset changeset) {
021    Objects.requireNonNull(changeset);
022    final JsonArrayBuilder imgChanges = Json.createArrayBuilder();
023    for (StreetsideImage img : changeset) {
024      imgChanges.add(encodeImageChanges(img));
025    }
026    return Json.createObjectBuilder()
027      .add("type", "location")
028      .add("changes", imgChanges)
029      .add("request_comment", "JOSM-created");
030  }
031
032  private static JsonObjectBuilder encodeImageChanges(StreetsideImage img) {
033    Objects.requireNonNull(img);
034
035    final JsonObjectBuilder to = Json.createObjectBuilder();
036    if (!img.getTempLatLon().equalsEpsilon(img.getLatLon())) {
037      to.add("geometry", Json.createObjectBuilder()
038        .add("coordinates", Json.createArrayBuilder()
039          .add(img.getTempLatLon().getX())
040          .add(img.getTempLatLon().getY())
041        ).add("type", "Point")
042      );
043    }
044    if (Math.abs(img.getHe() - img.getTempHe()) > 1e-9) {
045      to.add("properties", Json.createObjectBuilder().add("ca", img.getTempHe()));
046    } else {
047      to.add("properties", Json.createObjectBuilder());
048    }
049    if (!img.getTempLatLon().equalsEpsilon(img.getLatLon())) {
050      to.add("type", "Feature");
051    }
052
053    return Json.createObjectBuilder()
054      .add("image_key", img.getId())
055      .add("to", to);
056  }
057}