java geotools库代码示例:使用Geotools库来读取和显示Shapefile文件(GIS java常用库示例)

geotools库介绍

Geotools是一个开源的Java库,用于处理和分析地理空间数据,并提供了一组工具和API,以便在Java应用程序中使用地理空间数据。它是一个成熟的GIS库,具有广泛的功能和支持,可用于多种应用场景,包括地图制作、数据分析、空间查询和可视化等。

以下是Geotools库的一些主要特点:

  • 支持多种开放标准:Geotools支持多种开放标准,如OGC、ISO和OpenGIS等,使其可以与其他GIS和地理信息系统进行交互。
  • 处理多种数据格式:Geotools可以处理多种数据格式,包括Shapefile、GeoJSON、KML、GML等。
  • 提供多种数据源:Geotools支持多种数据源,包括文件、数据库、Web服务等。
  • 提供多种空间分析工具:Geotools提供了多种空间分析工具,如缓冲区分析、空间查询、地理编码、空间统计分析等。
  • 支持多种投影和坐标系统:Geotools支持多种投影和坐标系统,并提供了一些常见的投影和坐标系统的定义。
  • 提供多种可视化工具:Geotools提供了多种可视化工具,如渲染器、符号化工具、标注等,可以帮助用户创建动态和交互式地图。

总之,Geotools是一个强大的GIS库,具有广泛的功能和支持,可以用于多种地理空间数据处理和应用场景。

geotools pom

以下是Geotools的POM文件配置示例,可以将其添加到您的Maven项目中以便使用Geotools库:

<dependencies>
  <dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-shapefile</artifactId>
    <version>23.5</version>
  </dependency>
  <dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-swing</artifactId>
    <version>23.5</version>
  </dependency>
  <dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-epsg-hsql</artifactId>
    <version>23.5</version>
  </dependency>
  <dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-geojson</artifactId>
    <version>23.5</version>
  </dependency>
  <dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-referencing</artifactId>
    <version>23.5</version>
  </dependency>
  <dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-coverage</artifactId>
    <version>23.5</version>
  </dependency>
</dependencies>

这段POM文件中包含了Geotools的一些核心依赖项,包括:

  • gt-shapefile:用于读取和写入Shapefile文件的库。
  • gt-swing:用于创建Swing应用程序的库,包括创建地图框架和显示地图。
  • gt-epsg-hsql:用于提供EPSG投影和坐标系统定义的库。
  • gt-geojson:用于读取和写入GeoJSON文件的库。
  • gt-referencing:用于处理坐标参考系统和投影的库。
  • gt-coverage:用于处理栅格覆盖数据的库。

您可以根据您的具体需求来选择适当的依赖项并添加到您的POM文件中。另外,您还需要确保在您的POM文件中添加了适当的仓库配置,以便从Maven中央仓库下载Geotools库。

maven仓库配置

如果您在Maven项目中添加了Geotools的POM文件配置,并且遇到了类似"Could not find artifact org.geotools:gt-shapefile:pom:23.5 in central (https://repo.maven.apache.org/maven2)"的错误,可能是因为Maven无法从Maven中央仓库中下载Geotools库。

解决此问题的一种方法是将Geotools的仓库配置添加到Maven的settings.xml文件中。在您的Maven安装目录下的conf文件夹中,可以找到settings.xml文件。将以下内容添加到该文件中:

<settings>
  <profiles>
    <profile>
      <id>geotools</id>
      <repositories>
        <repository>
          <id>osgeo</id>
          <name>OSGeo Release Repository</name>
          <url>https://repo.osgeo.org/repository/release/</url>
        </repository>
      </repositories>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>geotools</activeProfile>
  </activeProfiles>
</settings>

这个配置将Geotools的仓库添加为Maven的一个配置文件。然后,您可以重新运行Maven命令来下载Geotools库。

另外,您还可以尝试通过在命令行中运行以下命令来解决此问题:

mvn install:install-file -Dfile=[path/to/geotools.jar] -DgroupId=org.geotools -DartifactId=gt-shapefile -Dversion=23.5 -Dpackaging=jar

其中,[path/to/geotools.jar]应替换为Geotools库的实际路径。这个命令将手动将Geotools库添加到您的本地Maven仓库中,以便您的Maven项目可以使用它。

完整代码

import java.io.File;
import java.io.IOException;
import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.FeatureSource;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.feature.FeatureIterator;
import org.geotools.geometry.jts.JTS;
import org.geotools.map.DefaultMapContext;
import org.geotools.map.MapContext;
import org.geotools.styling.SLD;
import org.geotools.styling.Style;
import org.geotools.swing.JMapFrame;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.geometry.Geometry;
import org.opengis.referencing.crs.CoordinateReferenceSystem;

public class GISExample {
    
    

  public static void main(String[] args) throws IOException {
    
    
    // 读取Shapefile文件
    File file = new File("path/to/shapefile.shp");
    Map<String, Object> map = new HashMap<>();
    map.put("url", file.toURI().toURL());
    DataStore dataStore = DataStoreFinder.getDataStore(map);
    String typeName = dataStore.getTypeNames()[0];
    FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = dataStore.getFeatureSource(typeName);
    SimpleFeatureCollection collection = featureSource.getFeatures();

    // 遍历要素并显示几何形状
    try (SimpleFeatureIterator iterator = collection.features()) {
    
    
      while (iterator.hasNext()) {
    
    
        SimpleFeature feature = iterator.next();
        Geometry geometry = (Geometry) feature.getDefaultGeometry();
        System.out.println(geometry.toString());
      }
    }

    // 显示Shapefile图层
    CoordinateReferenceSystem crs = featureSource.getSchema().getCoordinateReferenceSystem();
    Style style = SLD.createSimpleStyle(featureSource.getSchema());
    MapContext mapContext = new DefaultMapContext();
    mapContext.addLayer(featureSource, style);
    JMapFrame mapFrame = new JMapFrame(mapContext);
    mapFrame.enableToolBar(true);
    mapFrame.enableStatusBar(true);
    mapFrame.setVisible(true);
  }
}

代码解释

上述Java代码演示了如何使用Geotools库来读取和显示Shapefile文件。以下是代码解释:

首先,我们导入所需的Geotools库和Java库:

import java.io.File;
import java.io.IOException;
import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.FeatureSource;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.feature.FeatureIterator;
import org.geotools.geometry.jts.JTS;
import org.geotools.map.DefaultMapContext;
import org.geotools.map.MapContext;
import org.geotools.styling.SLD;
import org.geotools.styling.Style;
import org.geotools.swing.JMapFrame;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.geometry.Geometry;
import org.opengis.referencing.crs.CoordinateReferenceSystem;

然后,我们定义一个名为GISExample的类,并在其中定义一个main方法:

public class GISExample {
    
    

  public static void main(String[] args) throws IOException {
    
    
    // code here
  }
}

接下来,我们读取Shapefile文件:

File file = new File("path/to/shapefile.shp");
Map<String, Object> map = new HashMap<>();
map.put("url", file.toURI().toURL());
DataStore dataStore = DataStoreFinder.getDataStore(map);
String typeName = dataStore.getTypeNames()[0];
FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = dataStore.getFeatureSource(typeName);
SimpleFeatureCollection collection = featureSource.getFeatures();

在这段代码中,我们首先定义一个File对象,代表Shapefile文件的路径。然后,我们创建一个Map对象,并将Shapefile文件的URL存储在其中。接下来,我们使用DataStoreFinder.getDataStore方法来获取数据存储对象,并使用getTypeNames()方法获取第一个要素源的类型名称。最后,我们使用getFeatureSource()方法获取要素源,然后使用getFeatures()方法获取要素集合。

接着,我们遍历要素并显示几何形状:

try (SimpleFeatureIterator iterator = collection.features()) {
    
    
  while (iterator.hasNext()) {
    
    
    SimpleFeature feature = iterator.next();
    Geometry geometry = (Geometry) feature.getDefaultGeometry();
    System.out.println(geometry.toString());
  }
}

在这段代码中,我们使用SimpleFeatureIterator迭代要素集合,并使用getDefaultGeometry()方法获取要素的默认几何形状。然后,我们使用toString()方法打印几何形状的字符串表示。

最后,我们显示Shapefile图层:

CoordinateReferenceSystem crs = featureSource.getSchema().getCoordinateReferenceSystem();
Style style = SLD.createSimpleStyle(featureSource.getSchema());
MapContext mapContext = new DefaultMapContext();
mapContext.addLayer(featureSource, style);
JMapFrame mapFrame = new JMapFrame(mapContext);
mapFrame.enableToolBar(true);
mapFrame.enableStatusBar(true);
mapFrame.setVisible(true);

在这段代码中,我们使用getCoordinateReferenceSystem()方法获取坐标参考系统,并使用SLD.createSimpleStyle()方法创建一个简单的样式对象。然后,我们创建一个MapContext对象,并使用addLayer()方法将要素源和样式添加到地图上。接下来,我们创建一个JMapFrame对象,并使用enableToolBar()enableStatusBar()setVisible()方法来启用工具栏、状态栏并显示地图。

猜你喜欢

转载自blog.csdn.net/a772304419/article/details/131495298