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);
}