Wechat: yu389741| Email: gisdqy@163.com

Shop:https://www.giserdqy.com/shop

借助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