将SHP/GEOJSON/DXF转换成数据库数据mysql, pgsql。转换成mysql不推荐使用,数据读写慢,较大的文件需要处理较长的时间!!!推荐使用pgsql,数据转换快,在做坐标转换微调的时候无需等待较长时间!!!
POM文件引入
<dependency>
<groupId>org.gdal</groupId>
<artifactId>gdal</artifactId>
<version>3.5.0</version>
</dependency>
dxf转换成数据库代码片段,转换的时候需要用到坐标转换,需要配置系统环境变量PROJ_LIB
public boolean dxf2mysql(BaseData baseData) {
String absolutePath = baseData.getFileUrl();
String layerName = baseData.getTableName();
ogr.RegisterAll();
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
gdal.SetConfigOption("SHAPE_ENCODING", "");
gdal.SetConfigOption("DXF_FEATURE_LIMIT_PER_BLOCK", "-1");
gdal.SetConfigOption("DXF_ENCODING", "ASCII"); //设置DXF缺省编码
gdal.SetConfigOption("GDAL_DATA", gdalData);
logger.info("GDAL_DATA======>" + gdalData);
String strVectorFile = absolutePath;
DataSource ds = ogr.Open(strVectorFile, 0);
if (ds == null) {
logger.error("打开文件失败!");
return false;
}
System.out.println("打开文件成功!");
Driver SQLDriver = ogr.GetDriverByName(databaseType);
if (SQLDriver == null) {
logger.error("打开数据库驱动失败!" + databaseType);
return false;
}
System.out.println("打开数据库驱动成功!" + databaseType);
String sqlPath = "MYSQL:" + sqlDatabase + ",host=" + sqlHost + ",user=" + sqlUser + ",password=" + sqlPwd + ",port=" + sqlPort;
if ("PostgreSQL".equals(databaseType)) {
sqlPath = "PG:dbname=" + sqlDatabase + " host=" + sqlHost + " user=" + sqlUser + " password=" + sqlPwd + " port=" + sqlPort
+ " active_schema=" + sqlSchema + " tables=" + baseData.getTableName();
}
DataSource sqlDataSource = SQLDriver.Open(sqlPath, 1);
if (sqlDataSource == null) {
logger.error("打开数据库失败!");
return false;
}
SpatialReference cgcs2000 = new SpatialReference();
cgcs2000.ImportFromEPSG(4490);
Double clat = baseData.getClat() != null ? baseData.getClat() : 0.0;
Double clong = baseData.getClong() != null ? baseData.getClong() : 114.2 + 33.0 / 60.0;
Double scale = baseData.getScale() != null ? baseData.getScale() : 1.0;
Double fe = baseData.getFe() != null ? baseData.getFe() : 500000.0;
Double fn = baseData.getFn() != null ? baseData.getFn() : 0.0;
//设置椭球参数 中央纬度 , 中央经线 , 缩放 , 北向加常数 , 东向加常数
cgcs2000.SetTM(clat, clong, scale, fe, fn);
SpatialReference wgs84 = new SpatialReference();
//wgs84.ImportFromEPSG(Integer.parseInt(baseData.getEpsg()));
wgs84.ImportFromEPSG(4326);
SpatialReference wgs84Geo = wgs84.CloneGeogCS();
//创建坐标转换
CoordinateTransformation coordinateTransformation = new CoordinateTransformation(cgcs2000, wgs84Geo);
Layer oLayer = ds.GetLayerByIndex(0);
FeatureDefn srcVectorDefn = oLayer.GetLayerDefn();
//String layerName = oLayer.GetName();
SpatialReference spatialReference = oLayer.GetSpatialRef();
int wkbGeometryType = oLayer.GetGeomType();
Layer mysqlLayer = sqlDataSource.GetLayerByName(layerName);
if (mysqlLayer == null) {
Vector options = new Vector();
options.add("OVERWRITE=YES");
mysqlLayer = sqlDataSource.CreateLayer(layerName, spatialReference, ogr.wkbUnknown, options);
int fieldCount = srcVectorDefn.GetFieldCount();
for (int i = 0; i < fieldCount; i++) {
FieldDefn fieldDefn = srcVectorDefn.GetFieldDefn(i);
mysqlLayer.CreateField(fieldDefn, 1);
}
int geoFieldCount = srcVectorDefn.GetGeomFieldCount();
for (int i = 0; i < geoFieldCount; i++) {
GeomFieldDefn geomFieldDefn = srcVectorDefn.GetGeomFieldDefn(i);
try {
mysqlLayer.CreateGeomField(geomFieldDefn, 1);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
Feature feature = null;
while ((feature = oLayer.GetNextFeature()) != null) {
FeatureDefn featureDefn = mysqlLayer.GetLayerDefn();
Feature newFeature = new Feature(featureDefn);
for (int i = 0; i < srcVectorDefn.GetFieldCount(); i++) {
FieldDefn oDefn = srcVectorDefn.GetFieldDefn(i);
newFeature.SetField(i, feature.GetFieldAsString(i));
}
for (int i = 0; i < srcVectorDefn.GetGeomFieldCount(); i++) {
Geometry geometry = feature.GetGeomFieldRef(i);
geometry.Transform(coordinateTransformation);
//注意,转换为后时 纬度 经度的顺序 ,如果需要经度在前,需要交换xy
geometry.SwapXY();
geometry.CloseRings();
newFeature.SetGeometry(geometry);
}
try {
mysqlLayer.CreateFeature(newFeature);
} catch (Exception e) {
logger.error(e.getMessage());
}
}
logger.info("转换成功!");
sqlDataSource.delete();
ds.FlushCache();
ds.delete();
return true;
}
geojson转换成数据库代码片段
public boolean json2mysql(BaseData baseData) {
String absolutePath = baseData.getFileUrl();
String layerName = baseData.getTableName();
ogr.RegisterAll();
// Driver dr=ogr.GetDriverByName("CAD");
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
gdal.SetConfigOption("SHAPE_ENCODING", "");
gdal.SetConfigOption("DXF_FEATURE_LIMIT_PER_BLOCK", "-1");
gdal.SetConfigOption("DXF_ENCODING", "ASCII"); //设置DXF缺省编码
gdal.SetConfigOption("GDAL_DATA", gdalData);
logger.info("GDAL_DATA======>" + gdalData);
String strVectorFile = absolutePath;
DataSource ds = ogr.Open(strVectorFile, 0);
if (ds == null) {
logger.error("打开文件失败!");
return false;
}
System.out.println("打开文件成功!");
Driver SQLDriver = ogr.GetDriverByName(databaseType);
if (SQLDriver == null) {
logger.error("打开数据库驱动失败!" + databaseType);
return false;
}
System.out.println("打开数据库驱动成功!" + databaseType);
String sqlPath = "MYSQL:" + sqlDatabase + ",host=" + sqlHost + ",user=" + sqlUser + ",password=" + sqlPwd + ",port=" + sqlPort;
if ("PostgreSQL".equals(databaseType)) {
sqlPath = "PG:dbname=" + sqlDatabase + " host=" + sqlHost + " user=" + sqlUser + " password=" + sqlPwd + " port=" + sqlPort
+ " active_schema=" + sqlSchema + " tables=" + baseData.getTableName();
}
DataSource sqlDataSource = SQLDriver.Open(sqlPath, 1);
if (sqlDataSource == null) {
logger.error("打开数据库失败!");
return false;
}
Layer oLayer = ds.GetLayerByIndex(0);
FeatureDefn srcVectorDefn = oLayer.GetLayerDefn();
//String layerName = oLayer.GetName();
SpatialReference spatialReference = oLayer.GetSpatialRef();
int wkbGeometryType = oLayer.GetGeomType();
Layer mysqlLayer = sqlDataSource.GetLayerByName(layerName);
if (mysqlLayer == null) {
Vector options = new Vector();
options.add("OVERWRITE=YES");
// 20231130 去除图层指定类型兼容postgresql
//mysqlLayer = sqlDataSource.CreateLayer(layerName, spatialReference, wkbGeometryType, options);
mysqlLayer = sqlDataSource.CreateLayer(layerName, spatialReference, ogr.wkbUnknown, options);
int fieldCount = srcVectorDefn.GetFieldCount();
for (int i = 0; i < fieldCount; i++) {
FieldDefn fieldDefn = srcVectorDefn.GetFieldDefn(i);
mysqlLayer.CreateField(fieldDefn, 1);
}
int geoFieldCount = srcVectorDefn.GetGeomFieldCount();
for (int i = 0; i < geoFieldCount; i++) {
GeomFieldDefn geomFieldDefn = srcVectorDefn.GetGeomFieldDefn(i);
try {
mysqlLayer.CreateGeomField(geomFieldDefn, 1);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
Feature feature = null;
while ((feature = oLayer.GetNextFeature()) != null) {
FeatureDefn featureDefn = mysqlLayer.GetLayerDefn();
Feature newFeature = new Feature(featureDefn);
for (int i = 0; i < srcVectorDefn.GetFieldCount(); i++) {
FieldDefn oDefn = srcVectorDefn.GetFieldDefn(i);
newFeature.SetField(i, feature.GetFieldAsString(i));
}
for (int i = 0; i < srcVectorDefn.GetGeomFieldCount(); i++) {
Geometry geometry = feature.GetGeomFieldRef(i);
if(geometry.GetGeometryType() != 3) {
System.out.println(geometry.GetGeometryName());
System.out.println(geometry.ExportToJson());
}
newFeature.SetGeometry(geometry);
}
try {
mysqlLayer.CreateFeature(newFeature);
} catch (Exception e) {
logger.error(e.getMessage());
}
}
logger.info("转换成功!");
sqlDataSource.FlushCache();
sqlDataSource.delete();
ds.FlushCache();
ds.delete();
return true;
}
SHP转换成数据库代码片段
public boolean shp2mysql(BaseData baseData) {
String fileName = baseData.getFileName();
String shpFileName = fileName.replace(".zip", "");
String fileUrl = baseData.getFileUrl();
if (fileUrl.endsWith(".zip")) {
String descDir = fileUrl.replace(".zip", "");
File zipFile = new File(fileUrl);
Boolean unzipFlag = ZipUtils.unZipFiles(zipFile, descDir);
if (unzipFlag) {
String shpUrl = descDir + "\\" + shpFileName + "\\" + shpFileName + ".shp";
baseData.setFileUrl(shpUrl);
return json2mysql(baseData);
}
}
return false;
}