java使用geotools解析矢量数据kml、geojson、shp文件

geotools解析kml、geojson

  • geotools环境准备
  • 公共获取属性方法
  • 解析kml
  • 解析geojson
  • 解析shp

geotools环境准备

这里使用的是maven引用geotools包,引用geotools包需要添加maven仓库,pom.xml文件如下:

<properties>
	
	<geotools-version>28.2geotools-version>
properties>


<dependency>
	<groupId>org.geotoolsgroupId>
	<artifactId>gt-mainartifactId>
	<version>${geotools-version}version>
dependency>
<dependency>
	<groupId>org.geotoolsgroupId>
	<artifactId>gt-geojsonartifactId>
	<version>${geotools-version}version>
dependency>
	
<dependency>
	<groupId>org.geotoolsgroupId>
	<artifactId>gt-geojson-coreartifactId>
	<version>${geotools-version}version>
dependency>
<dependency>
	<groupId>org.geotools.xsdgroupId>
	<artifactId>gt-xsd-kmlartifactId>
	<version>${geotools-version}version>
dependency>


<repositories>
	<repository>
		<id>osgeoid>
		<name>Open Source Geospatial Foundation Repositoryname>
		<url>https://repo.osgeo.org/repository/release/url>
	repository>
	<repository>
		<id>osgeo-snapshotid>
		<name>OSGeo Snapshot Repositoryname>
		<url>https://repo.osgeo.org/repository/snapshot/url>
	repository>
repositories>

公共获取属性方法

@Slf4j
public class AnalysisUtil {
	public static void readProperty(SimpleFeature simpleFeature) {
        Collection<Property> properties = simpleFeature.getProperties();
        Iterator<Property> 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的方法:

  1. org.geotools.data.geojson.GeoJSONReader解析给geojson,但是它不会读取坐标系,所以不管什么坐标系的geojson文件读出来都是默认的坐标系WGS84.
  2. 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<SimpleFeature> 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文件

你可能感兴趣的:(java,geotools)