Infrastructure/OpenAuth.App/ServiceApp/LayerManagerApp/LayerApp.cs

1822 lines
68 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Data;
using System.IO.Compression;
using System.Text;
using DocumentFormat.OpenXml.InkML;
using Infrastructure;
using Infrastructure.Utils;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using NetTopologySuite;
using NetTopologySuite.Features;
using NetTopologySuite.Geometries;
using NetTopologySuite.IO;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using OpenAuth.App.BaseApp.Base;
using OpenAuth.App.FormScheme.FormHelpers;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.App.ServiceApp.LayerManagerApp.Request;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using SqlSugar;
using Shapefile = NetTopologySuite.IO.Esri.Shapefile;
namespace OpenAuth.App.ServiceApp.LayerManagerApp;
public class LayerApp : SqlSugarBaseApp<DmLayer, SugarDbContext>
{
private readonly string _filePath;
private readonly ISqlSugarClient _client;
public LayerApp(ISugarUnitOfWork<SugarDbContext> unitWork,
ISimpleClient<DmLayer> repository, IAuth auth,
IOptions<AppSetting> setOptions, ISqlSugarClient client) : base(unitWork, repository, auth)
{
_client = client;
_filePath = setOptions.Value.UploadPath;
if (string.IsNullOrEmpty(_filePath))
{
_filePath = AppContext.BaseDirectory;
}
}
public async Task<Response<bool>> UploadExcel(LayerReq req)
{
using var db = Repository.AsSugarClient();
var excelPath = Path.Combine(_filePath, req.FilePath);
// excel名称
var excelFileName = Path.GetFileNameWithoutExtension(excelPath);
// 使用NPOI读取Excel文件
using (var fileStream = new FileStream(excelPath, FileMode.Open, FileAccess.Read))
{
IWorkbook workbook;
if (Path.GetExtension(excelPath).Equals(".xls"))
{
workbook = new HSSFWorkbook(fileStream);
}
else
{
workbook = new XSSFWorkbook(fileStream);
}
//
var sheet = workbook.GetSheetAt(0);
// 获取总行数
var rowCount = sheet.LastRowNum;
if (rowCount < 3)
{
throw new Exception("只有两行表头");
}
// 获取总列数
var columnCount = sheet.GetRow(0).LastCellNum;
var headers = new List<DataTableAttr>();
// 遍历表头
var chineseRow = sheet.GetRow(0);
var englishRow = sheet.GetRow(1);
for (var j = 0; j < columnCount; j++)
{
var header = new DataTableAttr
{
InitName = chineseRow.GetCell(j).ToString(), // 中文表头
RefName = englishRow.GetCell(j).ToString()?.ToLower(), // 英文表头
// 字段类型
Type = "string",
// 原始字段名称
Name = englishRow.GetCell(j).ToString(),
// 字段长度
Length = 64
};
headers.Add(header);
}
var keys = headers.Select(a => a.RefName).ToList();
if (!keys.Contains("lng") || !keys.Contains("lat"))
{
throw new Exception("缺少经纬度字段");
}
var typeBuilder = db.DynamicBuilder().CreateClass(req.DataTable,
new SugarTable() { TableName = req.DataTable, TableDescription = req.ServerName + "图斑" });
//添加主键
typeBuilder.CreateProperty("id", typeof(string), new SugarColumn()
{
IsPrimaryKey = true,
IsIdentity = false,
ColumnDataType = "varchar",
Length = 36,
ColumnDescription = "主键",
});
//添加主键
typeBuilder.CreateProperty("geometry", typeof(string), new SugarColumn()
{
IsPrimaryKey = false,
IsIdentity = false,
// ColumnDataType = "geometry(GEOMETRY)",
ColumnDataType = string.Concat("geometry(GEOMETRY,",
req.SpatialRef.AsSpan(req.SpatialRef.LastIndexOf(":", StringComparison.Ordinal) + 1),
")"),
ColumnDescription = "图斑",
});
headers.ForEach(u =>
{
if (!u.RefName.Equals("lng") && !u.RefName.Equals("lat"))
{
typeBuilder.CreateProperty(u.RefName, typeof(string), new SugarColumn()
{
IsPrimaryKey = false,
IsIdentity = false,
IsNullable = true,
Length = u.Length,
ColumnDescription = u.InitName,
});
}
});
// 开启事务
await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted);
// 创建表
//db.CodeFirst.InitTables(typeBuilder.BuilderType());
var cols = new string[headers.Count];
for (var i = 0; i < headers.Count; i++)
{
if (headers[i].RefName.Equals("lng"))
{
cols[i] = "geometry";
}
else if (headers[i].RefName.Equals("lat"))
{
cols[i] = "id";
}
else
{
cols[i] = headers[i].RefName;
}
}
var objs = new List<Dictionary<string, object>>(1001);
var num = 0;
// 遍历数据行
for (var i = 2; i < rowCount; i++)
{
var row = sheet.GetRow(i);
if (row == null)
{
continue;
}
var data = new Dictionary<string, object>();
// 遍历列
string lat = null, lng = null;
for (var j = 0; j < columnCount; j++)
{
var cell = row.GetCell(j);
if (cell == null)
{
continue;
}
var cellValue = cell.ToString();
switch (headers[j].RefName)
{
case "lat":
lat = cellValue;
continue;
case "lng":
lng = cellValue;
continue;
default:
data[headers[j].RefName] = cellValue;
break;
}
}
if (lat != null && lng != null)
{
var geography =
NtsGeometryServices.Instance.CreateGeometryFactory(
int.Parse(req.SpatialRef.Substring(
req.SpatialRef.IndexOf(":", StringComparison.Ordinal) + 1)));
var point = geography.CreatePoint(new Coordinate(double.Parse(lng), double.Parse(lat)));
data["geometry"] = point.AsText();
}
data["id"] = Guid.NewGuid().ToString();
objs.Add(data);
if (num++ == 999)
{
await db.Insertable(objs)
.AS(req.DataTable) // 指定目标表名
.InsertColumns(cols) // 指定要插入的列
.ExecuteCommandAsync();
num = 0;
objs.Clear();
}
}
await db.Insertable(objs)
.AS(req.DataTable) // 指定目标表名
.InsertColumns(cols) // 指定要插入的列
.ExecuteCommandAsync();
await db.Ado.CommitTranAsync();
workbook.Close();
// 关于图层发布失败后,如何处理?
// excel 矢量点发布图层
var response = await GeoUtil.CreateStoreAndLayer("", req.SpatialRef, req.DataTable, "");
// todo 保存图层信息
var dmLayer = new DmLayer()
{
Id = Guid.NewGuid().ToString(),
SeverName = req.ServerName,
SpatialRef = req.SpatialRef,
SeverType = req.SeverType, // 服务类型
StoreType = "", //存储类型
DataSourceType = req.DataSourceType,
TableRef = req.DataTable,
ShapeType = req.ShapeType,
StyleName = req.StyleName, // 样式名称
Description = req.Description, // 描述
Screenshot = req.Screenshot // 截图
};
await Repository.AsSugarClient().Insertable(dmLayer).ExecuteCommandAsync();
}
return new Response<bool>
{
Result = true
};
}
public async Task<Response<bool>> UploadShape(LayerReq req)
{
try
{
}
catch (Exception ex)
{
throw new CommonException(ex.Message, 500);
}
return new Response<bool>
{
Result = true
};
}
public Response<Dictionary<string, object>> TableDataByTableName(string tablename, string type, string keyword, string keyvalue, int page, int pagesize)
{
Dictionary<string, object> result = new Dictionary<string, object>();
// string sql = $"select column_name as name from INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'public' AND table_name ='" + tablename + "'";
string sqlcom = $"SELECT \r\n\r\n\r\n c.column_name AS \"columnName\", pgd.description AS \"comment\" \r\nFROM \r\n information_schema.columns c\r\nLEFT JOIN \r\n " +
$"pg_catalog.pg_description pgd ON pgd.objoid = c.table_name::regclass::oid \r\n AND pgd.objsubid = c.ordinal_position\r\nWHERE \r\n c.table_name ='" + tablename + "';";
//var cloumnlist = _client.Ado.SqlQuery<string>(sql);
var coment = _client.Ado.SqlQuery<dynamic>(sqlcom);
//result.Add("head", cloumnlist);
result.Add("headName", coment);
string names = "";
string geoms = "";
for (int i = 0; i < coment.Count; i++)
{
var name = coment[i].columnName;
if (name.Contains("geom"))
{
geoms = name;
}
else
{
names = names + "\"" + name + "\",";
}
}
string sql1 = $"select " + names + "ST_AsText(" + geoms + ") as " + geoms + $" from " + tablename + " where 1=1 ";
string sql2 = "";
if (string.IsNullOrEmpty(keyword) || string.IsNullOrEmpty(keyvalue))
{
sql1 = sql1 + "limit " + pagesize + " offset " + (page - 1) * pagesize;
}
else
{
sql1 = sql1 + " and " + keyword + " like '%" + keyvalue + "%'" + "limit " + pagesize + " offset " + (page - 1) * pagesize;
sql2 = " and " + keyword + " like '%" + keyvalue + "%'";
}
string sqlcount = $"select count(*) from " + tablename + " where 1=1 ";
var count = _client.Ado.GetInt(sqlcount + sql2);
var result1 = _client.Ado.SqlQuery<dynamic>(sql1);
result.Add("data", result1);
result.Add("total", count);
return new Response<Dictionary<string, object>>
{
Result = result
};
}
public Response<MemoryStream> TempeleteByTableName(string tablename, int type, string shpFilePath, string shpFilePathzip)
{
Response<MemoryStream> response = new Response<MemoryStream>();
string sql = $"select column_name as name from INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'public' AND table_name ='" + tablename + "'";
var cloumnlist = _client.Ado.SqlQuery<string>(sql);
if (type == 0)
{
try
{
HSSFWorkbook workbook = new HSSFWorkbook();
IFont font = workbook.CreateFont(); //创建一个字体样式对象
font.FontName = "Microsoft YaHei"; //和excel里面的字体对应
font.Boldweight = (short)FontBoldWeight.Bold; //字体加粗
font.FontHeightInPoints = 12; //字体大小
ICellStyle style1 = workbook.CreateCellStyle(); //创建样式对象
style1.BorderBottom = BorderStyle.Thin;
style1.BorderLeft = BorderStyle.Thin;
style1.BorderRight = BorderStyle.Thin;
style1.BorderTop = BorderStyle.Thin;
style1.Alignment = HorizontalAlignment.Center;
style1.VerticalAlignment = VerticalAlignment.Center;
style1.SetFont(font); //将字体样式赋给样式对象
// 创建一个数值格式的CellStyle
ICellStyle numericStyle = workbook.CreateCellStyle();
// 创建一个数据格式对象
IDataFormat dataFormat = workbook.CreateDataFormat();
var font11 = workbook.CreateFont();
font11.FontName = "Microsoft YaHei";
font11.FontHeightInPoints = 12;
// 设置单元格格式为数值型
numericStyle.DataFormat = dataFormat.GetFormat("0.00");
numericStyle.BorderBottom = BorderStyle.Thin;
numericStyle.BorderLeft = BorderStyle.Thin;
numericStyle.BorderRight = BorderStyle.Thin;
numericStyle.BorderTop = BorderStyle.Thin;
numericStyle.Alignment = HorizontalAlignment.Center;
numericStyle.VerticalAlignment = VerticalAlignment.Center;
numericStyle.SetFont(font11);
ISheet sheet = workbook.CreateSheet("Sheet0");
IRow rowHeader = sheet.CreateRow(0);
rowHeader.Height = 20 * 30;
for (int i = 0; i < cloumnlist.Count + 1; i++)
{
if (i == cloumnlist.Count)
{
rowHeader.CreateCell(i);
rowHeader.Cells[i].CellStyle = style1;
rowHeader.Cells[i].SetCellValue("lng");
}
else
{
var header = cloumnlist[i];
if (header.Contains("geom"))
{
rowHeader.CreateCell(i);
rowHeader.Cells[i].CellStyle = style1;
rowHeader.Cells[i].SetCellValue("lat");
}
else
{
rowHeader.CreateCell(i);
rowHeader.Cells[i].CellStyle = style1;
rowHeader.Cells[i].SetCellValue(header);
}
}
}
response.Result = new MemoryStream();
workbook.Write(response.Result);
workbook = null;
response.Result.Close();
response.Result.Dispose();
response.Code = 200;
response.Message = "获取成功";
}
catch (Exception ex)
{
response.Code = 500;
response.Message = ex.Message;
}
}
if (type == 1)
{
List<IFeature> features = new List<IFeature>();
var attributes = new AttributesTable();
string wkt = "POINT(117.968055555555 35.4761111111111)";
var geometry = ParseGeometry(wkt);
for (int i = 0; i < cloumnlist.Count; i++)
{
var header = cloumnlist[i];
if (header.Contains("geom"))
{
continue;
}
attributes.Add(header, 11);
}
IFeature feature = new Feature(geometry, attributes);
features.Add(feature);
// 导出 SHP 文件及其关联文件
ExportToShapefileFour(shpFilePath, features);
// 将文件打包成 ZIP
CreateZipFromShapefiles(shpFilePath, shpFilePathzip);
}
return response;
}
public Geometry ParseGeometry(string wkt)
{
if (string.IsNullOrEmpty(wkt))
{
return null;
}
var reader = new WKTReader();
return reader.Read(wkt);
}
public void ExportToShapefileFour(string shpPath, List<IFeature> features)
{
//var geometryFactory = new GeometryFactory();
//// 写入 CPG 文件(定义字符编码)
//var cpgPath = System.IO.Path.ChangeExtension(shpPath, "cpg");
//File.WriteAllText(cpgPath, "UTF-8", Encoding.UTF8);
//// 获取 SHP 文件头
//var header = ShapefileDataWriter.GetHeader(features[0], features.Count);
//// 创建 ShapefileDataWriter
//var shapeFileWriter = new ShapefileDataWriter(shpPath, geometryFactory)
//{
// Header = header
//};
//// 写入 SHP 文件
//shapeFileWriter.Write(features);
// 写入 CPG 文件(定义字符编码)
string prjStr =
@"GEOGCS[""GCS_China_Geodetic_Coordinate_System_2000"",DATUM[""D_China_2000"",SPHEROID[""CGCS2000"",6378137.0,298.257222101]],PRIMEM[""Greenwich"",0.0],UNIT[""Degree"",0.0174532925199433]]";
var cpgPath = Path.ChangeExtension(shpPath, "prj");
File.WriteAllText(cpgPath, prjStr, Encoding.UTF8);
Shapefile.WriteAllFeatures(features, shpPath, encoding: Encoding.UTF8);
}
public void CreateZipFromShapefiles(string shpPath, string zipPath)
{
var files = new List<string>
{
Path.ChangeExtension(shpPath, "cpg"),
shpPath,
Path.ChangeExtension(shpPath, "shx"),
Path.ChangeExtension(shpPath, "dbf"),
Path.ChangeExtension(shpPath, "prj")
};
using (var zipArchive = ZipFile.Open(zipPath, ZipArchiveMode.Create))
{
foreach (var file in files)
{
if (File.Exists(file))
{
zipArchive.CreateEntryFromFile(file, Path.GetFileName(file));
}
}
}
}
public async Task<bool> UploadExcel1(string tableName, IFormFile file)
{
if (file == null || file.Length == 0)
{
return false;
}
try
{
using (var stream = new MemoryStream())
{
// 将文件复制到内存流
file.CopyTo(stream);
stream.Position = 0;
IWorkbook workbook;
if (Path.GetExtension(file.FileName).Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
{
workbook = new XSSFWorkbook(stream); // 处理 .xlsx 文件
}
else
{
workbook = new HSSFWorkbook(stream);
}
//
var sheet = workbook.GetSheetAt(0);
// 获取总行数
var rowCount = sheet.LastRowNum;
if (rowCount < 1)
{
throw new Exception("没有数据");
}
var currentRow1 = sheet.GetRow(0);
var cols = new string[currentRow1.LastCellNum];
for (int i = 0; i < currentRow1.LastCellNum; i++)
{
var cell1 = currentRow1.GetCell(i);
cols[i] = cell1.ToString();
}
var result = new List<string[]>();
List<Dictionary<String, Object>> listmap = new List<Dictionary<String, Object>>();
// 遍历每一行
var maxid = nextid(tableName, "Id");
for (int row = 1; row <= rowCount; row++)
{
maxid++;
var currentRow = sheet.GetRow(row);
if (currentRow == null) continue;
Dictionary<String, Object> map = new Dictionary<String, Object>();
string lat = null, lng = null;
for (int col = 0; col < currentRow.LastCellNum; col++)
{
var cell = currentRow.GetCell(col);
if (cell == null)
{
continue;
}
string head = cols[col];
var cellValue = cell.ToString();
if ("id".Equals(head.ToLower()))
{
map.Add(head, maxid);
}
switch (head)
{
case "lat":
lat = cellValue;
continue;
case "lng":
lng = cellValue;
continue;
case "Id":
continue;
case "id":
continue;
case "ID":
continue;
default:
map.Add(head, cellValue);
break;
}
}
// 遍历列
if (lat != null && lng != null)
{
var geography =
NtsGeometryServices.Instance.CreateGeometryFactory(
int.Parse("4326"));
var point = geography.CreatePoint(new Coordinate(double.Parse(lng), double.Parse(lat)));
map["geom"] = point.AsText();
}
listmap.Add(map);
}
_client.Insertable(listmap).AS(tableName).ExecuteCommand();
await GeoUtil.CreateStoreAndLayer("", "EPSG:4326", tableName, "");
// 返回结果
return true;
}
}
catch (Exception ex)
{
return false;
}
}
public bool UpdateTableData(UpdateTableReq req)
{
string tableName = req.TableName;
string id = "";
var list = req.list;
string sql = "update " + tableName + " set ";
string sql1 = "";
string num = "";
for (int i = 0; i < list.Count; i++)
{
var map = list[i];
if ("id".Equals(map["name"].ToString().ToLower()))
{
num = map["name"].ToString();
id = map["value"].ToString();
continue;
}
if (map["name"].ToString().ToLower().Contains("time"))
{
continue;
}
if (map["value"] != null)
{
sql1 = sql1 + "\"" + map["name"] + "\" = '" + map["value"] + "',";
}
}
var sql2 = sql1.Substring(0, sql1.Length - 1) + " where 1=1 and \"" + num + "\"=" + id;
_client.Ado.ExecuteCommand(sql + sql2);
return true;
}
public bool AddTableData(UpdateTableReq req)
{
string tableName = req.TableName;
string id = "";
var list = req.list;
string sql = "insert into " + tableName + " ( ";
string sql1 = "";
string sql2 = "";
string num = "";
for (int j = 0; j < list.Count; j++)
{
var map = list[j];
if ("id".Equals(map["name"].ToString().ToLower()))
{
id = map["name"].ToString();
}
}
var maxid = nextid(req.TableName, id);
for (int i = 0; i < list.Count; i++)
{
maxid++;
var map = list[i];
if ("id".Equals(map["name"].ToString().ToLower()))
{
sql1 = sql1 + "\"" + map["name"] + "\",";
sql2 = sql2 + maxid + ",";
continue;
}
if (map["name"].ToString().ToLower().Contains("time"))
{
continue;
}
if (map["value"] != null)
{
sql1 = sql1 + "\"" + map["name"] + "\",";
sql2 = sql2 + "'" + map["value"] + "'" + ",";
}
}
var sql3 = sql1.Substring(0, sql1.Length - 1) + ") values(" + sql2.Substring(0, sql2.Length - 1) + ")";
_client.Ado.ExecuteCommand(sql + sql3);
return true;
}
public bool UpdateTableData1(UpdateTableReq req)
{
string tableName = req.TableName;
string id = "";
var list = req.list;
string sql = "update " + tableName + " set ";
string num = "";
for (int i = 0; i < list.Count; i++)
{
var map = list[i];
string sql1 = "";
foreach (KeyValuePair<string, object> kvp in map)
{
string key = kvp.Key;
object value = kvp.Value;
if ("id".Equals(key.ToString().ToLower()))
{
num = key;
id = value.ToString();
continue;
}
if (key.ToLower().Contains("time"))
{
continue;
}
if (value != null)
{
sql1 = sql1 + "\"" + key + "\" = '" + value + "',";
}
// 处理键值对
}
var sql2 = sql1.Substring(0, sql1.Length - 1) + " where 1=1 and \"" + num + "\"=" + id;
_client.Ado.ExecuteCommand(sql + sql2);
}
return true;
}
public async Task<Response<Dictionary<string, object>>> UploadExcel2(string tableName, IFormFile file)
{
if (file == null || file.Length == 0)
{
return null;
}
try
{
using (var stream = new MemoryStream())
{
List<dynamic> dynamics = new List<dynamic>();
List<Dictionary<string, object>> dicts = new List<Dictionary<string, object>>();
List<Dictionary<string, object>> errordicts = new List<Dictionary<string, object>>();
// 将文件复制到内存流
file.CopyTo(stream);
stream.Position = 0;
IWorkbook workbook;
if (Path.GetExtension(file.FileName).Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
{
workbook = new XSSFWorkbook(stream); // 处理 .xlsx 文件
}
else
{
workbook = new HSSFWorkbook(stream);
}
//
var sheet = workbook.GetSheetAt(0);
// 获取总行数
var rowCount = sheet.LastRowNum;
if (rowCount < 1)
{
throw new Exception("没有数据");
}
var currentRow1 = sheet.GetRow(0);
var cols = new string[currentRow1.LastCellNum];
string ids = "";
for (int i = 0; i < currentRow1.LastCellNum; i++)
{
var cell1 = currentRow1.GetCell(i);
cols[i] = cell1.ToString();
if (cell1.ToString().ToLower().Equals("gid"))
{
ids = cell1.ToString();
}
}
var result = new List<string[]>();
List<Dictionary<String, Object>> listmap = new List<Dictionary<String, Object>>();
// 遍历每一行
var maxid = nextid(tableName, ids);
var tablelist = tablestruc(tableName);
for (int row = 1; row <= rowCount; row++)
{
maxid++;
var currentRow = sheet.GetRow(row);
if (currentRow == null) continue;
Dictionary<String, Object> map = new Dictionary<String, Object>();
Dictionary<string, object> dict = new Dictionary<string, object>();
Dictionary<string, object> errorData = new Dictionary<string, object>();
// 读取列
var flag = false;
string lat = null, lng = null;
var flag1 = false;
for (int col = 0; col < currentRow.LastCellNum; col++)
{
var cell = currentRow.GetCell(col);
if (cell == null)
{
continue;
}
string head = cols[col];
var cellValue = cell.ToString();
for (int i = 0; i < tablelist.Count; i++)
{
string cloName = tablelist[i].ColumnName;
string cloType = tablelist[i].Type;
if (head.ToLower().Equals(cloName.ToLower()) && "gid".Equals(head.ToLower()))
{
dict.Add(head, cellValue);
errorData.Add(head, cellValue);
if (cloType.Contains("int"))
{
map.Add(head, maxid);
}
if (cloType.Contains("character"))
{
map.Add(head, Guid.NewGuid().ToString());
}
break;
}
if (head.Contains("geom"))
{
break;
}
if (head.Contains("time"))
{
break;
}
if (head.Equals(cloName))
{
var dictres = dealType(cloName, cloType, head, cellValue);
if ((bool)dictres["flag"])
{
map.Add(head, dictres["data"]);
dict.Add(head, cellValue);
errorData.Add(head, cellValue);
}
else
{
errorData.Add(head, "error" + cellValue);
dict.Add(head, cellValue);
flag1 = true;
}
}
}
switch (head)
{
case "lat":
lat = cellValue;
dict.Add(head, cellValue);
errorData.Add(head, cellValue);
continue;
case "lng":
lng = cellValue;
dict.Add(head, cellValue);
errorData.Add(head, cellValue);
continue;
default:
break;
}
}
if (flag1)
{
errordicts.Add(errorData);
continue;
}
// 遍历列
if (lat != null && lng != null)
{
var geography =
NtsGeometryServices.Instance.CreateGeometryFactory(
int.Parse("4326"));
var point = geography.CreatePoint(new Coordinate(double.Parse(lng), double.Parse(lat)));
map.Add("geom", point.AsText());
}
var geometryForWgs84 = map["geom"];
string sql = $"select column_name as name from INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'public' AND table_name ='" + tableName + "'";
var cloumnlist = _client.Ado.SqlQuery<string>(sql);
string names = "";
string geoms = "";
for (int l = 0; l < cloumnlist.Count; l++)
{
var name = cloumnlist[l];
if (name.Contains("geom"))
{
geoms = name;
}
else
{
names = names + "\"" + name + "\",";
}
}
string sql1 = $"select " + names + "ST_AsText(" + geoms + ") as " + geoms + $" from " + tableName + " where geom='" + geometryForWgs84 + "'";
var obj = _client.Ado.SqlQuerySingle<dynamic>(sql1);
if (obj != null)
{
dynamics.Add(obj);
dict.Add("geom", geometryForWgs84);
flag = true;
}
if (flag)
{
dicts.Add(dict);
continue;
}
listmap.Add(map);
}
_client.Insertable(listmap).AS(tableName).ExecuteCommand();
// 返回结果
Dictionary<string, object> res = new Dictionary<string, object>();
res.Add("nowData", dicts);
res.Add("originData", dynamics);
res.Add("errorData", errordicts);
return new Response<Dictionary<string, object>>
{
Result = res
};
}
}
catch (Exception ex)
{
return new Response<Dictionary<string, object>>
{
Result = null,
Message = ex.Message,
Code = 500
};
}
}
[HttpPost]
public async Task<Response<Dictionary<string, object>>> AddUploadExcel(UploadExcelReq req)
{
if (req.file == null || req.file.Length == 0)
{
return null;
}
try
{
using (var stream = new MemoryStream())
{
string sq2 = "delete from " + req.tableName;
_client.Ado.ExecuteCommand(sq2);
// 将文件复制到内存流
req.file.CopyTo(stream);
stream.Position = 0;
List<Dictionary<string, object>> errordicts = new List<Dictionary<string, object>>();
IWorkbook workbook;
if (Path.GetExtension(req.file.FileName).Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
{
workbook = new XSSFWorkbook(stream); // 处理 .xlsx 文件
}
else
{
workbook = new HSSFWorkbook(stream);
}
//
var sheet = workbook.GetSheetAt(0);
// 获取总行数
var rowCount = sheet.LastRowNum;
if (rowCount < 1)
{
throw new Exception("没有数据");
}
var currentRow1 = sheet.GetRow(0);
var cols = new string[currentRow1.LastCellNum];
string ids = "";
for (int i = 0; i < currentRow1.LastCellNum; i++)
{
var cell1 = currentRow1.GetCell(i);
cols[i] = cell1.ToString();
if (cell1.ToString().ToLower().Equals("gid"))
{
ids = cell1.ToString();
}
}
var result = new List<string[]>();
List<Dictionary<String, Object>> listmap = new List<Dictionary<String, Object>>();
// 遍历每一行
var maxid = nextid(req.tableName, ids);
var tablelist = tablestruc(req.tableName);
// 遍历每一行
for (int row = 1; row <= rowCount; row++)
{
maxid++;
var currentRow = sheet.GetRow(row);
if (currentRow == null) continue;
Dictionary<String, Object> map = new Dictionary<String, Object>();
Dictionary<string, object> errorData = new Dictionary<string, object>();
string lat = null, lng = null;
var flag1 = false;
for (int col = 0; col < currentRow.LastCellNum; col++)
{
var cell = currentRow.GetCell(col);
if (cell == null)
{
continue;
}
string head = cols[col];
var cellValue = cell.ToString();
for (int i = 0; i < tablelist.Count; i++)
{
string cloName = tablelist[i].ColumnName;
string cloType = tablelist[i].Type;
if (head.ToLower().Equals(cloName.ToLower()) && "gid".Equals(head.ToLower()))
{
errorData.Add(head, cellValue);
if (cloType.Contains("int"))
{
map.Add(head, maxid);
}
if (cloType.Contains("character"))
{
map.Add(head, Guid.NewGuid().ToString());
}
break;
}
if (head.Contains("geom"))
{
break;
}
if (head.Contains("time"))
{
break;
}
if (head.Equals(cloName))
{
var dictres = dealType(cloName, cloType, head, cellValue);
if ((bool)dictres["flag"])
{
map.Add(head, dictres["data"]);
errorData.Add(head, cellValue);
}
else
{
errorData.Add(head, "error" + cellValue);
flag1 = true;
}
}
}
switch (head)
{
case "lat":
lat = cellValue;
errorData.Add(head, cellValue);
continue;
case "lng":
lng = cellValue;
errorData.Add(head, cellValue);
continue;
default:
break;
}
}
if (flag1)
{
errordicts.Add(errorData);
continue;
}
if (lat != null && lng != null)
{
var geography =
NtsGeometryServices.Instance.CreateGeometryFactory(
int.Parse("4326"));
var point = geography.CreatePoint(new Coordinate(double.Parse(lng), double.Parse(lat)));
map["geom"] = point.AsText();
}
listmap.Add(map);
}
_client.Insertable(listmap).AS(req.tableName).ExecuteCommand();
//await GeoUtil.CreateStoreAndLayer("", "EPSG:4326", req.tableName, "");
// 返回结果
Dictionary<string, object> res = new Dictionary<string, object>();
res.Add("errorData", errordicts);
return new Response<Dictionary<string, object>>
{
Result = res
};
}
}
catch (Exception ex)
{
return new Response<Dictionary<string, object>>
{
Result = null,
Message = ex.Message,
Code = 500
};
}
}
public async Task<Response<dynamic>> GetSldFilePath(string tablename)
{
Response<dynamic> response = new Response<dynamic>();
string sql = $"select * from sldfile_record where name='" + tablename + "'";
var filepath = _client.Ado.SqlQuerySingle<dynamic>(sql);
response.Result = filepath;
return response;
}
public async Task<Response<bool>> uploadSldStyle(string styleName, string tablename, string filepath, string fileid)
{
Response<bool> response = new Response<bool>();
var sldpath = Path.Combine(_filePath, filepath);
var flag = await GeoUtil.ExistStyle("", tablename);
var flag1 = false;
if (flag)
{
flag1 = await GeoUtil.UpdateSldStyle(filepath, tablename);
await GeoUtil.UpdateStyle("", tablename, tablename);
}
else
{
flag1 = await GeoUtil.PublishSldStyle(sldpath, tablename);
await GeoUtil.UpdateStyle("", tablename, tablename);
}
string sql = $"select count(*) from sldfile_record where name='" + tablename + "'";
var count = _client.Ado.GetInt(sql);
if (count > 0)
{
string updatesql = $"update sldfile_record set filepath='" + filepath + "',styleName='" + tablename + "',fileid='" + fileid + "' where name='" + tablename + "'";
_client.Ado.ExecuteCommand(updatesql);
}
else
{
string id = Guid.NewGuid().ToString();
string insertsql = $"insert into sldfile_record(id,name,filepath,stylename,fileid) values('" + id + "','" + tablename + "','" + filepath + "','" + tablename + "'," + fileid + "')";
_client.Ado.ExecuteCommand(insertsql);
}
if (flag1)
{
response.Message = "发布成功";
response.Result = flag1;
return response;
}
else
{
response.Message = "发布失败";
response.Result = false;
response.Code = 500;
return response;
}
}
public async Task<Response<Dictionary<string, object>>> UploadShape2(string zipFilePath, string tableName
)
{
try
{
string sq2 = "delete from " + tableName;
_client.Ado.ExecuteCommand(sq2);
string srd = "";
using var db = Repository.AsSugarClient();
// 开启事务
// 取得文件完全路径
zipFilePath = Path.Combine(_filePath, zipFilePath);
// 确保ZIP文件存在
if (!File.Exists(zipFilePath))
{
throw new FileNotFoundException("ZIP文件未找到。");
}
// 打开ZIP存档 取除后缀之前的字符串
var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".", StringComparison.Ordinal)) +
"extract";
// 解压文件
await UnZip(zipFilePath, extractPath);
var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名
var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories);
if (fileName.IsEmpty())
{
throw new Exception("压缩文件中无shp文件");
}
List<Dictionary<string, object>> errordicts = new List<Dictionary<string, object>>();
var shpFileName = fileName[0];
var shpFile = Path.Combine(extractPath, shpFileName);
using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default))
{
var dbfReader = dataReader.DbaseHeader;
List<string> headlist = new List<string>();
string ids = "";
foreach (var dbaseFieldDescriptor in dbfReader.Fields)
{
headlist.Add(dbaseFieldDescriptor.Name);
if ("gid".Equals(dbaseFieldDescriptor.Name.ToLower()))
{
ids = dbaseFieldDescriptor.Name;
}
}
Console.WriteLine("记录数" + dataReader.RecordCount);
//throw new Exception("失败");
var objs = new List<Dictionary<string, object>>(1001);
var num = 0;
int count = 0;
var maxid = nextid(tableName, ids);
var tablelist = tablestruc(tableName);
while (dataReader.Read())
{
maxid++;
count++;
Console.WriteLine("记录行:" + count);
var map = new Dictionary<string, object>();
var errorData = new Dictionary<string, object>();
var flag1 = false;
// 读取列
for (int i = 0; i < dataReader.FieldCount; i++)
{
var colName = dataReader.GetName(i);
if (dataReader.GetValue(i) == null)
{
map.Add(colName, dataReader.GetValue(i));
errorData.Add(colName, dataReader.GetValue(i));
continue;
}
for (int l = 0; l < tablelist.Count; l++)
{
string cloName = tablelist[l].ColumnName;
string cloType = tablelist[l].Type;
if (colName.ToLower().Equals(cloName.ToLower()) && "gid".Equals(colName.ToLower()))
{
errorData.Add(colName, dataReader.GetValue(i));
if (cloType.Contains("int"))
{
map.Add(colName, maxid);
}
if (cloType.Contains("character"))
{
map.Add(colName, Guid.NewGuid().ToString());
}
break;
}
if (colName.ToLower().Contains("time"))
{
break;
}
if (colName.ToLower().Equals("geometry"))
{
var geometry = (Geometry)dataReader.GetValue(i);
var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326)
.CreateGeometry(geometry);
map.Add("geom", geometryForWgs84.AsText());
errorData.Add("geom", geometryForWgs84.AsText());
break;
}
if (colName.ToLower().Equals(cloName.ToLower()))
{
var dictres = dealType(cloName, cloType, "", dataReader.GetValue(i).ToString());
if ((bool)dictres["flag"])
{
map.Add(colName, dictres["data"]);
errorData.Add(colName, dataReader.GetValue(i));
}
else
{
errorData.Add(colName, dataReader.GetValue(i));
flag1 = true;
}
}
}
}
objs.Add(map);
if (num++ == 999)
{
await db.Insertable(objs)
.AS(tableName) // 指定目标表名
.ExecuteCommandAsync();
num = 0;
objs.Clear();
}
}
// 读取末尾
await db.Insertable(objs)
.AS(tableName) // 指定目标表名
.ExecuteCommandAsync();
}
await db.Ado.CommitTranAsync();
Dictionary<string, object> res = new Dictionary<string, object>();
res.Add("errorData", errordicts);
return new Response<Dictionary<string, object>>
{
Result = res
};
}
catch (Exception ex)
{
throw new CommonException(ex.Message, 500);
}
}
public async Task<Response<bool>> UploadShape3(string zipFilePath, string tableName
)
{
try
{
string srd = "";
using var db = Repository.AsSugarClient();
// 开启事务
// 取得文件完全路径
zipFilePath = Path.Combine(_filePath, zipFilePath);
// 确保ZIP文件存在
if (!File.Exists(zipFilePath))
{
throw new FileNotFoundException("ZIP文件未找到。");
}
// 打开ZIP存档 取除后缀之前的字符串
var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".", StringComparison.Ordinal)) +
"extract";
// 解压文件
await UnZip(zipFilePath, extractPath);
var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名
var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories);
if (fileName.IsEmpty())
{
throw new Exception("压缩文件中无shp文件");
}
var shpFileName = fileName[0];
var shpFile = Path.Combine(extractPath, shpFileName);
using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default))
{
var dbfReader = dataReader.DbaseHeader;
List<string> headlist = new List<string>();
foreach (var dbaseFieldDescriptor in dbfReader.Fields)
{
headlist.Add(dbaseFieldDescriptor.Name);
}
Console.WriteLine("记录数" + dataReader.RecordCount);
//throw new Exception("失败");
var objs = new List<Dictionary<string, object>>(1001);
var num = 0;
int count = 0;
var maxid = nextid(tableName, "Id");
while (dataReader.Read())
{
count++;
maxid++;
Console.WriteLine("记录行:" + count);
var insertObj = new Dictionary<string, object>();
// 读取列
for (int i = 0; i < dataReader.FieldCount; i++)
{
var colName = dataReader.GetName(i);
for (int k = 0; k < headlist.Count; k++)
{
var header = headlist[k];
if (colName.ToLower().Contains("time"))
{
break;
}
if (colName.ToLower().Equals("geometry"))
{
var geometry = (Geometry)dataReader.GetValue(i);
var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326)
.CreateGeometry(geometry);
insertObj.Add("geom", geometryForWgs84.AsText());
break;
}
if (header.Equals(colName))
{
if (header.Equals("Id"))
{
insertObj.Add(header, maxid);
break;
}
else
{
insertObj.Add(header, dataReader.GetValue(i));
break;
}
}
}
}
objs.Add(insertObj);
if (num++ == 999)
{
await db.Insertable(objs)
.AS(tableName) // 指定目标表名
.ExecuteCommandAsync();
num = 0;
objs.Clear();
}
}
// 读取末尾
await db.Insertable(objs)
.AS(tableName) // 指定目标表名
.ExecuteCommandAsync();
}
await db.Ado.CommitTranAsync();
await GeoUtil.CreateStoreAndLayer("", "EPSG:4326", tableName, "");
}
catch (Exception ex)
{
throw new CommonException(ex.Message, 500);
}
return new Response<bool>
{
Result = true
};
}
private static async Task UnZip(string zipFilePath, string extractPath)
{
await Task.Run(() =>
{
Directory.CreateDirectory(extractPath);
// 设置字符编码
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var gbk = Encoding.GetEncoding("utf-8");
using (var archive = ZipFile.OpenRead(zipFilePath))
{
// 列举ZIP文件中的条目
foreach (var entry in archive.Entries)
{
var xxx = gbk.GetString(Encoding.Default.GetBytes(entry.FullName));
Console.WriteLine(xxx);
}
// 提取ZIP文件中的所有文件到指定目录
foreach (var entry in archive.Entries)
{
if (entry.Name != string.Empty)
{
// 确保完整路径存在 entry.FullName 是否可以编码
var fixedEntryName = entry.FullName.Replace("/", "");
var destinationPath = Path.GetFullPath(Path.Combine(extractPath, fixedEntryName));
Console.WriteLine("解压文件路径:" + destinationPath);
if (!destinationPath.StartsWith(Path.GetFullPath(extractPath) + Path.DirectorySeparatorChar))
{
throw new UnauthorizedAccessException("试图提取的文件超出了目标文件夹的路径边界。");
}
// 提取条目到目标路径
entry.ExtractToFile(destinationPath, overwrite: true);
}
}
}
// 遍历解压目录是否有shp后缀的文件
if (!Directory.Exists(extractPath))
{
throw new Exception("文件解压失败");
}
});
}
public async Task<Response<Dictionary<string, object>>> UploadShape1(string zipFilePath, string tableName
)
{
try
{
string srd = "";
using var db = Repository.AsSugarClient();
// 开启事务
// 取得文件完全路径
zipFilePath = Path.Combine(_filePath, zipFilePath);
// 确保ZIP文件存在
if (!File.Exists(zipFilePath))
{
throw new FileNotFoundException("ZIP文件未找到。");
}
// 打开ZIP存档 取除后缀之前的字符串
var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".", StringComparison.Ordinal)) +
"extract";
// 解压文件
await UnZip(zipFilePath, extractPath);
var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名
var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories);
if (fileName.IsEmpty())
{
throw new Exception("压缩文件中无shp文件");
}
var shpFileName = fileName[0];
var shpFile = Path.Combine(extractPath, shpFileName);
List<dynamic> dynamics = new List<dynamic>();
List<Dictionary<string, object>> dicts = new List<Dictionary<string, object>>();
List<Dictionary<string, object>> errordicts = new List<Dictionary<string, object>>();
using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default))
{
var dbfReader = dataReader.DbaseHeader;
List<string> headlist = new List<string>();
string ids = "";
foreach (var dbaseFieldDescriptor in dbfReader.Fields)
{
headlist.Add(dbaseFieldDescriptor.Name);
if ("gid".Equals(dbaseFieldDescriptor.Name.ToLower()))
{
ids = dbaseFieldDescriptor.Name;
}
}
Console.WriteLine("记录数" + dataReader.RecordCount);
//throw new Exception("失败");
var objs = new List<Dictionary<string, object>>(1001);
var num = 0;
int count = 0;
var maxid = nextid(tableName, ids);
var tablelist = tablestruc(tableName);
while (dataReader.Read())
{
count++;
maxid++;
Console.WriteLine("记录行:" + count);
var map = new Dictionary<string, object>();
var errorData = new Dictionary<string, object>();
var flag1 = false;
// 读取列
Dictionary<string, object> dict = new Dictionary<string, object>();
// 读取列
var flag = false;
for (int i = 0; i < dataReader.FieldCount; i++)
{
var colName = dataReader.GetName(i);
if (dataReader.GetValue(i) == null)
{
map.Add(colName, dataReader.GetValue(i));
errorData.Add(colName, dataReader.GetValue(i));
continue;
}
for (int l = 0; l < tablelist.Count; l++)
{
string cloName = tablelist[l].ColumnName;
string cloType = tablelist[l].Type;
if (colName.ToLower().Equals(colName.ToLower()) && "gid".Equals(colName.ToLower()))
{
errorData.Add(colName, dataReader.GetValue(i));
if (cloType.Contains("int"))
{
map.Add(colName, maxid);
}
if (cloType.Contains("character"))
{
map.Add(colName, Guid.NewGuid().ToString());
}
break;
}
if (colName.ToLower().Contains("time"))
{
break;
}
if (colName.ToLower().Equals("geometry"))
{
var geometry = (Geometry)dataReader.GetValue(i);
var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326)
.CreateGeometry(geometry);
map.Add("geom", geometryForWgs84.AsText());
errorData.Add("geom", geometryForWgs84.AsText());
break;
}
if (colName.ToLower().Equals(colName.ToLower()))
{
var dictres = dealType(cloName, cloType, "", dataReader.GetValue(i).ToString());
if ((bool)dictres["flag"])
{
map.Add(colName, dictres["data"]);
errorData.Add(colName, dataReader.GetValue(i));
}
else
{
errorData.Add(colName, dataReader.GetValue(i));
flag1 = true;
}
}
}
if (colName.ToLower().Equals("geometry"))
{
var geometry = (Geometry)dataReader.GetValue(i);
var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326)
.CreateGeometry(geometry);
string sql = $"select column_name as name from INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'public' AND table_name ='" + tableName + "'";
var cloumnlist = _client.Ado.SqlQuery<string>(sql);
string names = "";
string geoms = "";
for (int l = 0; l < cloumnlist.Count; l++)
{
var name = cloumnlist[l];
if (name.Contains("geom"))
{
geoms = name;
}
else
{
names = names + "\"" + name + "\",";
}
}
string sql1 = $"select " + names + "ST_AsText(" + geoms + ") as " + geoms + $" from " + tableName + " where geom='" + geometryForWgs84.AsText() + "'";
var obj = _client.Ado.SqlQuerySingle<dynamic>(sql1);
if (obj != null)
{
dynamics.Add(obj);
dict.Add("geom", geometryForWgs84.AsText());
flag = true;
}
}
else
{
dict.Add(colName, dataReader.GetValue(i));
}
}
if (flag1)
{
errordicts.Add(errorData);
continue;
}
if (flag)
{
dicts.Add(dict);
continue;
}
objs.Add(map);
if (num++ == 999)
{
await db.Insertable(objs)
.AS(tableName) // 指定目标表名
.ExecuteCommandAsync();
num = 0;
objs.Clear();
}
}
// 读取末尾
await db.Insertable(objs)
.AS(tableName) // 指定目标表名
.ExecuteCommandAsync();
}
await db.Ado.CommitTranAsync();
Dictionary<string, object> res = new Dictionary<string, object>();
res.Add("nowData", dicts);
res.Add("originData", dynamics);
res.Add("errorData", errordicts);
return new Response<Dictionary<string, object>>
{
Result = res
};
}
catch (Exception ex)
{
throw new CommonException(ex.Message, 500);
}
}
public int nextid(string tablename, string id)
{
string sql = "select max(\"" + id + "\") from " + tablename;
var maxid = _client.Ado.GetInt(sql);
return maxid;
}
public List<dynamic> tablestruc(string tableName)
{
string tableStruc = $"\t\t\r\nSELECT \r\n c.column_name AS \"ColumnName\",\r\n c.data_type AS \"Type\"\r\n\r\nFROM \r\n " +
$" information_schema.columns c\r\nLEFT JOIN \r\n pg_catalog.pg_description pgd ON pgd.objoid = c.table_name::regclass::oid \r\n " +
$" AND pgd.objsubid = c.ordinal_position\r\nWHERE \r\n c.table_name = '" + tableName + "'; ";
return _client.Ado.SqlQuery<dynamic>(tableStruc);
}
public Dictionary<string, object> dealType(string cloum, string type, string head, string data)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
string str = "";
bool flag = false;
double d = 0.0;
float f = 0.0f;
int i = 0;
Object obj = null;
switch (type)
{
case "real":
flag = float.TryParse(data, out f);
obj = f;
break;
case "integer":
flag = Int32.TryParse(data, out i);
obj = i;
break;
case "numeric":
flag = double.TryParse(data, out d);
obj = d;
break;
case "bigint":
flag = Int32.TryParse(data, out i);
obj = i;
break;
case "double precision":
flag = double.TryParse(data, out d);
obj = d;
break;
case "character varying":
flag = true;
obj = data;
break;
case "date":
flag = true;
obj = new DateTime();
break;
case "timestamp without time zone":
flag = true;
obj = new Timestamp();
break;
default:
flag = false;
break;
}
dict.Add("flag", flag);
dict.Add("data", obj);
return dict;
}
}