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;
}