geotools将shp文件中图层数据存入Mysql

一、将geotools依赖下载

geotools的依赖很难下载下来,下面提供两种下载方法

1、在pom.xml文件中指定下载地址(这也是geotools官网中推荐的下载方法,但是有时候这种方法并不能下载下来)

<!--geotools指定的下载地址-->
<repositories>
      <repository>
        <id>osgeo</id>
        <name>OSGeo Release Repository</name>
        <url>https://repo.osgeo.org/repository/release/</url>
        <snapshots><enabled>false</enabled></snapshots>
        <releases><enabled>true</enabled></releases>
      </repository>
      <repository>
        <id>osgeo-snapshot</id>
        <name>OSGeo Snapshot Repository</name>
        <url>https://repo.osgeo.org/repository/snapshot/</url>
        <snapshots><enabled>true</enabled></snapshots>
        <releases><enabled>false</enabled></releases>
      </repository>
    </repositories>

<dependencies>
	<!--geotools 27-SNAPSHOT 依赖-->
    <dependency>
           <groupId>org.geotools</groupId>
           <artifactId>gt-shapefile</artifactId>
           <version>27-SNAPSHOT</version>
       </dependency>
       <dependency>
           <groupId>org.geotools</groupId>
           <artifactId>gt-swing</artifactId>
           <version>27-SNAPSHOT</version>
       </dependency>
</dependencies>

2、如果第一种方法不行,则用这种;在maven的settings.xml中修改镜像地址(xml文件在你maven安装包下的conf文件里;这个方法亲测有效

<!-- 将此镜像地址放到setttings.xml的<mirrors></mirrors>标签里 -->
<!-- 下面这个镜像的id、name、url就是上面第一个方法里指定的第一个下载地址 -->
<mirrors>
	<mirror>
		<id>osgeo</id>
        <name>OSGeo Release Repository</name>
        <url>https://repo.osgeo.org/repository/release/</url>
	</mirror>
</mirrors>

二、代码

百度有很多这样的,大差不差

package com.hwhy.hainangismanager.common.utils.gis;

import lombok.extern.slf4j.Slf4j;
import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.FeatureWriter;
import org.geotools.data.Transaction;
import org.geotools.data.mysql.MySQLDataStoreFactory;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.geotools.jdbc.JDBCDataStore;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.io.WKTReader;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;

import java.io.File;
import java.nio.charset.Charset;


@Slf4j
public class ShpToMysql {
    
    


    /**
     * 读取shp文件
     *
     * @param file shp文件
     * @return
     */
    public static SimpleFeatureSource readSHP(File file) {
    
    
        SimpleFeatureSource featureSource = null;

        ShapefileDataStore shpDataStore = null;
        try {
    
    
            //File file = new File(shpfilePath);

            shpDataStore = new ShapefileDataStore(file.toURL());

            /*URL url = new URL(file.getAbsolutePath());
            shpDataStore = new ShapefileDataStore(url);*/
            //设置编码
            Charset charset = Charset.forName("UTF8");
            shpDataStore.setCharset(charset);
            String tableName = shpDataStore.getTypeNames()[0];
            featureSource = shpDataStore.getFeatureSource(tableName);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            shpDataStore.dispose();
        }
        return featureSource;
    }


    /**
     * 连接mysql数据库
     *
     * @param host
     * @param dataBase
     * @param port
     * @param userName
     * @param pwd
     * @return
     */
    public static JDBCDataStore connnection2mysql(String host, String dataBase, int port, String userName, String pwd) {
    
    
        JDBCDataStore ds = null;
        DataStore dataStore = null;
        //连接数据库参数
        java.util.Map params = new java.util.HashMap();
        params.put(MySQLDataStoreFactory.DBTYPE.key, "mysql");
        params.put(MySQLDataStoreFactory.HOST.key, host);
        params.put(MySQLDataStoreFactory.PORT.key, port);
        params.put(MySQLDataStoreFactory.DATABASE.key, dataBase);
        params.put(MySQLDataStoreFactory.USER.key, userName);
        params.put(MySQLDataStoreFactory.PASSWD.key, pwd);
        try {
    
    
            dataStore = DataStoreFinder.getDataStore(params);
            if (dataStore != null) {
    
    
                ds = (JDBCDataStore) dataStore;
                System.out.println(dataBase + "连接成功");
            } else {
    
    

                System.out.println(dataBase + "连接失败");
            }

        } catch (Exception e) {
    
    
            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        return ds;
    }


    /**
     * 创建表格
     *
     * @param ds
     * @param featureSource
     * @return
     */
    public static JDBCDataStore createTable(JDBCDataStore ds, SimpleFeatureSource featureSource) {
    
    
        SimpleFeatureType schema = featureSource.getSchema();
        try {
    
    
            //创建数据表
            ds.createSchema(schema);

        } catch (Exception e) {
    
    

            e.printStackTrace();
        } finally {
    
    
            //ds.dispose();
        }
        return ds;
    }


    /**
     * 写入数据
     *
     * @param ds
     * @param featureSource
     * @param tableName     这里是指创建的表的名称,不想传也可以用featureSource.getSchema().getTypeName()来获取
     */
    public static void writeShp2Mysql(JDBCDataStore ds, SimpleFeatureSource featureSource, String tableName) {
    
    
        //开始写入数据
        SimpleFeatureIterator features = null;
        try {
    
    
            FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(tableName, Transaction.AUTO_COMMIT);
            SimpleFeatureCollection featureCollection = featureSource.getFeatures();
            features = featureCollection.features();
            while (features.hasNext()) {
    
    
                try {
    
    
                    writer.hasNext();
                    SimpleFeature next = writer.next();
                    SimpleFeature feature = features.next();
                    for (int i = 0; i < feature.getAttributeCount(); i++) {
    
    
                        next.setAttribute(i, feature.getAttribute(i));
                    }
                    writer.write();
                } catch (Exception e) {
    
    
                    e.printStackTrace();
                    log.error("添加数据的方法:" + e.toString());
                    continue;
                }
            }
            writer.close();
            log.info("导入成功");
        } catch (Exception e) {
    
    
            e.printStackTrace();
            log.error("添加数据的方法有误,错误为:" + e.toString());
        } finally {
    
    
            ds.dispose();
            features.close();
        }
    }

}

Guess you like

Origin blog.csdn.net/qq_45697944/article/details/108447329