geotools和gdal解析shp文件

geotools:
1、maven依赖添加

<!--开始:GEOTOOLS-->
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geometry</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-shapefile</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geojson</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-cql</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-data</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-opengis</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-metadata</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-main</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-api</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-data</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geometry</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-coverage</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-render</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools.xsd</groupId>
            <artifactId>gt-xsd-ows</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools.xsd</groupId>
            <artifactId>gt-xsd-filter</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools.xsd</groupId>
            <artifactId>gt-xsd-wps</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-hsql</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-extension</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-wkt</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-arcgrid</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools.ogc</groupId>
            <artifactId>net.opengis.wfs</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools.ogc</groupId>
            <artifactId>net.opengis.wps</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools.xsd</groupId>
            <artifactId>gt-xsd-fes</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools.xsd</groupId>
            <artifactId>gt-xsd-wfs</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-wkt</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <!--结束:GEOTOOLS   <geotools.version>26-RC</geotools.version>-->
import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.opengis.feature.GeometryAttribute;
import org.opengis.feature.Property;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.nio.charset.Charset;
   private List<ShpEntity> saveShp(MultipartFile file) throws IOException {
        ArrayList<ShpEntity> list = new ArrayList<>();
        ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
        File fileTemp = new File(file.getOriginalFilename());
        FileUtils.copyInputStreamToFile(file.getInputStream(), fileTemp);
        ShapefileDataStore sds = (ShapefileDataStore) dataStoreFactory.createDataStore(fileTemp.toURI().toURL());
        sds.setCharset(Charset.forName("GBK"));
        SimpleFeatureSource featureSource = sds.getFeatureSource();
        SimpleFeatureIterator iterator = featureSource.getFeatures().features();
        Property per = null;// org.opengis.feature;
        StringBuffer transformBuffer = new StringBuffer();
        while (iterator.hasNext()) {
            SimpleFeature feature = iterator.next();
            // geometry属性
            GeometryAttribute geometryAttribute = feature.getDefaultGeometryProperty();
            // 获取坐标参考系信息
            CoordinateReferenceSystem crsSource = geometryAttribute.getDescriptor().getCoordinateReferenceSystem();
            Iterator<Property> it = feature.getProperties().iterator();
            ShpEntity shpEntity = new ShpEntity();
            while (it.hasNext()) {
                per = it.next();
                //the_geom<Point id=酒店.1>=POINT (118.87316 31.32326)
                String pointName = per.toString().split("id=")[1].split(">")[0].toString();
                shpEntity.setText(pointName);
                String pointStr = per.getValue().toString();
                String point = pointStr.split("\\(")[1].split("\\)")[0].toString();
                String id = point.replace(".", "").replace(" ", "");
                shpEntity.setId(id);
                String lon = point.split(" ")[0];
                String lat = point.split(" ")[1];
                GeoPoint location = new GeoPoint(Double.valueOf(lat), Double.valueOf(lon));
                shpEntity.setLocation(location);
                list.add(shpEntity);
            }
        }
        // 会在本地产生临时文件,用完后需要删除
        if (fileTemp.exists()) {
            fileTemp.delete();
        }
        shpDao.saveAll(list);
        return list;
    }

基于geotools的geojson转geometry的工具类

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import org.geotools.geojson.geom.GeometryJSON;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.io.WKTWriter;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

public class DataTypeConvertOldUtils {
    public static Geometry geojson2Geometry(String geojson) throws IOException {
        GeometryJSON gjson = new GeometryJSON(7);
        return gjson.read(new StringReader(geojson));
    }

    public static String geometry2Geojson(Geometry geometry) throws IOException {
        GeometryJSON gjson = new GeometryJSON(7);
        StringWriter writer = new StringWriter();
        gjson.write(geometry, writer);
        return writer.toString();
    }

    public static Geometry wkt2Geometry(String wkt) throws ParseException {
        WKTReader reader = new WKTReader();
        return reader.read(wkt);
    }

    public static String geometry2Wkt(Geometry geometry) throws ParseException {
        WKTWriter writer = new WKTWriter();
        return writer.write(geometry);
    }

    /**
     * geojson 转 wtk
     *
     * @param geojson
     * @return
     * @throws Exception
     */
    public static String geojson2Wkt(String geojson) throws Exception {
        Geometry geometry = geojson2Geometry(geojson);
        return geometry2Wkt(geometry);
    }

    /**
     * wkt 转 geojson
     *
     * @param wkt
     * @return
     * @throws Exception
     */
    public static String wkt2Geojson(String wkt) throws Exception {
        Geometry geometry = wkt2Geometry(wkt);
        return geometry2Geojson(geometry);
    }

    /**
     * obj 转
     *
     * @param obj
     * @param <T>
     * @return
     */
    public static <T> String obj2StringPretty(T obj) {
        ObjectMapper mapper = new ObjectMapper();
        if (obj == null) {
            return null;
        }
        try {
            return obj instanceof String ? (String) obj : mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
        } catch (IOException e) {
            return null;
        }
    }

    public static <T> T string2Obj(String str, Class<T> clazz) {
        ObjectMapper mapper = new ObjectMapper();
        if (StringUtils.isEmpty(str) || clazz == null) {
            return null;
        }
        try {
            return clazz.equals(String.class) ? (T) str : mapper.readValue(str, clazz);
        } catch (IOException e) {
            return null;
        }
    }
}

gdal:
1、环境配置:gdal环境配置资源gdal依赖包
配置好java环境后,将上面的C:\Program Files\Java\1916-x64-gdal-3-3-0-mapserver-7-6-3\bin
拷贝到C:\Program Files\Java\jdk1.8.0_261\bin全部替换即可使用gdal
2、maven依赖

<dependency>
    <groupId>org.gdal</groupId>
    <artifactId>gdal</artifactId>
    <version>3.2.0</version>
</dependency>

3、测试代码

public HttpResponse test(MultipartFile file) throws Exception {
		//注册gdal
		ogr.RegisterAll();
        // 为了支持中文路径,请添加下面这句代码
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
        // 为了使属性表字段支持中文,请添加下面这句
        gdal.SetConfigOption("SHAPE_ENCODING", "CP936");
        Driver driver = ogr.GetDriverByName("ESRI Shapefile");
//        File fileTemp = new File(file.getOriginalFilename());
//        FileUtils.copyInputStreamToFile(file.getInputStream(), fileTemp);
//        if (fileTemp.exists()) {
//            fileTemp.delete();
//        }
        DataSource dataSource = driver.Open("C:\\Users\\EDZ\\Desktop\\库管系统\\地名地址的数据\\POI\\酒店.shp");
        List<ShpEntity> list = new ArrayList<>();
        int countLayer = dataSource.GetLayerCount();
        for (int i = 0; i < countLayer; i++) {
            Layer layer = dataSource.GetLayer(i);

            long l = layer.GetFeatureCount();
            for (long j = 0; j < l; j++) {
                Feature feature = layer.GetFeature(j);
                String lon = feature.GetFieldAsString("LON");
                String lat = feature.GetFieldAsString("LAT");
                GeoPoint location = new GeoPoint(Double.parseDouble(lon), Double.parseDouble(lat));
                String text = feature.GetFieldAsString("ADDRESSNAME");
                String point = lat+lon;
                String id = point.replace(".", "");
                ShpEntity shpEntity = new ShpEntity();
                shpEntity.setId(id);
                shpEntity.setText(text);
                shpEntity.setLocation(location);
                list.add(shpEntity);
                  /*
                * 下面注释掉的代码执行结果如下
                ID	Real	34.00000
                DOMAINNAME	String	姊妹大酒店
                POINT_X	Real	118.88477
                POINT_Y	Real	31.33563
                ADDRESS	String	凤岭社区居委会
                OPENTIME	String	
                CONTACT	String	
                PHONE	String	
                URL	String	
                ABSTRACT	String	
                IMAGE	String	
                TYPENAME	String	酒店
                CLASSID	String	1000500010000000
                YEARS	String	
                GUANLI	String	
                LABEL	String	
                * 
                * */
//                FeatureDefn featureDefn = layer.GetLayerDefn();
//                int columnCount = featureDefn.GetFieldCount();
//                for (int k = 0; k <= columnCount - 1; k++) {
//                    FieldDefn ret = featureDefn.GetFieldDefn(k);
//                    System.out.println((ret.GetName() + "\t" + ret.GetTypeName() + "\t" + feature.GetFieldAsString(ret.GetName())));
//                }
            }
        }
        return new HttpResponse((Serializable) list);
    }

附项目中代码:

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileNameUtil;
import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.gdal.ogr.*;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
private List<ShpEntity> saveShp(MultipartFile file) throws IOException, ParseException {
        File fileTemp = new File(file.getOriginalFilename());
        FileUtils.copyInputStreamToFile(file.getInputStream(), fileTemp);
        List<String> filePaths = ExcelUtil.unzipFile(fileTemp, path+"/temp");
        List<ShpEntity> list = new ArrayList<>();
        SimpleDateFormat sdfRead = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        SimpleDateFormat sdfwrite = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (String filePath : filePaths) {
            Driver driver = ogr.GetDriverByName("ESRI Shapefile");
            DataSource dataSource = driver.Open(filePath);
            int countLayer = dataSource.GetLayerCount();
            for (int i = 0; i < countLayer; i++) {
                Layer layer = dataSource.GetLayer(i);
                long l = layer.GetFeatureCount();
                for (long j = 0; j < l; j++) {
                    Feature feature = layer.GetFeature(j);
                    String lon = feature.GetFieldAsString("LON");
                    String lat = feature.GetFieldAsString("LAT");
                    GeoPoint location = new GeoPoint(Double.parseDouble(lat), Double.parseDouble(lon));
                    String text = feature.GetFieldAsString("ADDNAME");
                    String colDate = feature.GetFieldAsString("COLDATE");
                    String addCode = feature.GetFieldAsString("ADDCODE");
                    String namDate = feature.GetFieldAsString("NAMDATE");
                    String endDate = feature.GetFieldAsString("ENDDATE");
                    String name = feature.GetFieldAsString("NAME");
                    String entiId = feature.GetFieldAsString("ENTIID");
                    String clasId = feature.GetFieldAsString("CLASID");
                    String point = lon + lat;
                    String id = point.replace(".", "");
                    ShpEntity shpEntity = new ShpEntity();
                    shpEntity.setId(id);
                    shpEntity.setText(text.equals("") && null == text ? "未知" : text);
                    shpEntity.setLocation(location);
                    shpEntity.setName(name.equals("") && null == name ? "" : name);
                    shpEntity.setClasId(clasId.equals("") && null == clasId ? "" : clasId);
                    shpEntity.setAddCode(addCode.equals("") && null == addCode ? "" : addCode);
                    shpEntity.setAddName(text.equals("") && null == text ? "未知" : text);
                    Date nam = sdfRead.parse(namDate);
                    Date col = sdfRead.parse(colDate);
                    Date end = sdfRead.parse(endDate);
                    shpEntity.setNamDate(namDate.equals("") && null == namDate ? null : sdfwrite.format(nam));
                    shpEntity.setColDate(colDate.equals("") && null == colDate ? null : sdfwrite.format(col));
                    shpEntity.setEndDate(endDate.equals("") && null == endDate ? null : sdfwrite.format(end));
                    shpEntity.setEntiId(entiId.equals("") && null == entiId ? "" : entiId);
                    list.add(shpEntity);
                    feature.delete();
                }
                layer.delete();
            }
            dataSource.delete();
            FileUtil.del(filePath);
        }
        shpDao.saveAll(list);
        return list;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值