先看下JAVA用geotools讀取shape格式文件
Shapefile屬于一種矢量圖形格式,它能夠保存幾何圖形的位置及相關屬性。但這種格式沒法存儲地理數據的拓撲信息。
其中,要組成一個Shapefile,有三個文件是必不可少的,它們分別是".shp", ".shx"與 ".dbf"文件
- .shp— 圖形格式,用于保存元素的幾何實體。
- .shx— 圖形索引格式。幾何體位置索引,記錄每一個幾何體在shp文件之中的位置,能夠加快向前或向后搜索一個幾何體的效率。
- .dbf— 屬性數據格式,以dBase IV的數據表格式存儲每個幾何形狀的屬性數據。
下面將介紹如何通過Java讀取Shape文件中的內容信息
我們的pom文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
<?xml version= "1.0" encoding= "UTF-8" ?> <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion> 4.0 . 0 </modelVersion> <groupId>com.herbert.geotool</groupId> <artifactId>geo</artifactId> <version> 1.0 -SNAPSHOT</version> <dependencies> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-shapefile</artifactId> <version> 19.2 </version> <scope>system</scope> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-opengis</artifactId> <version> 19.2 </version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-data</artifactId> <version> 19.2 </version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-api</artifactId> <version> 19.2 </version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-main</artifactId> <version> 19.2 </version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-metadata</artifactId> <version> 19.2 </version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-referencing</artifactId> <version> 19.2 </version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-geojson</artifactId> <version> 19.2 </version> </dependency> <dependency> <groupId>org.json.simple</groupId> <artifactId>json-simple</artifactId> <version> 1.1 </version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool</artifactId> <version> 1.5 . 4 </version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang</artifactId> <version> 2.6 </version> </dependency> <dependency> <groupId>com.vividsolutions</groupId> <artifactId>jts</artifactId> <version> 1.13 </version> </dependency> </dependencies> </project> |
具體Java代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
package com.herbert.geotoool.util; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.simple.SimpleFeatureIterator; import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.geojson.feature.FeatureJSON; import org.opengis.feature.simple.SimpleFeature; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.nio.charset.Charset; /** * @author :Herbert * @date :Created in 2019/12/26 17:01 * @description: * @modified By: * @version: $ */ public class ShapeModel { public static void main(String[] args) throws IOException { long start = System.currentTimeMillis(); String SHAPE_FILE = "F:\\MapData\\gisMap\\xian\\街道界線.shp" ; // ShapeFile全路徑 // 使用GeoTools讀取ShapeFile文件 File shapeFile = new File(SHAPE_FILE); ShapefileDataStore store = new ShapefileDataStore(shapeFile.toURI().toURL()); //設置編碼 Charset charset = Charset.forName( "GBK" ); store.setCharset(charset); SimpleFeatureSource sfSource = store.getFeatureSource(); SimpleFeatureIterator sfIter = sfSource.getFeatures().features(); // 從ShapeFile文件中遍歷每一個Feature,然后將Feature轉為GeoJSON字符串 while (sfIter.hasNext()) { SimpleFeature feature = (SimpleFeature) sfIter.next(); // Feature轉GeoJSON FeatureJSON fjson = new FeatureJSON(); StringWriter writer = new StringWriter(); fjson.writeFeature(feature, writer); String sjson = writer.toString(); System.out.println( "sjson===== >>>> " + sjson); } System.out.println( "數據導入完成,共耗時" +(System.currentTimeMillis() - start)+ "ms" ); } } |
讀取數據顯示:
補充:JAVA 根據數據庫表內容生產樹結構JSON數據的實例代碼
1、利用場景
組織機構樹,通常會有組織機構表,其中有code(代碼),pcode(上級代碼),name(組織名稱)等字段
2、構造數據(以下數據并不是組織機構數據,而純屬本人胡編亂造的數據)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
List<Tree<Test>> trees = new ArrayList<Tree<Test>>(); tests.add( new Test( "0" , "" , "關于本人" )); tests.add( new Test( "1" , "0" , "技術學習" )); tests.add( new Test( "2" , "0" , "興趣" )); tests.add( new Test( "3" , "1" , "JAVA" )); tests.add( new Test( "4" , "1" , "oracle" )); tests.add( new Test( "5" , "1" , "spring" )); tests.add( new Test( "6" , "1" , "springmvc" )); tests.add( new Test( "7" , "1" , "fastdfs" )); tests.add( new Test( "8" , "1" , "linux" )); tests.add( new Test( "9" , "2" , "騎行" )); tests.add( new Test( "10" , "2" , "吃喝玩樂" )); tests.add( new Test( "11" , "2" , "學習" )); tests.add( new Test( "12" , "3" , "String" )); tests.add( new Test( "13" , "4" , "sql" )); tests.add( new Test( "14" , "5" , "ioc" )); tests.add( new Test( "15" , "5" , "aop" )); tests.add( new Test( "16" , "1" , "等等" )); tests.add( new Test( "17" , "2" , "等等" )); tests.add( new Test( "18" , "3" , "等等" )); tests.add( new Test( "19" , "4" , "等等" )); tests.add( new Test( "20" , "5" , "等等" )); |
3、源碼
Tree.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
package pers.kangxu.datautils.bean.tree; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSON; /** * tree TODO <br> * * @author kangxu2 2017-1-7 * */ public class Tree<T> { /** * 節點ID */ private String id; /** * 顯示節點文本 */ private String text; /** * 節點狀態,open closed */ private String state = "open" ; /** * 節點是否被選中 true false */ private boolean checked = false ; /** * 節點屬性 */ private List<Map<String, Object>> attributes; /** * 節點的子節點 */ private List<Tree<T>> children = new ArrayList<Tree<T>>(); /** * 父ID */ private String parentId; /** * 是否有父節點 */ private boolean isParent = false ; /** * 是否有子節點 */ private boolean isChildren = false ; public String getId() { return id; } public void setId(String id) { this .id = id; } public String getText() { return text; } public void setText(String text) { this .text = text; } public String getState() { return state; } public void setState(String state) { this .state = state; } public boolean isChecked() { return checked; } public void setChecked( boolean checked) { this .checked = checked; } public List<Map<String, Object>> getAttributes() { return attributes; } public void setAttributes(List<Map<String, Object>> attributes) { this .attributes = attributes; } public List<Tree<T>> getChildren() { return children; } public void setChildren(List<Tree<T>> children) { this .children = children; } public boolean isParent() { return isParent; } public void setParent( boolean isParent) { this .isParent = isParent; } public boolean isChildren() { return isChildren; } public void setChildren( boolean isChildren) { this .isChildren = isChildren; } public String getParentId() { return parentId; } public void setParentId(String parentId) { this .parentId = parentId; } public Tree(String id, String text, String state, boolean checked, List<Map<String, Object>> attributes, List<Tree<T>> children, boolean isParent, boolean isChildren, String parentID) { super (); this .id = id; this .text = text; this .state = state; this .checked = checked; this .attributes = attributes; this .children = children; this .isParent = isParent; this .isChildren = isChildren; this .parentId = parentID; } public Tree() { super (); } @Override public String toString() { return JSON.toJSONString( this ); } } |
BuildTree.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
package pers.kangxu.datautils.common.tree; import java.util.ArrayList; import java.util.List; import pers.kangxu.datautils.bean.tree.Tree; /** * 構建tree * TODO * <br> * @author kangxu2 2017-1-7 * */ public class BuildTree { /** * * TODO * <br> * @author kangxu2 2017-1-7 * * @param nodes * @return */ public static <T> Tree<T> build(List<Tree<T>> nodes) { if (nodes == null ){ return null ; } List<Tree<T>> topNodes = new ArrayList<Tree<T>>(); for (Tree<T> children : nodes) { String pid = children.getParentId(); if (pid == null || "" .equals(pid)) { topNodes.add(children); continue ; } for (Tree<T> parent : nodes) { String id = parent.getId(); if (id != null && id.equals(pid)) { parent.getChildren().add(children); children.setParent( true ); parent.setChildren( true ); continue ; } } } Tree<T> root = new Tree<T>(); if (topNodes.size() == 0 ) { root = topNodes.get( 0 ); } else { root.setId( "-1" ); root.setParentId( "" ); root.setParent( false ); root.setChildren( true ); root.setChecked( true ); root.setChildren(topNodes); root.setText( "頂級節點" ); } return root; } } |
BuildTreeTester.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
package pers.kangxu.datautils.test; import java.util.ArrayList; import java.util.List; import pers.kangxu.datautils.bean.tree.Tree; import pers.kangxu.datautils.common.tree.BuildTree; public class BuildTreeTester { public static void main(String[] args) { List<Tree<Test>> trees = new ArrayList<Tree<Test>>(); List<Test> tests = new ArrayList<Test>(); tests.add( new Test( "0" , "" , "關于本人" )); tests.add( new Test( "1" , "0" , "技術學習" )); tests.add( new Test( "2" , "0" , "興趣" )); tests.add( new Test( "3" , "1" , "JAVA" )); tests.add( new Test( "4" , "1" , "oracle" )); tests.add( new Test( "5" , "1" , "spring" )); tests.add( new Test( "6" , "1" , "springmvc" )); tests.add( new Test( "7" , "1" , "fastdfs" )); tests.add( new Test( "8" , "1" , "linux" )); tests.add( new Test( "9" , "2" , "騎行" )); tests.add( new Test( "10" , "2" , "吃喝玩樂" )); tests.add( new Test( "11" , "2" , "學習" )); tests.add( new Test( "12" , "3" , "String" )); tests.add( new Test( "13" , "4" , "sql" )); tests.add( new Test( "14" , "5" , "ioc" )); tests.add( new Test( "15" , "5" , "aop" )); tests.add( new Test( "16" , "1" , "等等" )); tests.add( new Test( "17" , "2" , "等等" )); tests.add( new Test( "18" , "3" , "等等" )); tests.add( new Test( "19" , "4" , "等等" )); tests.add( new Test( "20" , "5" , "等等" )); for (Test test : tests) { Tree<Test> tree = new Tree<Test>(); tree.setId(test.getId()); tree.setParentId(test.getPid()); tree.setText(test.getText()); trees.add(tree); } Tree<Test> t = BuildTree.build(trees); System.out.println(t); } } class Test { private String id; private String pid; private String text; public String getId() { return id; } public void setId(String id) { this .id = id; } public String getPid() { return pid; } public void setPid(String pid) { this .pid = pid; } public String getText() { return text; } public void setText(String text) { this .text = text; } public Test(String id, String pid, String text) { super (); this .id = id; this .pid = pid; this .text = text; } public Test() { super (); } @Override public String toString() { return "Test [id=" + id + ", pid=" + pid + ", text=" + text + "]" ; } } |
4、運行結果
JSON數據:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
|
{ "checked" : true , "children" : [ { "checked" : false , "children" : [ { "checked" : false , "children" : [ { "checked" : false , "children" : [ { "checked" : false , "children" : [], "id" : "12" , "parent" : true , "parentId" : "3" , "state" : "open" , "text" : "String" }, { "checked" : false , "children" : [], "id" : "18" , "parent" : true , "parentId" : "3" , "state" : "open" , "text" : "等等" } ], "id" : "3" , "parent" : true , "parentId" : "1" , "state" : "open" , "text" : "JAVA" }, { "checked" : false , "children" : [ { "checked" : false , "children" : [], "id" : "13" , "parent" : true , "parentId" : "4" , "state" : "open" , "text" : "sql" }, { "checked" : false , "children" : [], "id" : "19" , "parent" : true , "parentId" : "4" , "state" : "open" , "text" : "等等" } ], "id" : "4" , "parent" : true , "parentId" : "1" , "state" : "open" , "text" : "oracle" }, { "checked" : false , "children" : [ { "checked" : false , "children" : [], "id" : "14" , "parent" : true , "parentId" : "5" , "state" : "open" , "text" : "ioc" }, { "checked" : false , "children" : [], "id" : "15" , "parent" : true , "parentId" : "5" , "state" : "open" , "text" : "aop" }, { "checked" : false , "children" : [], "id" : "20" , "parent" : true , "parentId" : "5" , "state" : "open" , "text" : "等等" } ], "id" : "5" , "parent" : true , "parentId" : "1" , "state" : "open" , "text" : "spring" }, { "checked" : false , "children" : [], "id" : "6" , "parent" : true , "parentId" : "1" , "state" : "open" , "text" : "springmvc" }, { "checked" : false , "children" : [], "id" : "7" , "parent" : true , "parentId" : "1" , "state" : "open" , "text" : "fastdfs" }, { "checked" : false , "children" : [], "id" : "8" , "parent" : true , "parentId" : "1" , "state" : "open" , "text" : "linux" }, { "checked" : false , "children" : [], "id" : "16" , "parent" : true , "parentId" : "1" , "state" : "open" , "text" : "等等" } ], "id" : "1" , "parent" : true , "parentId" : "0" , "state" : "open" , "text" : "技術學習" }, { "checked" : false , "children" : [ { "checked" : false , "children" : [], "id" : "9" , "parent" : true , "parentId" : "2" , "state" : "open" , "text" : "騎行" }, { "checked" : false , "children" : [], "id" : "10" , "parent" : true , "parentId" : "2" , "state" : "open" , "text" : "吃喝玩樂" }, { "checked" : false , "children" : [], "id" : "11" , "parent" : true , "parentId" : "2" , "state" : "open" , "text" : "學習" }, { "checked" : false , "children" : [], "id" : "17" , "parent" : true , "parentId" : "2" , "state" : "open" , "text" : "等等" } ], "id" : "2" , "parent" : true , "parentId" : "0" , "state" : "open" , "text" : "興趣" } ], "id" : "0" , "parent" : false , "parentId" : "" , "state" : "open" , "text" : "關于本人" } ], "id" : "-1" , "parent" : false , "parentId" : "" , "state" : "open" , "text" : "頂級節點" } |
總結
到此這篇關于JAVA使用geotools讀取shape格式文件的方法的文章就介紹到這了,更多相關java geotools讀取shape格式內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/zhaixingzhu/p/12562689.html