Spring 从 PostgreSQL 转换为 Geojson FeatureCollection

Posted

技术标签:

【中文标题】Spring 从 PostgreSQL 转换为 Geojson FeatureCollection【英文标题】:Spring Convert from PostgreSQL into Geojson FeatureCollection 【发布时间】:2020-11-09 21:41:14 【问题描述】:

我在将数据从 postgreSQL 转换为 geojson 并将数据公开到指定端点时遇到问题。

数据库中的数据(数据库名称:Shops):

shop_id => BIGINT shop_name => VARCHAR Shop_position => geography => 使用 ST_AsGeoJson 后我们会收到经度和纬度 Shop_radius => 双倍

存储库:

import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;


import java.util.List;
import java.util.Map;


@Repository
@RequiredArgsConstructor
@Slf4j
public class GeoRepository 

    private final JdbcTemplate jdbcTemplate;
   
    String GET_SHOPS = "select 'FeatureCollection' As type, array_to_json(array_agg(f)) As features from (select 'Feature' As type,ST_AsGeoJSON(lg.\"Shop_position\") :: json as geometry,row_to_json((select t from (select \"Shop_id\",\"Shop_name\",\"Shop_radius\") As t )) As properties from public.\"Shops\" As lg) as f;";
   
    public List<Map<String,Object>> getDataFromDb(String query)

        List<Map<String,Object>> data = jdbcTemplate.queryForList(query);
        return data;
    
    
    public List<Map<String,Object>> getShops() throws JsonProcessingException  return getDataFromDb(GET_SHOPS); 

服务:


import com.fasterxml.jackson.databind.ObjectMapper;
import com.liferay.portal.kernel.json.JSONObject;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.admin_panel.exception.DataNotFoundException;
import org.springframework.boot.admin_panel.repository.GeoRepository;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class GeoService 

    private final GeoRepository geoRepository;
    private ObjectMapper mapper = new ObjectMapper();

    public String getGeoJsonShops()
        try
            if(geoRepository.getShops() == null)
                throw new DataNotFoundException("Shops data is not found");
            else
            return mapper.writeValueAsString(geoRepository.getShops());
        catch (Exception e)
            System.out.println("Error: " + e);
            throw new NullPointerException("NullPointException");
        
    
    
    

控制器:


import com.liferay.portal.kernel.json.JSONObject;
import lombok.RequiredArgsConstructor;
import org.apache.tomcat.util.json.JSONParser;
import org.apache.tomcat.util.json.ParseException;
import org.springframework.boot.admin_panel.service.GeoService;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/admin_panel")
@CrossOrigin
@RequiredArgsConstructor
public class DataController 

    private final DataService dataService;

    @RequestMapping(value = "/get_shops", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity getShops() 
        String outputData = geoService.getGeoJsonShops();
        if(outputData == null)
            return ResponseEntity.notFound().build();
        else 
            return ResponseEntity.ok(outputData);
        
    

这个控制器返回:

[
    
        "type": "FeatureCollection",
        "features": 
            "type": "json",
            "value": "[\"type\":\"Feature\",\"geometry\":\"type\":\"Point\",\"coordinates\":[34.642697,74.341718],\"properties\":\"Shop_id\":125,\"Shop_name\":\"Grocery_Lux_Shop\",Shop_radius\":0.34637]"
        
    
]

但是“value”属性内部存在一个问题,它不是 json 而是一个字符串。 我没有收到json的错误是什么?我猜这是一个糟糕的 SQL 语法。

有人可以帮我吗? 我想接收类似这样的格式:

"type" : "FeatureCollection", "features" : ["type": "Feature", "geometry": "type":"Point","coordinates":[1,1], "properties": "id": 1, "name": "one", "type": "Feature", "geometry": "type":"Point","coordinates":[2,2], "properties": "id": 2, "name": "two", "type": "Feature", "geometry": "type":"Point","coordinates":[3,3], "properties": "id": 3, "name": "three"]

【问题讨论】:

【参考方案1】:

我猜这是一个糟糕的 SQL 语法。

不,这不是一个糟糕的语法。返回的内容相当于javascripts JSON.stringify

您需要使用 Jackson 对象映射器将“值”映射到 POJO。查看this 的答案以了解方法。

【讨论】:

好的,我明白了,但是我可以在不使用属性创建类 Shop 的情况下达到这个目标吗?我不想创建其他类,只关注存储库、服务和控制器。 尝试将其分配给“Object”类型的变量,然后使用 ObjectMapper 读取该变量的值。我不确定如何处理嵌套字段。 对象不支持嵌套字段,你能告诉我如何用 POJO 做到这一点吗?也许我必须 forEach 我的 List> 到 Map 然后分配给变量?

以上是关于Spring 从 PostgreSQL 转换为 Geojson FeatureCollection的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql将日文全宽转换为半宽

将函数从 Oracle 转换为 PostgreSQL

PostgreSQL:如何从 Unix 纪元转换为日期?

将嵌套解码转换为等效的 CASE 语句(需要从 Oracle 转换为 PostgreSQL)

如何从 PostgreSQL 查询转换为 LINQ 或 lambda 表达式

将引用集合表的过程从 Oracle 转换为 Postgresql 时出错