在上篇中,我在MapController类中新建了一个方法JSONObject geometryToJson(Geometry geometry),用以将geometry对象转为json。
这个方法有点问题,首先,point是一个点,只有一组坐标,polygon如果有孔洞,怎么表示?multipolygon都是多部件还好,要是有带孔洞的polygon怎么办?polyline怎么表示?
而且我在这个方法里新建了太多对象JSONObejct、JSONArray等,最后也没有回收,会造成一些JVM性能问题。
综上,没事儿别自己瞎造轮子,自己瞎造的轮子,有可能掉到沟里。
Geojson这种数据格式,是有标准规范的,参见,https://www.oschina.net/translate/geojson-spec?cmp
也有一个专用的jar包将wkt等格式的数据转为geojson。
我们就用这个现成的gt-geojson来进行geojson的生成。
一、引入jar包
D:\gismap\java\master\gismap\pom.xml
Maven依赖:
<dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-geojson</artifactId>
    <version>9.3</version>
</dependency>
配置一下下载maven的resource
<repositories>
    <repository>
        <id>OSGeo Repository</id>
        <url>http://download.osgeo.org/webdav/geotools/</url>
    </repository>
</repositories>
二、修改mapcontroller
D:\gismap\java\master\gismap\src\main\java\com\history\gismap\controller\MapController.java
很简单,主要就是4行语句。
新建一个Geometry转换json的类。
GeometryJSON geometryJSON=new GeometryJSON();
再建一个StringWriter流writer。
StringWriter writer = new StringWriter();
用geometryJSON将geometry写入writer中。
geometryJSON.write(g.getGeometry(),writer);
JSONObject.parse是将String类型解析回JSON格式。
geom.put("geometry",JSONObject.parse(writer.toString()));
全部:
package com.history.gismap.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.history.gismap.model.GeometryModel;
import com.history.gismap.service.MapService;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import lombok.extern.slf4j.Slf4j;
import org.geotools.geojson.geom.GeometryJSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.io.StringWriter;
import java.util.List;
@Controller
@RequestMapping(value = "/history")
@Slf4j
public class MapController {
    @Autowired
    private MapService mapService;
    /**
     * 根据表名和时间区间输出对象
     * @param category 表名简写
     * @param start 起始时间
     * @param end 终止时间
     * @return
     */
    @ResponseBody
    @GetMapping("/geometry")
    public JSONObject getPoint(@RequestParam("category") String category,@RequestParam("start") Integer start,@RequestParam("end") Integer end){
        try {
            List<GeometryModel> result=mapService.getDynastyGeom(category,start,end);
            JSONObject jsonObject=new JSONObject();
            jsonObject.put("number",result.size());
            JSONArray jsonArray=new JSONArray();
            GeometryJSON geometryJSON=new GeometryJSON();
            for (GeometryModel g:result) {
                JSONObject geom=new JSONObject();
                geom.put("gid",g.getGId());
                geom.put("namepy",g.getNamePy());
                geom.put("namech",g.getNameCh());
                geom.put("nameft",g.getNameFt());
                geom.put("presloc",g.getPresLoc());
                geom.put("typepy",g.getTypePy());
                geom.put("typech",g.getTypeCh());
                geom.put("levrank",g.getLevRank());
                geom.put("begyr",g.getBegYr());
                geom.put("begrule",g.getBegRule());
                geom.put("endyr",g.getEndYr());
                geom.put("endrule",g.getEndRule());
                geom.put("geosrc",g.getGeoSrc());
                geom.put("compiler",g.getCompiler());
                geom.put("gecomplr",g.getGecomplr());
                geom.put("checker",g.getChecker());
                geom.put("entdate",g.getEntDate());
                geom.put("begchgty",g.getBegChgTy());
                geom.put("endchgty",g.getEndChgTy());
                StringWriter writer = new StringWriter();
                geometryJSON.write(g.getGeometry(),writer);
                geom.put("geometry",JSONObject.parse(writer.toString()));
                jsonArray.add(geom);
            }
            jsonObject.put("list",jsonArray);
            log.info("入参类别:{},起始时间:{},截至时间:{}",category,start,end);
            return jsonObject;
        }catch (Exception e){
            log.error("程序错误类型:",e);
            return null;
        }
    }
}
git:
https://github.com/yimengyao13/gismap.git
分支:geojson
三、测试
在网页上看一下
http://localhost:8080/history/geometry?category=prefpgn&start=-5000&end=-221
一、引入jar包
因为我maven没有成功引入gt-geojson这个jar包,所以我把它下载到本地再引入。
在这个页面上:
https://mvnrepository.com/artifact/org.geotools/gt-geojson/21.2

我把它放到D:\gismap\java\gismap\src\main\resources\libs这个文件夹下了。
打开IDEA,file——project structure:
Modules——Dependencies——+——JARs or directories。

选择之前下载好的jar包,确定。

勾选刚才加入的jar包gt-geojson-21.2.jar,Apply,OK。

这样之后,jar包就能在工程中引用了。

来源:CSDN
作者:铁血阿郎
链接:https://blog.csdn.net/sinat_41310868/article/details/104743532