从零开始,构建电子地图网站:0_11_引用geojson

被刻印的时光 ゝ 提交于 2020-03-10 00:15:40

在上篇中,我在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包就能在工程中引用了。

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!