歡迎
本教程適用於喜歡文本編輯器和可靠命令提示符的愉快公司的用戶。即使您經常使用IDE,您會發現從命令行編譯,測試和安裝應用程序通常更快更容易。我們將使用Maven(http://maven.apache.org/)來管理GeoTools項目依賴的大量jar。不要擔心,如果你不熟悉Maven,因為我們會一步一步地解釋一切。
示例應用程序與NetBeans和Eclipse Quickstart教程中使用的應用程序相同:用於加載和顯示shapefile的簡單程序。
當我們准備課程材料時,我們要感謝GeoTools用戶郵件列表中的成員的反饋,特別感謝Eva Shon進行測試/審查早期草案。如果您對本教程有任何問題或意見,請將其發布到用戶列表中。
Java安裝
我們將要使用Java,所以如果您現在沒有安裝Java開發工具包(JDK),那么現在就可以這么做了。
-
下載最新的Java 8 JDK:
- Oracle JDK:http : //www.oracle.com/technetwork/java/javase/downloads/
- OpenJDK:http : //openjdk.java.net/
-
在撰寫本文時,最新的Java 8版本是:
- JDK-8u66-Windows的i586.exe
GeoTools尚未通過Java 9測試,我們受到構建基礎設施和志願者的限制。
-
點擊安裝程序,您將需要設置接受許可協議等等。默認情況下,這將安裝到:
C:\ Program Files (x86)\ Javajdk1.8.0_66
注意
在本教程中,我們引用Windows使用的文件和目錄路徑。如果您足夠幸運地使用其他操作系統(如Linux或OSX),以下所有命令和源代碼都可以正常工作,只需修改適合的路徑即可。
Maven(為什么不那么糟糕)
Maven是一個廣泛使用的構建工具,通過描述項目的內容來起作用。這是一個不同於Make或Ant工具使用的方法,它列出了構建所需的步驟。
需要一段時間才能習慣於Maven,而對於某些人來說,它仍然是一種愛恨的關系,但這絕對會使GeoTools的工作變得更加容易:
- 您只需下載與應用程序相同的GeoTools。
- Jars被下載到您的主目錄中的單個位置(例如Windows上的C:\ Documents and Settings <user> \.m2 \)。這是您的本地存儲庫。
- 將為您下載GeoTools所需的所有第三方jar的正確版本。這可以幫助您避免由錯誤匹配的依賴關系引起的模糊錯誤,這可能非常難以追蹤。
- 單個本地存儲庫可以更輕松地處理其他多個開源項目。
安裝Maven
-
從http://maven.apache.org/download.html下載Maven
在本教程中,我們參考Maven 3.2.3版,我們在Maven版本3中遇到了一些麻煩。
-
解壓文件apache-maven-3.2.3-bin.zip
-
您需要為maven設置幾個環境變量才能工作。導航到 控制面板‣系統‣高級。切換到高級選項卡,然后單擊環境變量按鈕。
添加以下系統變量:
- JAVA_HOME = C:\ Program Files (x86)\ Java \ jdk1.8.0_66
- M2_HOME = C:\ java \ apache-maven-3.2.3
並將以下內容添加到您的路徑中:
- PATH = %JAVA_HOME%\ bin;%M2_HOME%\ bin
-
打開命令提示符附件‣命令提示符
-
鍵入以下命令以確認您設置正確:
C:java> mvn --version
-
這應該產生類似於以下輸出的內容:
C:\ java> mvn -version Apache Maven 3.2.3(33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T13:58:10-07:00) Maven主頁:C:\ java \ apache-maven-3.2.3 Java版本:1.8.0_66,供應商:Oracle Corporation Java home:C:\ Program Files(x86)\ Java \ jdk1.8.0_66 \ jre 默認語言環境:en_US,平台編碼:Cp1252 操作系統名稱:“windows 7”,版本:“6.1”,arch:“x86”,系列:“windows”
創建一個新項目
-
我們現在可以從maven-archetype-quickstart生成我們的項目:
C:> cd C:\ java C:java> mvn archetype:generate -DgroupId = org.geotools -DartifactId = tutorial -Dversion = 1.0-SNAPSHOT -DarchetypeGroupId = org.apache.maven.archetypes -DarchetypeArtifactId = maven-archetype-quickstart
-
上述命令創建以下文件和目錄:
tutorial tutorial\pom.xml tutorial\src tutorial\src\main tutorial\src\main\java tutorial\src\main\java\org tutorial\src\main\java\org\geotools tutorial\src\main\java\org\geotools\App.java tutorial\src\test tutorial\src\test\java tutorial\src\test\java\org tutorial\src\test\java\org\geotools tutorial\src\test\java\org\geotools\AppTest.java
App.java和AppTest.java只是本教程中未使用的占位符文件。
-
在構建過程中,您的本地maven存儲庫將用於存儲這兩個下載的jar,以及您在本地構建的jar。
您的本地Maven存儲庫位於您的主文件夾中。
平台 當地報告 Windows XP: C:\Documents and Settings\You\.m2\repository Windows: C:\Users\You.m2\repository Linux和Mac: ~/.m2/repository -
在您喜歡的文本編輯器中打開pom.xml文件。如果你的編輯器有一個XML語法模式切換到現在,因為它會使它更容易找到錯誤,如錯誤匹配的括號。一些編輯器(如vim)會在加載文件時自動執行此操作。
-
我們將首先定義我們希望使用的GeoTools的版本號。此工作簿是為17-SNAPSHOT編寫的,但您可能希望嘗試其他版本。
對於生產,推薦使用穩定的釋放:
<properties> <project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding> <geotools.version> 15.1 </geotools.version> </ properties>
為了利用每晚的構建,將geotools.version屬性設置為17-SNAPSHOT。
<properties> <project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding> <! - 使用最新的快照 - > <geotools.version> 17-SNAPSHOT </geotools.version> </ properties>
-
我們指定以下依賴項(應用程序需要的GeoTools模塊):
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-shapefile</artifactId> <version>${geotools.version}</version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-swing</artifactId> <version>${geotools.version}</version> </dependency> </dependencies>
-
我們告訴maven哪些存儲庫下載jars:
<repository> <repository> <id> maven2-repository.dev.java.net </ id> <name> Java.net repository</ name> <url> http://download.java.net/maven/2 < / url> </ repository> <repository> <id> osgeo </ id> <name>Open Source Geospatial Foundation Repository</ name> <url> http://download.osgeo.org/webdav/geotools/ </ url > </ repository> </ repositories>
如果您正在使用夜間構建(如17-SNAPSHOT)並添加對快照存儲庫的引用。
<repository> <repository> <id> maven2-repository.dev.java.net </ id> <name> Java.net repository</ name> <url> http://download.java.net/maven/2 < / url> </ repository> <repository> <id> osgeo </ id> <name>Open Source Geospatial Foundation Repository</ name> <url> http://download.osgeo.org/webdav/geotools/ </ url > </ repository> <repository> <snapshots> <enabled> true </ enabled> </ snapshots> <id>boundless</ id> <name>Boundless Maven Repository</ name> <url> http://repo.boundlessgeo.com/main </ url> </ repository> </ repositories>
-
如果您想使用Java 8語言級別的功能(例如lambdas),則需要告訴Maven使用1.8源級別
<build> <plugins> <plugin> <inherited> true </ inherited> <groupId> org.apache.maven.plugins </ groupId> <artifactId> maven-compiler-plugin </ artifactId> <configuration> <source> 1.8 </ source> <target> 1.8 </ target> </ configuration> </ plugin> </ plugins> </ build>
-
返回命令行,並使用以下命令獲取maven下載您項目所需的jar:
C:\ java \ example> mvn install
-
如果maven在下載任何jar時遇到問題,可以隨時重試。國家鏡像通常比默認的maven中心更快。
創建快速入門應用程序
現在我們准備好創建應用程序了。
-
克里特org.geotools.tutorial.quickstart包導航到該目錄 tutorial並創建目錄src\main\java\org\geotools\tutorial\quickstart
-
在新的子目錄中,使用文本編輯器創建一個新文件Quickstart.java。
-
填寫以下代碼:
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. * <p> * 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); } }
-
返回頂部的項目目錄(包含您的pom.xml文件的目錄),並使用以下命令構建應用程序:
mvn clean install
運行應用程序
-
如果您需要一些形狀文件,您將在 http://www.naturalearthdata.com/項目中找到一份由北美制圖信息學會支持的數據。前往下面的鏈接,下載一些文化媒介。您可以使用“下載所有50m文化主題”。
將上述數據解壓縮到您可以輕松找到的位置,如桌面。
-
您可以在命令行中使用Maven運行應用程序:
mvn exec:java -Dexec.mainClass = org.geotools.tutorial.quickstart.Quickstart
-
應用程序將連接到您的shapefile,生成地圖上下文,並顯示shapefile。
-
有幾件事情要注意的代碼示例:
- shapefile未加載到內存中。而是每次需要從磁盤讀取磁盤。這種方法允許您處理大於可用內存的數據集。
- 我們正在使用一個非常基本的顯示風格,只顯示功能輪廓。在下面的例子中,我們將看到如何指定更復雜的樣式。
事情要嘗試
-
嘗試不同的樣本數據集。
-
您可以放大,縮小並顯示完整的范圍,並使用信息工具來檢查示例countries.shp文件中的各個國家/地區。
-
下載最大的shapefile,您可以找到並查看可以呈現的速度。你會發現這是第一次需要一段時間作為空間索引。之后,渲染將變得更快。
-
快:我們知道人們選擇空間庫的方式之一是基於速度。通過設計,GeoTools不會將上述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(); // CachingFeatureSource is deprecated as experimental (not yet production ready) CachingFeatureSource cache = new CachingFeatureSource(featureSource); // 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(cache, style); map.addLayer(layer); // Now display the map JMapFrame.showMap(map); }
您還需要添加此import語句:
import org.geotools.data.CachingFeatureSource ;
暗示
在文本編輯器而不是IDE中使用GeoTools javadocs來確定源中需要哪些import語句。javadoc還列出了找到每個類的GeoTools模塊。
注意
構建時,您可能會看到不推薦使用CachingFeatureSource的消息。可以忽略它,這只是一個警告。該課程仍在考試中,但可用。
- 嘗試並整理出所有不同的“側車”文件 - 以及它們是什么。樣本數據集包括“shp”,“dbf”和“shx”。有多少其他側車文件?
- 高級:使用FileDataStoreFinder可以方便我們使用文件。另一種做事情的方法是連接參數的映射。這種技術使我們能夠更好地控制我們如何使用shapefile,並且還允許我們連接到數據庫和Web功能服務器。
File file = JFileDataStoreChooser.showOpenFile("shp", null); Map<String,Object> 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] );
-
那么,快速啟動應用程序中實際使用的jar是什么?在命令行上嘗試以下操作:
mvn依賴:樹
我們將在剩下的教程中更深入地利用一些項目。