Измените ось широты и долготы при использовании JTS jackson.

Я использую библиотеку JTS locationtech при весенней загрузке с jackson в качестве сериализатора json и модуль типа данных Jts с поддержкой сериализации геометрии JTS. долго есть решение для stackoverflow https://stackoverflow.com/a/29634389/1574921 я хочу знать, есть ли это любой другой способ достижения этой функциональности вместо того, чтобы всегда применять InvertCoordinateFilter всякий раз, когда я создаю функциональность. Ниже приведен код, который я использую

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JtsModule());


    double lat  = 32.3456789;
    double lng = 72.423434;

    GeometryFactory gf = new GeometryFactory();
    Point point = gf.createPoint(new Coordinate(lng,lat ));
    String json = mapper.writeValueAsString(point);
    System.out.println(json);

и выход

{"type":"Point","coordinates":[72.423434,32.3456789]}

и я хочу, чтобы вывод был

{"type":"Point","coordinates":[32.3456789,72.423434]}

person Haider    schedule 23.11.2019    source источник
comment
Вы можете написать свой собственный сериализатор для класса Point. Сериализация по умолчанию: GeometrySerializer. В пользовательском сериализаторе вы можете указать порядок элементов в массиве.   -  person Michał Ziober    schedule 24.11.2019


Ответы (1)


Невозможно настроить GeometrySerializer, поскольку порядок жестко запрограммирован в строках 174–175.

Чтобы не писать сериализатор самостоятельно, вы можете просто скопировать GeometrySerializer и инвертировать эти две строки, но фактически вы не будете использовать официальный тип данных jts, и будущие модификации библиотеки не будут отражаться в скопированном сериализаторе. если не делать это вручную.

В качестве альтернативы, просто украсьте GeometrySerializer и используйте InverseCoordinateFilter перед его вызовом:

public static class CustomGeometrySerializer extends JsonSerializer<Geometry> {
  private GeometrySerializer innerSerializer;
  private InvertCoordinateFilter inverter = new InvertCoordinateFilter();

  public CustomGeometrySerializer() {
    this(new GeometrySerializer());
  }

  public CustomGeometrySerializer(GeometrySerializer innerSerializer) {
    this.innerSerializer = innerSerializer;
  }

  @Override
  public void serialize(Geometry value, JsonGenerator jgen,
      SerializerProvider provider) throws IOException {

    // Create a new Geometry to avoid mutating the original one
    Geometry newValue = value.copy();
    newValue.apply(inverter);
    innerSerializer.serialize(newValue, jgen, provider);
  }

  private static class InvertCoordinateFilter implements CoordinateFilter {
    public void filter(Coordinate coord) {
      double oldX = coord.x;
      coord.x = coord.y;
      coord.y = oldX;
    }
  }
}

Теперь вместо регистрации JtsModule создайте модуль самостоятельно с помощью своего десериализатора:

ObjectMapper mapper = new ObjectMapper();

SimpleModule inverseJtsModule = new SimpleModule();
inverseJtsModule.addSerializer(Geometry.class, new CustomGeometrySerializer());
mapper.registerModule(inverseJtsModule);

double lat  = 32.3456789;
double lng = 72.423434;

GeometryFactory gf = new GeometryFactory();
Point point = gf.createPoint(new Coordinate(lng, lat));
String json = mapper.writeValueAsString(point);
System.out.println(json);

Теперь вы можете безопасно сериализовать свои геометрии без явного инвертирования каждой из них. Для десериализации можно использовать тот же подход, украсив GeometryDeserializer.

person Pedro    schedule 24.11.2019