您的位置 首页 java

geojson和wkt互转「java版本」

geojson 简介

官网地址:

Geojson 是一种用于编码各种地理数据结构的格式。

 {
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [125.6, 10.1]
  },
  "properties": {
    "name": "Dinagat Islands"
  }
}
  

GeoJSON 支持以下几何类型:Point、LineString、 Polygon、MultiPoint、MultiLineString和MultiPolygon。具有附加属性的几何对象是Feature对象。特征集包含在FeatureCollection对象中。

wkt简介

WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的 二进制 表示方式,亦即WKB(well-known binary)则胜于在传输和在数据库中存储相同的信息。该格式由开放地理空间联盟( OGC )制定。

WKT可以表示的几何对象包括:点,线,多边形, TIN (不规则三角网)及多面体。可以通过几何集合的方式来表示不同维度的几何对象。

 几何物体的坐标可以是2D(x,y),3D(x,y,z),4D(x,y,z,m),加上一个属于线性参照系统的m值。

以下为几何WKT字串样例:  

POINT(6 10)

LINESTRING(3 4,10 50,20 25)

POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))

MULTIPOINT(3.5 5.6, 4.8 10.5)

MULTILINE String ((3 4,10 50,20 25),(-5 -8,-10 -8,-15 -4))

MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),((6 3,9 2,9 4,6 3)))

GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))

POINT ZM (1 1 5 60)

POINT M (1 1 80)

POINT EMPTY

MULTIPOLYGON EMPTY

geojson 和 wtk 的区别

WKT是用来单独表示空间点、线、面数据,GeoJSON还可以用来表示空间数据和属性数据的集合 (crs、bbox属性)。

通常在大多数时候,两种会同时使用。例如postgis中可以同时转换geojson(ST_AsGeoJSON(geometry geom) )和wkt(ST_AsText(geometry geom)).

geojson 和 wkt相互转换【 java 版本】

通过geotools的依赖包转换

官网:

通常和空间信息数据操作的包均可以通过geotools的包来实现。同时也带来了一些弊端,geotools的包体量较大。

pom

         <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.13.2</version>
        </dependency>

        <!-- geo -->
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geojson</artifactId>
            <version>21.0</version>
        </dependency>
        <dependency>
            <groupId>org.locationtech.jts</groupId>
            <artifactId>jts-core</artifactId>
            <version>1.16.1</version>
        </dependency>
  

代码实现

 
import com.fasterxml.jackson.databind.ObjectMapper;
import org. apache .commons.lang3.StringUtils;
import org.geotools.geojson.geom.GeometryJSON;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.Parse Exception ;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.io.WKTWriter;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;


/**
 * @author: wangpeng
 * @date: 2022/06/04  10:17
 */public class DataTypeConvertOldUtils {

    public  static  Geometry geojson2Geometry(String geojson) throws IOException {
        GeometryJSON gjson = new GeometryJSON(7);
        return gjson.read(new StringReader(geojson));
    }

    public static String geometry2Geojson(Geometry geometry) throws IOException {
        GeometryJSON gjson = new GeometryJSON(7);
        StringWriter writer = new StringWriter();
        gjson.write(geometry, writer);
        return writer.toString();
    }

    public static Geometry wkt2Geometry(String wkt) throws ParseException {
        WKTReader reader = new WKTReader();
        return reader.read(wkt);
    }

    public static String geometry2Wkt(Geometry geometry) throws ParseException {
        WKTWriter writer = new WKTWriter();
        return writer.write(geometry);
    }

    /**
     * geojson 转 wtk
     *
     * @param geojson
     * @return
     * @throws Exception
     */    public static String geojson2Wkt(String geojson) throws Exception {
        Geometry geometry = geojson2Geometry(geojson);
        return geometry2Wkt(geometry);
    }

    /**
     * wkt 转 geojson
     *
     * @param wkt
     * @return
     * @throws Exception
     */    public static String wkt2Geojson(String wkt) throws Exception {
        Geometry geometry = wkt2Geometry(wkt);
        return geometry2Geojson(geometry);
    }

    /**
     * obj 转
     *
     * @param obj
     * @param <T>
     * @return
     */    public static <T> String obj2StringPretty(T obj) {
        ObjectMapper mapper = new ObjectMapper();
        if (obj == null) {
            return null;
        }
        try {
            return obj  instanceof  String ? (String) obj : mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
        } catch (IOException e) {
            return null;
        }
    }

    public static <T> T string2Obj(String str, Class<T> clazz) {
        ObjectMapper mapper = new ObjectMapper();
        if (StringUtils.isEmpty(str) || clazz == null) {
            return null;
        }
        try {
            return clazz.equals(String.class) ? (T) str : mapper.readValue(str, clazz);
        } catch (IOException e) {
            return null;
        }
    }
}

  

测试

 
    public static  void  main(String[] args) throws Exception {
        String geojson = "{\"type\":\"Polygon\",\"coordinates\":[[[116.2078857421875,39.928694653732364],[116.20925903320312,39.91078961774283],[116.20651245117188,39.89393354266699],[116.23397827148436,39.86547951378614],[116.24496459960938,39.82752244475985],[116.29852294921876,39.78954439311165],[116.3397216796875,39.78532331459258],[116.3836669921875,39.78848914776114],[116.41799926757811,39.79904087286648],[116.444091796875,39.80748108746673],[116.45919799804688,39.818029898770206],[116.48117065429686,39.83490462943255],[116.50314331054688,39.86231722624386],[116.50588989257812,39.88023492849342],[116.5045166015625,39.90973623453719],[116.4935302734375,39.925535281697286],[116.5045166015625,39.94975340768179],[116.47979736328125,39.98132938627215],[116.47567749023438,39.99395569397331],[116.45507812500001,40.000267972646796],[116.43859863281249,40.000267972646796],[116.4166259765625,39.998163944585805],[116.36581420898438,40.00868343656941],[116.35208129882812,40.00447583427404],[116.30264282226562,40.01078714046552],[116.27792358398436,39.999215966720165],[116.24771118164061,39.99500778093748],[116.23260498046874,39.990799335838034],[116.21200561523438,39.95606977009003],[116.2078857421875,39.928694653732364]]]}";

        String wkt = DataTypeConvertOldUtils.geojson2Wkt(geojson);
        System.out.println(wkt);
        String newGeojson = DataTypeConvertOldUtils.wkt2Geojson(wkt);
        System.out.println(newGeojson);

    }
  

通过jts2geojson包来转换

该方式比较轻量,推荐尝试。

GitHub 仓库地址

pom

         <dependency>
            <groupId>org.wololo</groupId>
            <artifactId>jts2geojson</artifactId>
            <version>0.17.0</version>
        </dependency>
  

代码实现

 
import com.fasterxml.jackson.databind.ObjectMapper;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.io.WKTWriter;
import org.wololo.geojson.GeoJSON;
import org.wololo.jts2geojson.GeoJSONReader;
import org.wololo.jts2geojson.GeoJSONWriter;

import java.io.IOException;

/**
 * wkt gsojson 相互转换
 *
 * @author: wangpeng
 * @date: 2022/06/04  10:01
 */public class DataTypeConvertUtils {

    /**
     * geojson 转 geometry
     *
     * @param geojson
     * @return
     * @throws Exception
     */    public static Geometry geojson2Geometry(String geojson) throws Exception {
        GeoJSONReader reader = new GeoJSONReader();
        Geometry geometry = reader.read(geo json );
        return geometry;
    }


    /**
     * geometry 转 geojson
     *
     * @param geometry
     * @return
     * @throws Exception
     */    public static String geometry2Geojson(Geometry geometry) throws Exception {
        GeoJSONWriter writer = new GeoJSONWriter();
        GeoJSON json = writer.write(geometry);
        return json.toString();
    }


    /**
     * wkt 转 geometry
     *
     * @param wkt
     * @return
     * @throws Exception
     */    public static Geometry wkt2Geometry(String wkt) throws Exception {
        WKTReader reader = new WKTReader();
        return reader.read(wkt);
    }

    /**
     * geometry 转 wkt
     *
     * @param geometry
     * @return
     * @throws Exception
     */    public static String geometry2Wkt(Geometry geometry) throws Exception {
        WKTWriter writer = new WKTWriter();
        return writer.write(geometry);
    }


    /**
     * geojson 转 wkt
     *
     * @param geojson
     * @return
     * @throws Exception
     */    public static String geojson2Wkt(String geojson) throws Exception {
        Geometry geometry = geojson2Geometry(geojson);
        return geometry2Wkt(geometry);
    }

    /**
     * wkt 转 geojson
     *
     * @param wkt
     * @return
     * @throws Exception
     */    public static String wkt2Geojson(String wkt) throws Exception {
        Geometry geometry = wkt2Geometry(wkt);
        return geometry2Geojson(geometry);
    }

    /**
     * obj 转 json
     *
     * @param obj
     * @param <T>
     * @return
     */    public static <T> String obj2StringPretty(T obj) {
        ObjectMapper mapper = new ObjectMapper();
        if (obj == null) {
            return null;
        }
        try {
            return obj instanceof String ? (String) obj : mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
        } catch (IOException e) {
            return null;
        }
    }

    /**
     * json 转 obj
     *
     * @param str
     * @param clazz
     * @param <T>
     * @return
     */    public static <T> T string2Obj(String str, Class<T> clazz) {
        ObjectMapper mapper = new ObjectMapper();
        if (isEmpty(str) || clazz == null) {
            return null;
        }
        try {
            return clazz.equals(String.class) ? (T) str : mapper.readValue(str, clazz);
        } catch (IOException e) {
            return null;
        }
    }

    /**
     * 为空判断
     *
     * @param str
     * @return
     */     private  static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }

}


  

测试

 

    public static void main(String[] args) throws Exception {
        String geojson = "{\"type\":\"Polygon\",\"coordinates\":[[[116.2078857421875,39.928694653732364],[116.20925903320312,39.91078961774283],[116.20651245117188,39.89393354266699],[116.23397827148436,39.86547951378614],[116.24496459960938,39.82752244475985],[116.29852294921876,39.78954439311165],[116.3397216796875,39.78532331459258],[116.3836669921875,39.78848914776114],[116.41799926757811,39.79904087286648],[116.444091796875,39.80748108746673],[116.45919799804688,39.818029898770206],[116.48117065429686,39.83490462943255],[116.50314331054688,39.86231722624386],[116.50588989257812,39.88023492849342],[116.5045166015625,39.90973623453719],[116.4935302734375,39.925535281697286],[116.5045166015625,39.94975340768179],[116.47979736328125,39.98132938627215],[116.47567749023438,39.99395569397331],[116.45507812500001,40.000267972646796],[116.43859863281249,40.000267972646796],[116.4166259765625,39.998163944585805],[116.36581420898438,40.00868343656941],[116.35208129882812,40.00447583427404],[116.30264282226562,40.01078714046552],[116.27792358398436,39.999215966720165],[116.24771118164061,39.99500778093748],[116.23260498046874,39.990799335838034],[116.21200561523438,39.95606977009003],[116.2078857421875,39.928694653732364]]]}";

        String wkt = DataTypeConvertUtils.geojson2Wkt(geojson);
        System.out.println(wkt);
        String newGeojson = DataTypeConvertUtils.wkt2Geojson(wkt);
        System.out.println(newGeojson);

    }  

文章来源:智云一二三科技

文章标题:geojson和wkt互转「java版本」

文章地址:https://www.zhihuclub.com/185429.shtml

关于作者: 智云科技

热门文章

网站地图