123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551 |
- package org.jeecg.modules.demo.onemap.utils;
- import org.apache.commons.io.Charsets;
- import org.apache.commons.io.FileUtils;
- import org.geotools.data.DataStore;
- import org.geotools.data.DataStoreFinder;
- import org.geotools.data.FeatureSource;
- import org.geotools.data.FeatureWriter;
- import org.geotools.data.postgis.PostgisNGDataStoreFactory;
- import org.geotools.data.shapefile.ShapefileDataStore;
- import org.geotools.data.shapefile.ShapefileDataStoreFactory;
- import org.geotools.data.simple.SimpleFeatureIterator;
- import org.geotools.data.simple.SimpleFeatureSource;
- import org.geotools.data.store.ContentFeatureCollection;
- import org.geotools.data.store.ContentFeatureSource;
- import org.geotools.feature.FeatureCollection;
- import org.geotools.feature.FeatureIterator;
- import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
- import org.geotools.geojson.feature.FeatureJSON;
- import org.geotools.geojson.geom.GeometryJSON;
- import org.geotools.referencing.CRS;
- import org.geotools.referencing.crs.DefaultGeographicCRS;
- import org.opengis.feature.Feature;
- import org.opengis.feature.Property;
- import org.opengis.feature.simple.SimpleFeature;
- import org.opengis.feature.simple.SimpleFeatureType;
- import org.opengis.referencing.crs.CoordinateReferenceSystem;
- import java.io.*;
- import java.nio.charset.Charset;
- import java.util.*;
- import static org.geotools.data.Transaction.AUTO_COMMIT;
- import lombok.extern.slf4j.Slf4j;
- /**
- * @author wangkang
- * @email iwuang@qq.com
- * @date 2019/1/24 16:27
- */
- @Slf4j
- public class Geotools {
- private static DataStore postgisDatasore;
- /**
- * @param postgisDatasore 静态PGDatastore获取默认,实例化PGDatastore指定自定义
- */
- public Geotools(DataStore postgisDatasore) {
- if (postgisDatasore == null) {
- postgisDatasore = PGDatastore.getDefeaultDatastore();
- }
- this.postgisDatasore = postgisDatasore;
- }
- public Geotools() {
- postgisDatasore = PGDatastore.getDefeaultDatastore();
- }
- /**
- * 读取文本文件
- *
- * @param path
- * @return
- */
- public static String readTxtFile(String path) {
- StringBuilder stringBuilder = new StringBuilder();
- InputStreamReader inputStreamReader = null;
- FileInputStream inputStream = null;
- try {
- inputStream = new FileInputStream(new File(path));
- inputStreamReader = new InputStreamReader(inputStream);
- BufferedReader br = new BufferedReader(inputStreamReader);
- String s = null;
- while ((s = br.readLine()) != null) {
- stringBuilder.append(s);
- }
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- } finally {
- if (inputStream != null) {
- try {
- inputStream.close();
- } catch (IOException e) {
- log.error(e.getMessage(), e);
- }
- }
- if (inputStreamReader != null) {
- try {
- inputStreamReader.close();
- } catch (IOException e) {
- log.error(e.getMessage(), e);
- }
- }
- }
- return stringBuilder.toString();
- }
- /**
- * 解析shp坐标系
- *
- * @param prjFilePath
- * @return
- */
- public static String getShpPrjWkt(String prjFilePath) {
- String prjWkt = "";
- try {
- if (Utility.isEmpty(prjFilePath)) {
- log.error("解析shp坐标系参数无效");
- return prjWkt;
- }
- prjWkt = readTxtFile(prjFilePath);
- } catch (Exception e) {
- log.error("解析shp坐标系文件失败", e);
- }
- return prjWkt;
- }
- /**
- * 解析shp图形为wkt
- *
- * @param shpPath
- * @return
- */
- public static String shp2wkt(String shpPath) {
- String shpWkt = "";
- try {
- if (Utility.isEmpty(shpPath)) {
- log.error("解析shp为wkt参数无效");
- return shpWkt;
- }
- ShapefileDataStore shapefileDataStore = new ShapefileDataStore(new File(shpPath).toURI().toURL());
- shapefileDataStore.setCharset(Charset.forName("Utf-8"));
- FeatureCollection featureCollection = shapefileDataStore.getFeatureSource().getFeatures();
- FeatureIterator iterator = featureCollection.features();
- while (iterator.hasNext()) {
- Feature feature = iterator.next();
- Collection<Property> properties = feature.getProperties();
- Iterator<Property> propertyIterator = properties.iterator();
- while (propertyIterator.hasNext()) {
- Property property = propertyIterator.next();
- if (property.getName().toString().equals("the_geom")) {
- shpWkt = property.getValue().toString();
- System.out.println("@wkt:" + shpWkt);
- break;
- }
- }
- }
- iterator.close();
- } catch (Exception e) {
- log.error("解析shp为wkt失败", e);
- }
- return shpWkt;
- }
- /**
- * 读取shp文件属性
- *
- * @param shapePath
- * @return
- */
- public static List<Map<String, Object>> readShpFile(String shapePath) {
- List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
- ShapefileDataStoreFactory factory = new ShapefileDataStoreFactory();
- ShapefileDataStore dataStore = null;
- try {
- dataStore = (ShapefileDataStore) factory.createDataStore(new File(shapePath).toURI().toURL());
- if (dataStore != null) {
- // dataStore.setCharset(Charset.forName("UTF-8"));
- dataStore.setCharset(ShpCharset.GBK);
- }
- SimpleFeatureSource featureSource = dataStore.getFeatureSource();
- SimpleFeatureIterator itertor = featureSource.getFeatures().features();
- while (itertor.hasNext()) {
- SimpleFeature feature = itertor.next();
- Iterator<Property> itprop = feature.getProperties().iterator();
- Map<String, Object> map = new HashMap<String, Object>();
- while (itprop.hasNext()) {
- Property prop = itprop.next();
- map.put(String.valueOf(prop.getName()), String.valueOf(prop.getValue()));
- }
- list.add(map);
- }
- itertor.close();
- } catch (Exception e) {
- log.error("解析shp异常:", e.getMessage());
- } finally {
- if(dataStore != null) {
- dataStore.dispose();
- }
- }
- return list;
- }
- /**
- * 通用,要素集写入postgis
- *
- * @param featureCollection
- * @param pgtableName postgis创建的数据表
- * @return
- */
- public static boolean write2pg(String id, FeatureCollection featureCollection, String pgtableName) {
- boolean result = false;
- try {
- if (Utility.isEmpty(featureCollection) || Utility.isEmpty(pgtableName)) {
- log.error("参数无效");
- return result;
- }
- SimpleFeatureType simpleFeatureType = (SimpleFeatureType) featureCollection.getSchema();
- // SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder();
- // typeBuilder.init(simpleFeatureType);
- // typeBuilder.setName(pgtableName);
- // SimpleFeatureType newtype = typeBuilder.buildFeatureType();
- // postgisDatasore.createSchema(newtype);
- System.out.println("simpleFeatureType:" + simpleFeatureType);
- FeatureIterator iterator = featureCollection.features();
- FeatureWriter<SimpleFeatureType, SimpleFeature> featureWriter = postgisDatasore.getFeatureWriterAppend(pgtableName, AUTO_COMMIT);
- while (iterator.hasNext()) {
- Feature feature = iterator.next();
- SimpleFeature simpleFeature = featureWriter.next();
- Collection<Property> properties = feature.getProperties();
- Iterator<Property> propertyIterator = properties.iterator();
- while (propertyIterator.hasNext()) {
- Property property = propertyIterator.next();
- if (property.getName().toString().equals("the_geom")) {
- simpleFeature.setAttribute("geom", property.getValue());
- System.out.println(property.getValue());
- } else if (property.getName().toString().equals("Id")) {
- continue;
- // simpleFeature.setAttribute("id", property.getValue());
- } else
- // continue;
- simpleFeature.setAttribute(property.getName().toString(), property.getValue());
- }
- System.out.println(simpleFeature);
- // simpleFeature.setAttribute("id", id);
- System.out.println(featureWriter);
- featureWriter.write();
- // simpleFeature.write();
- }
- iterator.close();
- featureWriter.close();
- } catch (Exception e) {
- log.error("失败", e);
- }
- return false;
- }
- /**
- * featureCollection写入到shp的datastore
- *
- * @param featureCollection
- * @param shpDataStore
- * @param geomFieldName featureCollectio中的矢量字段,postgis可以修改使用不同的表名,默认为geom
- * @return
- */
- public static boolean write2shp(FeatureCollection featureCollection, ShapefileDataStore shpDataStore, String geomFieldName) {
- boolean result = false;
- if (Utility.isEmpty(geomFieldName)) {
- geomFieldName = featureCollection.getSchema().getGeometryDescriptor().getType().getName().toString();
- }
- try {
- FeatureIterator<SimpleFeature> iterator = featureCollection.features();
- //shp文件存储写入
- FeatureWriter<SimpleFeatureType, SimpleFeature> featureWriter = shpDataStore.getFeatureWriter(shpDataStore.getTypeNames()[0], AUTO_COMMIT);
- while (iterator.hasNext()) {
- Feature feature = iterator.next();
- SimpleFeature simpleFeature = featureWriter.next();
- Collection<Property> properties = feature.getProperties();
- Iterator<Property> propertyIterator = properties.iterator();
- while (propertyIterator.hasNext()) {
- Property property = propertyIterator.next();
- if (property.getName().toString().equalsIgnoreCase(geomFieldName)) {
- simpleFeature.setAttribute("the_geom", property.getValue());
- } else {
- simpleFeature.setAttribute(property.getName().toString(), property.getValue());
- }
- }
- featureWriter.write();
- }
- iterator.close();
- featureWriter.close();
- shpDataStore.dispose();
- } catch (Exception e) {
- log.error("失败", e);
- }
- return false;
- }
- /**
- * 方法重载,默认使用UTF-8的Shp文件
- *
- * @param geojsonPath
- * @param shpfilepath
- * @return
- */
- public boolean geojson2shp(String geojsonPath, String shpfilepath) {
- return geojson2shp(geojsonPath, shpfilepath, ShpCharset.UTF_8);
- }
- /**
- * Geojson转成shpfile文件
- *
- * @param geojsonPath
- * @param shpfilepath
- * @return
- */
- public boolean geojson2shp(String geojsonPath, String shpfilepath, Charset shpChart) {
- boolean result = false;
- try {
- Utility.valiFileForRead(geojsonPath);
- FeatureJSON featureJSON = new FeatureJSON();
- featureJSON.setEncodeNullValues(true);
- FeatureCollection featureCollection = featureJSON.readFeatureCollection(new InputStreamReader(new FileInputStream(geojsonPath), "UTF-8"));
- File file = new File(shpfilepath);
- Map<String, Serializable> params = new HashMap<String, Serializable>();
- params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL());
- ShapefileDataStore shpDataStore = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
- //postgis获取的Featuretype获取坐标系代码
- SimpleFeatureType pgfeaturetype = (SimpleFeatureType) featureCollection.getSchema();
- SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder();
- typeBuilder.init(pgfeaturetype);
- typeBuilder.setCRS(DefaultGeographicCRS.WGS84);
- pgfeaturetype = typeBuilder.buildFeatureType();
- //设置成utf-8编码
- shpDataStore.setCharset(shpChart);
- shpDataStore.createSchema(pgfeaturetype);
- write2shp(featureCollection, shpDataStore, "");
- result = true;
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- return result;
- }
- /**
- * geojson文件写入到postgis里
- *
- * @param geojsonPath
- * @param pgtableName
- * @return
- */
- public boolean geojson2pgtable(String id, String geojsonPath, String pgtableName) {
- boolean result = false;
- try {
- if (Utility.isEmpty(geojsonPath) || Utility.isEmpty(pgtableName)) {
- return result;
- }
- FeatureJSON featureJSON = new FeatureJSON();
- FeatureCollection featureCollection = featureJSON.readFeatureCollection(new FileInputStream(geojsonPath));
- write2pg(id, featureCollection, pgtableName);
- result = true;
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- return result;
- }
- /**
- * 重载方法,默认UTF-8编码SHP文件
- *
- * @param shpPath
- * @param geojsonPath
- * @return
- */
- public boolean shp2geojson(String shpPath, String geojsonPath) {
- return shp2geojson(shpPath, geojsonPath, ShpCharset.UTF_8);
- }
- /**
- * shp转成geojson,保留15位小数
- *
- * @param shpPath shp的路径
- * @param geojsonPath geojson的路径
- * @return
- */
- public boolean shp2geojson(String shpPath, String geojsonPath, Charset shpCharset) {
- boolean result = false;
- try {
- if (!Utility.valiFileForRead(shpPath) || Utility.isEmpty(geojsonPath)) {
- return result;
- }
- ShapefileDataStore shapefileDataStore = new ShapefileDataStore(new File(shpPath).toURI().toURL());
- shapefileDataStore.setCharset(shpCharset);
- ContentFeatureSource featureSource = shapefileDataStore.getFeatureSource();
- ContentFeatureCollection contentFeatureCollection = featureSource.getFeatures();
- FeatureJSON featureJSON = new FeatureJSON(new GeometryJSON(15));
- Utility.valiFileForWrite(geojsonPath);
- featureJSON.writeFeatureCollection(contentFeatureCollection, new File(geojsonPath));
- shapefileDataStore.dispose();
- result = true;
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- return result;
- }
- public boolean shp2pgtable(String id, String shpPath, String pgtableName) {
- return shp2pgtable(id, shpPath, pgtableName, ShpCharset.GBK);
- }
- /**
- * shpfile文件导入到postgis中
- *
- * @param shpPath
- * @param pgtableName
- * @return
- */
- public boolean shp2pgtable(String id, String shpPath, String pgtableName, Charset shpCharset) {
- boolean result = false;
- try {
- ShapefileDataStore shapefileDataStore = new ShapefileDataStore(new File(shpPath).toURI().toURL());
- shapefileDataStore.setCharset(shpCharset);
- FeatureCollection featureCollection = shapefileDataStore.getFeatureSource().getFeatures();
- write2pg(id, featureCollection, pgtableName);
- result = true;
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- return result;
- }
- /**
- * postgis数据表导出到成shpfile
- *
- * @param pgtableName
- * @param shpPath
- * @param geomField postgis里的字段
- * @return
- */
- public boolean pgtable2shp(String pgtableName, String shpPath, String geomField) {
- boolean result = false;
- try {
- FeatureSource featureSource = postgisDatasore.getFeatureSource(pgtableName);
- // 初始化 ShapefileDataStore
- File file = new File(shpPath);
- Map<String, Serializable> params = new HashMap<String, Serializable>();
- params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL());
- ShapefileDataStore shpDataStore = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
- //postgis获取的Featuretype获取坐标系代码
- SimpleFeatureType pgfeaturetype = ((SimpleFeatureSource) featureSource).getSchema();
- String srid = pgfeaturetype.getGeometryDescriptor().getUserData().get("nativeSRID").toString();
- SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder();
- typeBuilder.init(pgfeaturetype);
- if (!srid.equals("0")) {
- CoordinateReferenceSystem crs = CRS.decode("EPSG:" + srid, true);
- typeBuilder.setCRS(crs);
- }
- pgfeaturetype = typeBuilder.buildFeatureType();
- //设置成utf-8编码
- shpDataStore.setCharset(Charset.forName("UTF-8"));
- shpDataStore.createSchema(pgfeaturetype);
- write2shp(featureSource.getFeatures(), shpDataStore, geomField);
- result = true;
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- return result;
- }
- /**
- * postgis指定的数据表转成geojson文件保留15位小数
- *
- * @param pgtableName 表名
- * @param geojsonpath geojson存放位置
- * @return
- */
- public boolean pgtable2geojson(String pgtableName, String geojsonpath) {
- boolean result = false;
- try {
- FeatureSource featureSource = postgisDatasore.getFeatureSource(pgtableName);
- FeatureCollection featureCollection = featureSource.getFeatures();
- FeatureJSON featureJSON = new FeatureJSON(new GeometryJSON(15));
- featureJSON.setEncodeNullValues(true);
- String s = featureJSON.toString(featureCollection);
- FileUtils.writeStringToFile(new File(geojsonpath), s, Charsets.toCharset("utf-8"), false);
- result = true;
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- return result;
- }
- public boolean deletePgtable(String pgtableName) {
- boolean result = false;
- try {
- postgisDatasore.removeSchema(pgtableName);
- result = true;
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- return result;
- }
- /*
- // 测试调试专用,成功清除所有的sw开头的表(用来存储矢量数据的表)
- public boolean clearSWTable() throws Exception {
- postgisDatasore.removeSchema();
- //relkind char r = 普通表,i = 索 引, S = 序列,v = 视 图, m = 物化视图, c = 组合类型,t = TOAST表, f = 外部 表
- String strtables = " select string_agg(relname ,\',\') from pg_class where relname like \'%sw_%\' and relkind=\'r\' ";
- List list = postgisDatasore.getSessionFactory().getCurrentSession().createQuery(strtables).list();
- list.get(0).toString();
- Integer integer = 0;
- if (list.size() > 0) {
- integer = temp.getSessionFactory().getCurrentSession().createQuery("drop table " + strtables).executeUpdate();
- }
- // 与表有关联的其他序列自动删除
- String sequence = " select string_agg(relname ,\',\') from pg_class where relname like \'%sw_%\' and relkind=\'S\' and relname!=\'txsw_seq\'";
- resultSet = st.executeQuery(sequence);
- while (resultSet.next()) {
- sequence = resultSet.getString(1);
- }
- System.out.println("所有非txsw_seq的序列:" + sequence);
- i = st.executeUpdate("drop SEQUENCE " + strtables);
- return integer == 0 ? true : false;
- }
- */
- public static boolean testCreatFeature(String featurePath) {
- boolean result = false;
- try {
- result = true;
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- return result;
- }
- }
|