首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JTS jackson时更改经纬度轴

使用JTS jackson时更改经纬度轴
EN

Stack Overflow用户
提问于 2019-11-24 05:16:18
回答 1查看 111关注 0票数 0

我在spring boot中使用locationtech JTS库,并使用json作为json序列化器和支持序列化JTS的JTS- geometry.The类型模块。我面临的问题是,当json返回时,坐标轴的顺序是长的,而不是长的。堆栈溢出https://stackoverflow.com/a/29634389/1574921上有一个解决方案,我想知道是否有其他方法来实现这个功能,而不是每当我创建一个功能时总是应用InvertCoordinateFilter。下面是我正在使用的代码

代码语言:javascript
复制
    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);

输出结果是

代码语言:javascript
复制
{"type":"Point","coordinates":[72.423434,32.3456789]}

我希望输出结果是

代码语言:javascript
复制
{"type":"Point","coordinates":[32.3456789,72.423434]}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-25 00:03:33

没有办法调整GeometrySerializer,因为顺序是硬编码在174-175行中的。

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

或者,只需修饰GeometrySerializer并在调用InverseCoordinateFilter之前使用它:

代码语言:javascript
复制
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,而是自己用反序列化程序创建一个模块:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59012335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档