Java使用Geotools讀取shape矢量數據
作為GIS開發者而言,矢量數據是我們經常要用到的,而shape數據是矢量數據中最常用的格式,因此解析shape數據也是作為GIS軟體開發人員必備的基礎技能,而GeoTools無疑是Java最好用來處理GIS數據的三方庫,當然這只是GeoTools的冰山一角,後面我也會慢慢的去分享GeoTools的更多用法。
今天就簡單來梳理下shape數據的解析獲取,環境是maven工程,首先是maven依賴:


<project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.dudu.liuyang</groupId> <artifactId>gis</artifactId> <version>0.0.1-SNAPSHOT</version> <repositories> <repository> <id>central</id> <name>aliyun maven</name> <url>//maven.aliyun.com/repository/central</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> <repository> <id>osgeo-releases</id> <name>OSGeo Nexus Release Repository</name> <url>//repo.osgeo.org/repository/release/</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> <repository> <id>osgeo-snapshots</id> <name>OSGeo Nexus Snapshot Repository</name> <url>//repo.osgeo.org/repository/snapshot/</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> <repository> <id>geosolutions</id> <name>geosolutions repository</name> <url>//maven.geo-solutions.it/</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> </repositories> <dependencies> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-shapefile</artifactId> <version>25.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.2.8.RELEASE</version> </plugin> </plugins> </build> </project>
View Code
下面就是簡單的程式碼操作,其實如果只是簡單的讀取,就很簡單,下面是主要程式碼。


package gis; import java.io.File; import java.io.IOException; import java.util.List; import org.geotools.data.FeatureSource; import org.geotools.data.Query; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.data.simple.SimpleFeatureIterator; import org.geotools.geometry.jts.ReferencedEnvelope; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.type.AttributeDescriptor; import org.opengis.feature.type.GeometryType; import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * shape文件讀取 * @author ly * */ public class ShapeFileReaderTest { private static final String FILE_PATH = "F:\\data\\vector\\shape\\line\\xian_sheng.shp"; public static void main(String[] args) { File file = new File(FILE_PATH); readShapeFile(file); } /** * * @param shpFile 傳遞的是shape文件中的.shp文件 */ private static void readShapeFile(File shpFile) { /** * 直接使用shapefileDatastore,如果不知道,也可以使用工廠模式(見下個方法) * 建議,如果確定是shape文件,就直使用shapefileDatastore */ try { ShapefileDataStore shapefileDataStore = new ShapefileDataStore(shpFile.toURI().toURL()); //這個typeNamae不傳遞,默認是文件名稱 FeatureSource featuresource = shapefileDataStore.getFeatureSource(shapefileDataStore.getTypeNames()[0]); //讀取bbox ReferencedEnvelope bbox =featuresource.getBounds(); //讀取投影 CoordinateReferenceSystem crs = featuresource.getSchema().getCoordinateReferenceSystem(); //特徵總數 int count = featuresource.getCount(Query.ALL); //獲取當前數據的geometry類型(點、線、面) GeometryType geometryType = featuresource.getSchema().getGeometryDescriptor().getType(); //讀取要素 SimpleFeatureCollection simpleFeatureCollection = (SimpleFeatureCollection) featuresource.getFeatures(); //獲取當前矢量數據有哪些屬性欄位值 List<AttributeDescriptor> attributes = simpleFeatureCollection.getSchema().getAttributeDescriptors(); // SimpleFeatureIterator simpleFeatureIterator = simpleFeatureCollection.features(); // while(simpleFeatureIterator.hasNext()) { SimpleFeature simpleFeature = simpleFeatureIterator.next(); attributes.stream().forEach((a) -> { //依次讀取這個shape中每一個屬性值,當然這個屬性值,可以處理其它業務 System.out.println(simpleFeature.getAttribute(a.getLocalName())); }); } } catch (IOException e) { e.printStackTrace(); } } }
View Code
當然GeoTools對於shape數據的操作非常多,除了簡單的讀取,還有高級的過濾查詢,當然這個就需要藉助ECSQL(其實在我看來就是sql語句的條件查詢,只是用一種標準把它定義了出來),還有就是對矢量數據的增刪改查,這些我都會在後期逐個分享。