本指南将帮助您设置IntelliJ IDE,以便使用GeoTools并遵循GeoTools教程的其余部分。
预备知识
本指南假设如下:
1.您已经安装了最新的JDK(在撰写本文时为8)。如果没有,Eclipse Quickstart提供了关于如何实现这一点的说明。
2.你已经安装了IntelliJ。本文的目标是IntelliJ CE 2016;然而,至少早在13年前的版本应该可以正常工作。最终版本也应该工作良好。IntelliJ可以从JetBrains上下载,通常在普通的操作系统上可以开箱即用。
创建一个新项目
首先,我们将使用Maven快速启动原型创建一个新项目。
1.从菜单中选择File -> New Project。在新建项目对话框中选择Maven项目,确保选择了Create from prototype,并选择org.apache.maven:maven-archetype-quickstart原型。按下一个。
2.下一步会询问我们项目的基本标识信息:
GroupId: org.geotools
ArtifactId: tutorial
Version: 1.0-SNAPSHOT
3.点击下一步。下面的屏幕应该可以保留默认设置。就我们的目的而言,IntelliJ的绑定Maven应该没问题,除非版本小于3,在这种情况下,你应该考虑使用一个新的外部版本。
4.点击下一步。给这个项目起个名字(这个名字只在IntelliJ内部使用),教程就能达到我们的目的。您可以根据需要更改项目位置,并希望保留更多的默认设置(推荐)
5.点击完成,我们的新项目将被创建。IntelliJ将向我们展示我们新创建的Maven文件,并进行一个初始的Maven构建(在尝试下一步之前先完成这个构建,它应该不会花很长时间)。IntelliJ还应该询问您是否希望为Maven依赖项启用自动导入。在本教程中,它将自动检测我们对POM文件所做的更改并自动导入这些更改。
IntelliJ用一个简单的Hello World创建了一个空的App.java !以及JUnit测试用例。您可以在Project Explorer中右键单击App或AppTest并从上下文菜单中选择run来运行它们。
向项目中添加jar包
pom.xml文件描述了项目的结构、配置、依赖关系和许多其他方面。我们将重点讨论项目所需的依赖项。
下载jar Maven时,如果它下载的依赖项存在,那么Maven利用“本地存储库”来存储副本。
Maven从internet上的公共存储库下载jar, GeoTools等项目在internet上发布其工作。
1.在项目的根目录下打开pom.xml文件。您可以看到我们之前通过向导输入的一些信息。
2.我们将向这个文件添加三样东西。首先,在模块转换后的文件顶部,我们想要添加一个属性元素来定义我们想要使用的地理工具的版本。虽然您可能希望尝试不同的版本,但这本工作簿是为23-SNAPSHOT编写的。
对于产品来说,23的稳定版本应该用于geotools.version:
UTF-8
23-SNAPSHOT
3.添加一个geotools的gt-main和gt-swing的jar包依赖,用上面定义的geotools.version代替版本号
junit
junit
4.11
test
org.geotools
gt-shapefile
${geotools.version}
org.geotools
gt-swing
${geotools.version}
4.最后,我们需要列出maven可以从其中下载GeoTools和其他所需jar的外部存储库。
maven2-repository.dev.java.net
Java.net repository
http://download.java.net/maven/2
osgeo
Open Source Geospatial Foundation Repository
http://download.osgeo.org/webdav/geotools/
true
boundless
Boundless Maven Repository
http://repo.boundlessgeo.com/main
5.如果希望使用Java 8语言级别的特性(例如lambdas),需要告诉Maven使用1.8源代码级别
true
org.apache.maven.plugins
maven-compiler-plugin
1.8
6.为了简单 ,你可以在pom.xml
下载文件
你或许会发现剪切粘贴会比写简单的多
注意
1.如果Maven由于某些原因没有自动下载依赖项(可能关闭了自动导入),
您可以通过右键单击项目并选择Maven -> Reimport来手动下载依赖项。
2.如果您想为您的依赖项下载Javadoc,您可以再次转到Maven上下文菜单并选择download Documentation
快速入门应用程序
现在我们的环境已经设置好了,我们可以创建一个简单的快速启动。本例将在屏幕上显示一个shapefile。
1.让我们在org.geotools.tutorial.quickstart包中创建一个名为Quickstart的类。IntelliJ可以一次性为我们创建包和类;右键点击 org.geootools包在项目面板和上下文菜单中选择新的-> Java类。
2.加入下面的代码
/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2019, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
*/
package org.geotools.tutorial.quickstart;
import java.io.File;
import org.geotools.data.FileDataStore;
import org.geotools.data.FileDataStoreFinder;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.map.FeatureLayer;
import org.geotools.map.Layer;
import org.geotools.map.MapContent;
import org.geotools.styling.SLD;
import org.geotools.styling.Style;
import org.geotools.swing.JMapFrame;
import org.geotools.swing.data.JFileDataStoreChooser;
/**
* Prompts the user for a shapefile and displays the contents on the screen in a map frame.
*
* This is the GeoTools Quickstart application used in documentationa and tutorials. *
*/
public class Quickstart {
/**
* GeoTools Quickstart demo application. Prompts the user for a shapefile and displays its
* contents on the screen in a map frame
*/
public static void main(String[] args) throws Exception {
// display a data store file chooser dialog for shapefiles
File file = JFileDataStoreChooser.showOpenFile("shp", null);
if (file == null) {
return;
}
FileDataStore store = FileDataStoreFinder.getDataStore(file);
SimpleFeatureSource featureSource = store.getFeatureSource();
// Create a map content and add our shapefile to it
MapContent map = new MapContent();
map.setTitle("Quickstart");
Style style = SLD.createSimpleStyle(featureSource.getSchema());
Layer layer = new FeatureLayer(featureSource, style);
map.addLayer(layer);
// Now display the map
JMapFrame.showMap(map);
}
}
1.我们需要下载一些示例数据来使用。http://www.naturalearthdata.com/项目是一个由北美制图信 息协会支持的伟大项目。到下面的链接下载一些文化载体。你可以使用顶部的“Download all 50m cultural themes”。
1:50m文化载体
请将上述数据解压到您可以轻松找到的位置,如桌面。
1:50m Cultural Vectors
解压到一个容易找到的地方
2.运行应用程序以打开文件选择器。从示例数据集中选择一个shapefile
3.应用程序将连接到您的shapefile,生成一个地图,并显示shapefile
关于代码示例,有几点需要注意:
1.shapefile不会加载到内存中——而是在每次需要时从磁盘读取它,这种方法允许您处理比可用内存大的数据集。
2.我们在这里使用的是一种非常基本的显示样式,它只显示功能概述。在下面的示例中,我们将看到如何指定更复杂的样式
尝试的东西
1.尝试不同的样本数据集
2.您可以放大、缩小和显示整个范围,并使用select工具检查样本国家中的各个国家。shp文件
3.下载你能找到的最大的shapefile,看看它能多快被渲染。您应该会发现,
在第一次生成空间索引时需要一些时间。之后的表现应该很好,当放大时。
4.一般来讲,不会讲shapefile加载到内存中,而是放在磁盘中创建控件索引,按需加载
如果你想要求GeoTools在内存中缓存shapefile,请尝试以下代码:
/**
* This method demonstrates using a memory-based cache to speed up the display (e.g. when
* zooming in and out).
*
* There is just one line extra compared to the main method, where we create an instance of
* CachingFeatureStore.
*/
public static void main(String[] args) throws Exception {
// display a data store file chooser dialog for shapefiles
File file = JFileDataStoreChooser.showOpenFile("shp", null);
if (file == null) {
return;
}
FileDataStore store = FileDataStoreFinder.getDataStore(file);
SimpleFeatureSource featureSource = store.getFeatureSource();
SimpleFeatureSource cachedSource =
DataUtilities.source(
new SpatialIndexFeatureCollection(featureSource.getFeatures()));
// Create a map content and add our shapefile to it
MapContent map = new MapContent();
map.setTitle("Using cached features");
Style style = SLD.createSimpleStyle(featureSource.getSchema());
Layer layer = new FeatureLayer(cachedSource, style);
map.addLayer(layer);
// Now display the map
JMapFrame.showMap(map);
}
这段代码最初无法编译,因为我们缺少一个导入。IntelliJ应该立即提示导入丢失的类。按Alt-Enter(在OS X上的^-Enter)打开一个对话框来导入缺少的类。
使用FileDataStoreFinder可以轻松地处理文件。另一种方法是使用连接参数映射。这种技术为我们提供了对如何使用shapefile的更多控制,并允许我们连接到数据库和web功能服务器。
File file = JFileDataStoreChooser.showOpenFile("shp", null);
Map params = new HashMap<>();
params.put("url", file.toURI().toURL());
params.put("create spatial index", false);
params.put("memory mapped buffer", false);
params.put("charset", "ISO-8859-1");
DataStore store = DataStoreFinder.getDataStore(params);
SimpleFeatureSource featureSource = store.getFeatureSource(store.getTypeNames()[0]);