JAVA使用geotools读取shape格式文件的方法

时间:2022-09-14 21:29:41

先看下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使用geotools读取shape格式文件的方法

补充: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