1.Geotools中Geometry和GeoJson进行相互转换
pom.xml
<geotools.version>17.1</geotools.version>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>${geotools.version}</version>
</dependency>
<!– https://mvnrepository.com/artifact/org.geotools/gt-main –>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-api</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-opengis</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-data</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-referencing</artifactId>
<version>${geotools.version}</version>
</dependency>
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;
import com.vividsolutions.jts.operation.linemerge.LineMerger;
import org.geotools.data.DataUtilities;
import org.geotools.feature.SchemaException;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.geojson.feature.FeatureJSON;
import org.geotools.geojson.geom.GeometryJSON;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.*;
LineString–>geojson
// 由wkt字符串构造LineString对象
WKTReader reader = new WKTReader( geometryFactory );
LineString lineString = (LineString)reader.read("LINESTRING (254058.76074485347 475001.2186020431, 255351.04293761664 474966.9279243938)");
// 设置保留6位小数,否则GeometryJSON默认保留4位小数
GeometryJSON geometryJson = new GeometryJSON(6);
StringWriter writer = new StringWriter();
geometryJson.write(lineString, writer);
System.out.println(writer.toString());
writer.close();
geojson–>LineString
LineString lineString = (LineString) geometryJson.read(new StringReader("{\n" +
" \"type\": \"LineString\",\n" +
" \"coordinates\": [\n" +
" [\n" +
" 120.6584555,\n" +
" 30.45144\n" +
" ],\n" +
" [\n" +
" 120.1654515,\n" +
" 30.54848\n" +
" ]\n" +
" ]\n" +
" }"));
Feature和FeatureCollection是geotools带属性的,其中FeatureCollection表示Geometry对象集合
LineString转Feature
// geometry是必须的,其他属性可根据需求自定义,但是支持的类型有限,例如这个版本中double是不支持的,只支持float
final SimpleFeatureType TYPE = DataUtilities.createType("Link",
"geometry:LineString," + // <- the geometry attribute: Point type
"gid:String," + // <- a String attribute
"direction:Integer," + // a number attribute
"orientation:Integer"
);
SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
WKTReader reader = new WKTReader( geometryFactory );
FeatureJSON fjson = new FeatureJSON();
LineString lineString = (LineString)reader.read("LINESTRING (254058.76074485347 475001.2186020431, 255351.04293761664 474966.9279243938)");
// 按照TYPE中声明的顺序为属性赋值就可以
featureBuilder.add(lineString);
featureBuilder.add("123456");
featureBuilder.add(2);
featureBuilder.add(0);
SimpleFeature feature = featureBuilder.buildFeature(null);
StringWriter writer = new StringWriter();
fjson.writeFeature(feature, writer);
System.out.println(writer.toString());
执行结果如下:
{“type”:”Feature”,”geometry”:{“type”:”LineString”,”coordinates”:[[254058.7607,475001.2186],[255351.0429,474966.9279]]},”properties”:{“gid”:”123456”,”direction”:2,”orientation”:0},”id”:”fid–5b8f258_15e04bda4b8_-8000”}
LineString转FeatureCollection
String[] WKTS = { "LINESTRING (255351.04293761664 474966.9279243938, 255529.29662365236 474272.4599921228)",
"LINESTRING (255529.29662365236 474272.4599921228, 256166.05830998957 473979.44920198264)"};
final SimpleFeatureType TYPE = DataUtilities.createType("Link",
"geometry:LineString," + // <- the geometry attribute: Point type
"gid:String," + // <- a String attribute
"direction:Integer," + // a number attribute
"orientation:Integer"
);
SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
WKTReader reader = new WKTReader( geometryFactory );
FeatureJSON fjson = new FeatureJSON();
List<SimpleFeature> features = new ArrayList<>();
SimpleFeatureCollection collection = new ListFeatureCollection(TYPE, features);
for (String wkt : WKTS) {
LineString lineString = (LineString)reader.read(wkt);
featureBuilder.add(lineString);
featureBuilder.add("123456");
featureBuilder.add(2);
featureBuilder.add(1);
SimpleFeature feature = featureBuilder.buildFeature(null);
features.add(feature);
}
StringWriter writer = new StringWriter();
fjson.writeFeatureCollection(collection, writer);
System.out.println(writer.toString());
执行结果如下:
{“type”:”FeatureCollection”,”features”:[{“type”:”Feature”,”geometry”:{“type”:”LineString”,”coordinates”:[[255351.0429,474966.9279],[255529.2966,474272.46]]},”properties”:{“gid”:”123456”,”direction”:2,”orientation”:1},”id”:”fid-67c46b85_15e0778dd81_-8000”},{“type”:”Feature”,”geometry”:{“type”:”LineString”,”coordinates”:[[255529.2966,474272.46],[256166.0583,473979.4492]]},”properties”:{“gid”:”123456”,”direction”:2,”orientation”:1},”id”:”fid-67c46b85_15e0778dd81_-7fff”}]}
如果想point和polygon和LineString都写到一个geojson文件里,geometry类型可以写成geometry,示例如下,将point和polygon放到一起
package com.test.domain.model;
import java.util.Date;
public class GeoModel {
private String nameId;
private String geoId;
private String adminCode;
private String typeId;
private String name;
private String nameEn;
private String namePy;
private String createUserId;
private Date createAt;
private Date updateAt;
private String point;
private String polygon;
private String area;
private String taskId;
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
public String getNameId() {
return nameId;
}
public void setNameId(String nameId) {
this.nameId = nameId;
}
public String getGeoId() {
return geoId;
}
public void setGeoId(String geoId) {
this.geoId = geoId;
}
public String getAdminCode() {
return adminCode;
}
public void setAdminCode(String adminCode) {
this.adminCode = adminCode;
}
public String getTypeId() {
return typeId;
}
public void setTypeId(String typeId) {
this.typeId = typeId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNameEn() {
return nameEn;
}
public void setNameEn(String nameEn) {
this.nameEn = nameEn;
}
public String getNamePy() {
return namePy;
}
public void setNamePy(String namePy) {
this.namePy = namePy;
}
public String getCreateUserId() {
return createUserId;
}
public void setCreateUserId(String createUserId) {
this.createUserId = createUserId;
}
public Date getCreateAt() {
return createAt;
}
public void setCreateAt(Date createAt) {
this.createAt = createAt;
}
public Date getUpdateAt() {
return updateAt;
}
public void setUpdateAt(Date updateAt) {
this.updateAt = updateAt;
}
public String getPoint() {
return point;
}
public void setPoint(String point) {
this.point = point;
}
public String getPolygon() {
return polygon;
}
public void setPolygon(String polygon) {
this.polygon = polygon;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
}
//将属性数据加载到list里
List<GeoModel> geoModelList = new ArrayList<>();
String writer = creatFeatureCollection(geoModelList);
writer = writer.replace("{\"type\":\"Feature\"", "\n{\"type\":\"Feature\"");
String path = "/data/123.geojson";
File file = new File(path);
try {
FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter osw=new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw=new BufferedWriter(osw);
bw.write(writer);
bw.close();
osw.close();
fos.close();
} catch (FileNotFoundException e) {
logger.error("FileNotFoundException:",e);
} catch (UnsupportedEncodingException e) {
logger.error("UnsupportedEncodingException:",e);
} catch (IOException e) {
logger.error("IOException:",e);
}
public String creatFeatureCollection(List<GeoModel> geoModels){
SimpleFeatureType TYPE = null;
try {
TYPE = DataUtilities.createType("Link",
"geometry:Geometry," +
"nameId:String," +
"geoId:String," +
"adminCode:String," +
"typeId:String," +
"name:String," +
"nameEn:String," +
"namePy:String," +
"createUserId:String," +
"createAt:Date," +
"updateAt:Date," +
"area:String," +
"taskId:String"
);
} catch (SchemaException e) {
logger.error("SchemaException",e);
}
SimpleFeatureBuilder featureBuilderPoint = new SimpleFeatureBuilder(TYPE);
SimpleFeatureBuilder featureBuilderPolygon = new SimpleFeatureBuilder(TYPE);
WKTReader reader = new WKTReader( autowiredService.getGeometryFactory() );
GeometryJSON gjson = new GeometryJSON(15); // 15位小数
FeatureJSON fjson = new FeatureJSON(gjson);
List<SimpleFeature> features = new ArrayList<>();
SimpleFeatureCollection collection = new ListFeatureCollection(TYPE, features);
for (GeoModel geoModel : geoModels){
Point point = null;
try {
point = (Point)reader.read(geoModel.getPoint());
} catch (ParseException e) {
logger.error("ParseException-point:",e);
}
featureBuilderPoint.add(point);
featureBuilderPoint.add(geoModel.getNameId());
featureBuilderPoint.add(geoModel.getGeoId());
featureBuilderPoint.add(geoModel.getAdminCode());
featureBuilderPoint.add(geoModel.getTypeId());
featureBuilderPoint.add(geoModel.getName());
featureBuilderPoint.add(geoModel.getNameEn());
featureBuilderPoint.add(geoModel.getNamePy());
featureBuilderPoint.add(geoModel.getCreateUserId());
featureBuilderPoint.add(geoModel.getCreateAt());
featureBuilderPoint.add(geoModel.getUpdateAt());
featureBuilderPoint.add(geoModel.getArea());
featureBuilderPoint.add(geoModel.getTaskId());
SimpleFeature featurePoint = featureBuilderPoint.buildFeature(null);
Polygon polygon = null;
try {
polygon = (Polygon)reader.read(geoModel.getPolygon());
} catch (ParseException e) {
logger.error("ParseException-polygon:",e);
}
featureBuilderPolygon.add(polygon);
featureBuilderPolygon.add(geoModel.getNameId());
featureBuilderPolygon.add(geoModel.getGeoId());
featureBuilderPolygon.add(geoModel.getAdminCode());
featureBuilderPolygon.add(geoModel.getTypeId());
featureBuilderPolygon.add(geoModel.getName());
featureBuilderPolygon.add(geoModel.getNameEn());
featureBuilderPolygon.add(geoModel.getNamePy());
featureBuilderPolygon.add(geoModel.getCreateUserId());
featureBuilderPolygon.add(geoModel.getCreateAt());
featureBuilderPolygon.add(geoModel.getUpdateAt());
featureBuilderPolygon.add(geoModel.getArea());
featureBuilderPolygon.add(geoModel.getTaskId());
SimpleFeature featurePolygon = featureBuilderPolygon.buildFeature(null);
features.add(featurePoint);
features.add(featurePolygon);
}
StringWriter writer = new StringWriter();
try {
fjson.writeFeatureCollection(collection, writer);
} catch (IOException e) {
logger.error("writeFeatureCollection异常:",e);
}
return writer.toString();
}
————————————————
版权声明:本文为CSDN博主「二十同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_18298439/article/details/104893786