在上篇中,我在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