Spring Boot(MVC)下空间字段(Geometry)与geojson的自动转换

来源:互联网 发布:淘宝包邮标签怎么设置 编辑:程序博客网 时间:2024/05/29 08:51

我们目前面临的问题是客户端传过来的json数据如何转换为Geometry(Point、LineString),后台的Geometry如何直接转换为JSON。在GIS的世界里有一个标准的GIS JSON格式叫做geojson。在本文将使用geojson格式与Geometry对象互相转换。 这里我们的思路是Spring Boot为我们自动注册了MappingJackson2HttpMessageConverter,在org.springframework.boot.autoconfigure.web.JacksonHttpMessageConvertersConfiguration如:

@Bean@ConditionalOnMissingBean(value = MappingJackson2HttpMessageConverter.class, ignoredType = {        "org.springframework.hateoas.mvc.TypeConstrainedMappingJackson2HttpMessageConverter",        "org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter" })public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(        ObjectMapper objectMapper) {    return new MappingJackson2HttpMessageConverter(objectMapper);}

据此看出Spring Boot是使用当前的Message Converter来实现对象(Geometry)和json之间转换的,我们只需要自定义objectMapper让其支持geojson即可。

添加第三方的依赖:

<dependency>    <groupId>com.bedatadriven</groupId>    <artifactId>jackson-datatype-jts</artifactId>    <version>2.4</version></dependency><repositories>    <repository>        <id>sonatype-oss</id>        <url>https://oss.sonatype.org/content/groups/public</url>    </repository></repositories>

自定义object让其支持Geometry与geojson之间的准换:

@Beanpublic ObjectMapper objectMapper(){    ObjectMapper objectMapper = new ObjectMapper();    objectMapper().registerModule(new JtsModule());    return objectMapper;}

这个第三方依赖目前有个bug就是不支持空间坐标系,在一个单一的系统里一般情况下坐标系应该也是一定的,所以不支持问题也不大,所以我们将前面例子http://www.fhadmin.org/的字段映射修改为,:

//@Column(columnDefinition = "geometry(Point,4326)")@Column(columnDefinition = "geometry(Point)")private Point point;

测试控制器:

@RestController@Slf4j@RequestMapping("/cities")public class CityController {    @Autowired    CityRepository cityRepository;    @PostMapping    public City testIn(@RequestBody City city){        log.info(city.getPoint().getSRID()                + "/" + city.getPoint().getX()                + "/" +city.getPoint().getY());        return cityRepository.save(city);    }}

测试数据,使用request body向后台POST如下结果:

{    "name": "南京",    "point": {      "type": "Point",      "coordinates": [        110.4,        20.1      ]    }    }

返回值为:

{  "id": 58,  "name": "南京",  "point": {    "type": "Point",    "coordinates": [      110.4,      20.1    ]  }}

这时我们实现了自动的Geometry和geojson数据的转换。

原创粉丝点击