借助GeoTools来实现txt文本文件转换为shapefile
目录
1、GeoTools下载
GeoTools是一个Java GIS工具包,用于处理和映射地理空间数据的工具包。
下载地址:https://sourceforge.net/projects/geotools/files/
我下载的是最新的版本18.4版本,下载完成后首先解压一下备用。
2、测试数据
测试数据保存在txt文本文件中,数据如下所示:为一个航班数据,字段名依次为:id,number,oAirport,dAirport,routes,oProvince,oCity,dProvince,dCity,oPeriod,dPeriod,oTime,dTime,duration,oLongitude,oLatitude,dLongitude,dLatitude,type,company,flightNo,day,distance
8664 13807 上海浦东国际机场 西安咸阳国际机场 上海到西安 上海 上海 陕西 西安 14点-15点 16点-17点 14时10分 16时50分 160 121.7987735 31.15202989 108.7553259 34.44126806 JET 东方航空 MU2158 星期三 1271751.617
8678 13825 上海浦东国际机场 大连周水子国际机场 上海到大连 上海 上海 辽宁 大连 14点-15点 16点-17点 14时10分 16时15分 125 121.7987735 31.15202989 121.5390091 38.96171313 325 东方航空 MU5611 星期三 868718.2935
8754 13924 上海浦东国际机场 遵义机场 上海到遵义 上海 上海 贵州 遵义 14点-15点 17点-18点 14时20分 17时20分 180 121.7987735 31.15202989 107.2497459 27.80320661 JET 东方航空 MU5383 星期三 1455480.579
8794 13996 上海浦东国际机场 成都双流国际机场 上海到成都 上海 上海 四川 成都 14点-15点 17点-18点 14时25分 17时50分 205 121.7987735 31.15202989 103.9564263 30.58167571 JET 中国国航 CA4514 星期三 1702316.086
8813 14023 上海浦东国际机场 北京首都国际机场 上海到北京 上海 上海 北京 北京 14点-15点 16点-17点 14时25分 16时50分 145 121.7987735 31.15202989 116.6089312 40.05391563 321 东方航空 MU272 星期三 1094885.913
8913 14176 上海浦东国际机场 深圳宝安国际机场 上海到深圳 上海 上海 广东 深圳 14点-15点 17点-18点 14时35分 17时15分 160 121.7987735 31.15202989 113.8085011 22.62780861 321 东方航空 MU3453 星期三 1234535.181
9015 14329 上海浦东国际机场 青岛流亭国际机场 上海到青岛 上海 上海 山东 青岛 14点-15点 16点-17点 14时50分 16时25分 95 121.7987735 31.15202989 120.3808789 36.26650186 320 吉祥航空 HO1115 星期三 583608.0183
9066 14410 上海浦东国际机场 延吉朝阳川国际机场 上海到延吉 上海 上海 吉林 延吉 14点-15点 18点-19点 14时55分 18时00分 185 121.7987735 31.15202989 129.4481272 42.88948575 320 南方航空 CZ9507 星期三 1469684.535
9069 14419 上海浦东国际机场 烟台蓬莱国际机场 上海到烟台 上海 上海 山东 烟台 14点-15点 16点-17点 14时55分 16时45分 110 121.7987735 31.15202989 120.9912577 37.65565652 320 东方航空 MU5545 星期三 726945.8553
9201 14671 上海浦东国际机场 海口美兰国际机场 上海到海口 上海 上海 海南 海口 15点-16点 18点-19点 15时00分 18时05分 185 121.7987735 31.15202989 110.4552312 19.94215665 JET 深圳航空 ZH1973 星期三 1685540.988
9207 14680 上海浦东国际机场 长春龙嘉国际机场 上海到长春 上海 上海 吉林 长春 15点-16点 18点-19点 15时00分 18时00分 180 121.7987735 31.15202989 125.6939407 43.9918223 JET 深圳航空 ZH1975 星期三 1467938.473
9294 14842 上海浦东国际机场 沈阳桃仙国际机场 上海到沈阳 上海 上海 辽宁 沈阳 15点-16点 17点-18点 15时05分 17时40分 155 121.7987735 31.15202989 123.4880401 41.63506482 320 深圳航空 ZH5045 星期三 1175354.885
9421 15013 上海浦东国际机场 宜宾菜坝机场 上海到宜宾 上海 上海 四川 宜宾 15点-16点 18点-19点 15时25分 18时45分 200 121.7987735 31.15202989 104.5556926 28.79547272 319 南方航空 CZ9657 星期三 1679664.253
9469 15076 上海浦东国际机场 哈尔滨太平国际机场 上海到哈尔滨 上海 上海 黑龙江 哈尔滨 15点-16点 18点-19点 15时30分 18时30分 180 121.7987735 31.15202989 126.2334976 45.62144654 JET 吉祥航空 HO1167 星期三 1654001.279
9476 15085 上海浦东国际机场 重庆江北国际机场 上海到重庆 上海 上海 重庆 重庆 15点-16点 18点-19点 15时30分 18时25分 175 121.7987735 31.15202989 106.6345554 29.72071091 738 海南航空 HU7151 星期三 1461337.109
9516 15139 上海浦东国际机场 桂林两江国际机场 上海到桂林 上海 上海 广西壮族自治区 桂林 15点-16点 18点-19点 15时35分 18时20分 165 121.7987735 31.15202989 110.0517184 25.21508965 JET 上海航空 FM9377 星期三 1325956.606
9535 15166 上海浦东国际机场 武汉天河国际机场 上海到武汉 上海 上海 湖北 武汉 15点-16点 17点-18点 15时35分 17时40分 125 121.7987735 31.15202989 114.2084549 30.7656609 JET 东方航空 MU518 星期三 724897.0712
9581 15247 上海浦东国际机场 柳州白莲机场 上海到柳州 上海 上海 广西壮族自治区 柳州 15点-16点 18点-19点 15时40分 18时15分 155 121.7987735 31.15202989 109.4034117 24.2031901 JET 东方航空 MU5207 星期三 1443008.195
9605 15283 上海浦东国际机场 乌鲁木齐地窝堡国际机场 上海到乌鲁木齐 上海 上海 新疆维吾尔自治区 乌鲁木齐 15点-16点 22点-23点 15时45分 22时50分 425 121.7987735 31.15202989 87.47511044 43.90202244 738 海南航空 HU7790 星期三 3311030.678
9639 15328 上海浦东国际机场 长沙黄花国际机场 上海到长沙 上海 上海 湖南 长沙 15点-16点 17点-18点 15时45分 17时50分 125 121.7987735 31.15202989 113.2146315 28.19017886 73H 上海航空 FM9399 星期三 892011.7518
9646 15337 上海浦东国际机场 呼和浩特白塔国际机场 上海到呼和浩特 上海 上海 内蒙古自治区 呼和浩特 15点-16点 18点-19点 15时45分 18时30分 165 121.7987735 31.15202989 111.816061 40.85288036 738 海南航空 HU7790 星期三 1401527.839
9680 15382 上海浦东国际机场 珠海机场 上海到珠海 上海 上海 广东 珠海 15点-16点 18点-19点 15时45分 18时30分 165 121.7987735 31.15202989 113.3696305 22.01192578 JET 东方航空 MU9057 星期三 1316302.511
9694 15400 上海浦东国际机场 昆明长水国际机场 上海到昆明 上海 上海 云南 昆明 15点-16点 20点-21点 15时50分 20时40分 290 121.7987735 31.15202989 102.9288901 25.10164774 320 东方航空 MU5463 星期三 1965686.521
9701 15409 上海浦东国际机场 银川河东机场 上海到银川 上海 上海 宁夏回族自治区 银川 15点-16点 19点-20点 15时50分 19时10分 200 121.7987735 31.15202989 106.3854625 38.32349892 320 吉祥航空 HO1336 星期三 1615331.203
3、创建Java项目
1.在Eclipse中创建一个名为Txt2Shp
的项目,新建一个包,我这里名为com.demo.conversion
。
2.将下载好的解压好的GeoTools工具包拷贝到新建的项目当中,右键项目–>Build Path–>Configure Build Path,如下图所示对话框,选中工具包中jar包将其添加到项目中,并点击ok。
3.在包里新建一个名为SaveShape
类,代码如下:
public class SaveShape {
public void SaveLines(String filePath, List<String> pointData) {
int count=0;
try {
// 创建shape对象
File file = new File(filePath);
Map<String, Serializable> params = new HashMap<>();
params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL());
ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
// 定义图形信息和属性信息
SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
tb.setCRS(DefaultGeographicCRS.WGS84);
tb.setName("shapefile");
tb.add("the_geom", LineString.class);
tb.add("id", Integer.class);
tb.add("number", Integer.class);
tb.add("oAirport", String.class);
tb.add("dAirport", String.class);
tb.add("routes", String.class);
tb.add("oProvince", String.class);
tb.add("oCity", String.class);
tb.add("dProvince", String.class);
tb.add("dCity", String.class);
tb.add("oPeriod", String.class);
tb.add("dPeriod", String.class);
tb.add("oTime", String.class);
tb.add("dTime", String.class);
tb.add("duration", Integer.class);
tb.add("oLongitude", Double.class);
tb.add("oLatitude", Double.class);
tb.add("dLongitude", Double.class);
tb.add("dLatitude", Double.class);
tb.add("type", String.class);
tb.add("company", String.class);
tb.add("flightNo", String.class);
tb.add("day", String.class);
tb.add("distance", Double.class);
ds.createSchema(tb.buildFeatureType());
ds.setCharset(Charset.forName("GBK"));
// 设置Writer
FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0],
Transaction.AUTO_COMMIT);
for (int i = 0; i< pointData.size(); i++) {
SimpleFeature feature = writer.next();
String line = pointData.get(i);
String[] split = line.split(" ");
Integer id = Integer.valueOf(split[0]);
Integer number = Integer.valueOf(split[1]);
String oAirport = split[2];
String dAirport = split[3];
String routes = split[4];
String oProvince = split[5];
String oCity = split[6];
String dProvince = split[7];
String dCity = split[8];
String oPeriod = split[9];
String dPeriod = split[10];
String oTime = split[11];
String dTime = split[12];
Integer duration = Integer.valueOf(split[13]);
Double oLongitude = Double.valueOf(split[14]);
Double oLatitude = Double.valueOf(split[15]);
Double dLongitude = Double.valueOf(split[16]);
Double dLatitude = Double.valueOf(split[17]);
String type = split[18];
String company = split[19];
String flightNo = split[20];
String day = split[21];
Double distance = Double.valueOf(split[22]);
Coordinate[] pp = new Coordinate[] { new Coordinate(oLongitude, oLatitude),
new Coordinate(dLongitude, dLatitude) };
feature.setAttribute("the_geom", new GeometryFactory().createLineString(pp));
feature.setAttribute("id", id);
feature.setAttribute("number", number);
feature.setAttribute("oAirport", oAirport);
feature.setAttribute("dAirport", dAirport);
feature.setAttribute("routes", routes);
feature.setAttribute("oProvince", oProvince);
feature.setAttribute("oCity", oCity);
feature.setAttribute("dProvince", dProvince);
feature.setAttribute("dCity", dCity);
feature.setAttribute("oPeriod", oPeriod);
feature.setAttribute("dPeriod", dPeriod);
feature.setAttribute("oTime", oTime);
feature.setAttribute("dTime", dTime);
feature.setAttribute("duration", duration);
feature.setAttribute("oLongitude", oLongitude);
feature.setAttribute("oLatitude", oLatitude);
feature.setAttribute("dLongitude", dLongitude);
feature.setAttribute("dLatitude", dLatitude);
feature.setAttribute("type", type);
feature.setAttribute("company", company);
feature.setAttribute("flightNo", flightNo);
feature.setAttribute("day", day);
feature.setAttribute("distance", distance);
count++;
System.out.println("第" + count + "条success!");
}
System.out.println("总共" + count + "条success!");
writer.write();
writer.close();
ds.dispose();
System.out.println("******数据转线*******");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.新建一个名为ReadSaveLines
的类,用于读取文件并借助上面的方法来完成数据的转换操作,代码如下:
public class ReadSaveLines {
public static void main(String[] args)throws IOException {
//配置输入输出路径
File file = new File("D:\\data2015\\China Airplane Routes.txt");
String shapepath="D:\\data2015\\China Airplane Routes.shp";
try {
InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
@SuppressWarnings("resource")
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line ="";
//生成线集合
int number=0;
List<String> pdata = new ArrayList<>();
while((line = bufferedReader.readLine())!=null){
pdata.add(number, line);
number=number+1;
}
System.out.println("*********读取数据完毕!*********");
//保存为shapefile
SaveShape ss=new SaveShape();
ss.SaveLines(shapepath, pdata);
System.out.println("***********finish!***********");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4、执行代码并查看结果
1.执行代码后在控制台显示完成数据转换操作
2.将文件加载到ArcMap中查看,如图所示
5、出现中文乱码后的解决办法
ArcGIS10.2以上貌似都会出现此问题,解决办法是在cmd或PowerShell(windows10中PowerShell逐渐上位并取代cmd)中执行以下命令即可,我这里是10.5,大家根据自己软件的版本更改命令中的版本号即可。reg add HKEY_CURRENT_USER\Software\ESRI\Desktop10.5\Common\CodePage /v dbfDefault /t REG_SZ /d 936 /f
具体参考Esri官网的解释:https://support.esri.com/zh-cn/technical-article/000013192
关于Shapefile字符截断问题,请参见:https://blog.csdn.net/qingjianduoyun/article/details/72935395
转载自:https://blog.csdn.net/qingjianduoyun/article/details/80848938