java使用geotools解析矢量数据kml、geojson、shp文件
•
数据库
geotools解析kml、geojson
- geotools环境准备
- 公共获取属性方法
- 解析kml
- 解析geojson
- 解析shp
geotools环境准备
这里使用的是maven引用geotools包,引用geotools包需要添加maven仓库,pom.xml文件如下:
28.2
org.geotools
gt-main
${geotools-version}
org.geotools
gt-geojson
${geotools-version}
org.geotools
gt-geojson-core
${geotools-version}
org.geotools.xsd
gt-xsd-kml
${geotools-version}
osgeo
Open Source Geospatial Foundation Repository
https://repo.osgeo.org/repository/release/
osgeo-snapshot
OSGeo Snapshot Repository
https://repo.osgeo.org/repository/snapshot/
公共获取属性方法
@Slf4j
public class AnalysisUtil {
public static void readProperty(SimpleFeature simpleFeature) {
Collection properties = simpleFeature.getProperties();
Iterator iterator = properties.iterator();
int index = 0;
while (iterator.hasNext()) {
Property property = iterator.next();
//kml拿到属性值会有自带的9个属性
if (index++ > 8) {
log.info("GeoJSONReader解析geojson -->> 属性名:【{}】,属性值:【{}】,属性类型:【{}】", property.getName().toString(),
property.getValue(), property.getType().getBinding());
}
}
Object defaultGeometry = simpleFeature.getDefaultGeometry();
//wkt格式geometry
Geometry geometry = (Geometry) defaultGeometry;
log.info("wkt格式geometry:{}", geometry);
}
}
解析kml
KML(Keyhole Markup Language,Keyhole 标记语言)是一种基于XML 的标记语言,利用XML 语法格式描述地理空间数据(如点、线、面、多边形和模型等)。
public class AnalysisKml {
public static void main(String[] args) {
String fileUrl = "D:\\workspace\\vector\\vector\\KML.kml";
try (FileInputStream fileInputStream = new FileInputStream(fileUrl)) {
PullParser parser = new PullParser(new KMLConfiguration(), fileInputStream, SimpleFeature.class);
SimpleFeature simpleFeature = (SimpleFeature) parser.parse();
//kml文件声明了坐标系才能获取到,没声明获取就是null
CoordinateReferenceSystem coordinateReferenceSystem = simpleFeature.getFeatureType().getCoordinateReferenceSystem();
log.info("解析kml获取坐标系:{}", coordinateReferenceSystem);
readKml(simpleFeature, parser);
} catch (XMLStreamException | IOException | SAXException e) {
throw new UtilException(e.getMessage());
}
}
//递归方式获取每个地块信息
public static void readKml(SimpleFeature simpleFeature, PullParser parser) throws XMLStreamException, IOException,
SAXException {
//读取属性
AnalysisUtil.readProperty(simpleFeature);
//获取下一个simpleFeature
while (simpleFeature != null && simpleFeature.getDefaultGeometry() != null) {
simpleFeature = (SimpleFeature) parser.parse();
readKml(simpleFeature, parser);
}
}
}
解析geojson
GeoJSON 是一种用于编码各种地理数据结构的格式。
GeoJSON 支持以下几何类型:Point、LineString、Polygon、MultiPoint、MultiLineString 和 MultiPolygon。 具有附加属性的几何对象是特征对象。 要素集包含在FeatureCollection 对象中。
下面介绍2种解析geojson的方法:
- org.geotools.data.geojson.GeoJSONReader解析给geojson,但是它不会读取坐标系,所以不管什么坐标系的geojson文件读出来都是默认的坐标系WGS84.
- org.geotools.geojson.feature.FeatureJSON解析geojson可以读到文件对应的坐标系。
@Slf4j
public class GeoJsonAnalysis {
public static void main(String[] args) {
String fileUrl = "D:\\workspace\\vector\\vector\\福田路网geojson.geojson";
geoJSONReader(fileUrl);
featureJson(fileUrl);
}
public static void featureJson(String fileUrl) {
// 指定GeometryJSON构造器,15位小数
FeatureJSON featureJson = new FeatureJSON(new GeometryJSON(15));
try {
FeatureCollection featureCollection = featureJson.readFeatureCollection(new FileInputStream(fileUrl));
//获取坐标系
CoordinateReferenceSystem coordinateReferenceSystem =
featureCollection.getSchema().getCoordinateReferenceSystem();
log.info("解析geojson获取坐标系:{}", coordinateReferenceSystem);
FeatureIterator featureIterator = featureCollection.features();
while (featureIterator.hasNext()) {
SimpleFeature simpleFeature = (SimpleFeature) featureIterator.next();
AnalysisUtil.readProperty(simpleFeature);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void geoJSONReader(String fileUrl) {
GeoJSONReader reader = null;
try {
reader = new GeoJSONReader(new FileInputStream(fileUrl));
SimpleFeatureCollection featureCollection = reader.getFeatures();
//创建图层数据迭代器
FeatureIterator simpleFeatureFeatureIterator = featureCollection.features();
while (simpleFeatureFeatureIterator.hasNext()) {
AnalysisUtil.readProperty(simpleFeatureFeatureIterator.next());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
解析shp
shp文件解析请看往期文章:geotoolsu解析shp文件
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/c84a06226b.html
