首页 > 解决方案 > 使用 JTS jackson 时更改 lat long 的轴

问题描述

我在spring boot中使用locationtech JTS库,jackson作为json序列化器和一个支持序列化JTS几何的Jts-data-type模块。我面临的问题是返回json时坐标的轴顺序是long lat而不是lat长期以来,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]}

标签: jacksonjts

解决方案


无法调整GeometrySerializer,因为订单在第174-175行中是硬编码的。

为了避免自己编写序列化程序,您可以复制GeometrySerializer并反转这两行,但实际上您不会使用官方的 jts-data-type,并且将来对库的修改不会反映在您复制的序列化程序中,除非你手动做。

或者,只需在调用它之前装饰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


推荐阅读