2025-01-10 10:14:58 +08:00
|
|
|
|
using System.Data;
|
2025-04-14 10:57:27 +08:00
|
|
|
|
using System.Reflection.PortableExecutable;
|
|
|
|
|
|
using ClosedXML.Excel;
|
|
|
|
|
|
using System.Text.Json.Nodes;
|
2025-01-10 10:14:58 +08:00
|
|
|
|
using Infrastructure;
|
|
|
|
|
|
using Infrastructure.Utils;
|
2025-04-14 10:57:27 +08:00
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
2025-01-10 10:14:58 +08:00
|
|
|
|
using Microsoft.Extensions.Options;
|
|
|
|
|
|
using NetTopologySuite;
|
|
|
|
|
|
using NetTopologySuite.Geometries;
|
|
|
|
|
|
using NPOI.HSSF.UserModel;
|
|
|
|
|
|
using NPOI.SS.UserModel;
|
|
|
|
|
|
using NPOI.XSSF.UserModel;
|
|
|
|
|
|
using OpenAuth.App.BaseApp.Base;
|
2025-04-14 10:57:27 +08:00
|
|
|
|
using OpenAuth.App.FormModule;
|
2025-01-10 10:14:58 +08:00
|
|
|
|
using OpenAuth.App.Interface;
|
|
|
|
|
|
using OpenAuth.App.ServiceApp.LayerManagerApp.Request;
|
|
|
|
|
|
using OpenAuth.Repository;
|
|
|
|
|
|
using OpenAuth.Repository.Domain;
|
|
|
|
|
|
using SqlSugar;
|
2025-04-14 10:57:27 +08:00
|
|
|
|
using DocumentFormat.OpenXml.Bibliography;
|
|
|
|
|
|
using OpenAuth.App.Request;
|
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
using DocumentFormat.OpenXml.Math;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
using Microsoft.AspNetCore.Http;
|
|
|
|
|
|
using NPOI.SS.Formula.Functions;
|
|
|
|
|
|
using OpenAuth.App.FormScheme.FormHelpers;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.IO.Compression;
|
|
|
|
|
|
using NetTopologySuite.IO;
|
|
|
|
|
|
using NetTopologySuite.Features;
|
|
|
|
|
|
using OSGeo.OGR;
|
|
|
|
|
|
using Shapefile = NetTopologySuite.IO.Esri.Shapefile;
|
|
|
|
|
|
using Org.BouncyCastle.Ocsp;
|
2025-04-26 14:12:14 +08:00
|
|
|
|
using Infrastructure.Extensions;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
using SQLitePCL;
|
|
|
|
|
|
using DocumentFormat.OpenXml.Spreadsheet;
|
|
|
|
|
|
using NPOI.Util;
|
|
|
|
|
|
using DocumentFormat.OpenXml.ExtendedProperties;
|
|
|
|
|
|
using static ICSharpCode.SharpZipLib.Zip.ExtendedUnixData;
|
|
|
|
|
|
using static NPOI.POIFS.Crypt.CryptoFunctions;
|
2025-01-10 10:14:58 +08:00
|
|
|
|
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
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
2025-04-14 10:57:27 +08:00
|
|
|
|
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>();
|
2025-05-13 14:51:52 +08:00
|
|
|
|
// string sql = $"select column_name as name from INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'public' AND table_name ='" + tablename + "'";
|
2025-04-30 13:58:32 +08:00
|
|
|
|
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 " +
|
2025-04-30 13:24:35 +08:00
|
|
|
|
$"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+"';";
|
2025-05-13 15:20:21 +08:00
|
|
|
|
//var cloumnlist = _client.Ado.SqlQuery<string>(sql);
|
2025-04-30 13:58:32 +08:00
|
|
|
|
var coment = _client.Ado.SqlQuery<dynamic>(sqlcom);
|
2025-05-13 14:51:52 +08:00
|
|
|
|
//result.Add("head", cloumnlist);
|
2025-04-30 13:24:35 +08:00
|
|
|
|
result.Add("headName", coment);
|
2025-04-14 10:57:27 +08:00
|
|
|
|
string names = "";
|
|
|
|
|
|
string geoms = "";
|
2025-04-30 13:58:32 +08:00
|
|
|
|
for (int i = 0; i < coment.Count; i++)
|
|
|
|
|
|
{ var name = coment[i].columnName;
|
2025-04-14 10:57:27 +08:00
|
|
|
|
if (name.Contains("geom"))
|
|
|
|
|
|
{
|
|
|
|
|
|
geoms = name;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
names = names +"\""+ name + "\",";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
string sql1 = $"select " + names + "ST_AsText(" + geoms + ") as " + geoms + $" from " + tablename + " where 1=1 ";
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var result1 = _client.Ado.SqlQuery<dynamic>(sql1);
|
|
|
|
|
|
result.Add("data", result1);
|
|
|
|
|
|
return new Response<Dictionary<string, object>>
|
|
|
|
|
|
{
|
|
|
|
|
|
Result = result
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
public Response<MemoryStream> TempeleteByTableName(string tablename,int type, string shpFilePath, string shpFilePathzip)
|
2025-04-14 10:57:27 +08:00
|
|
|
|
{
|
|
|
|
|
|
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);
|
2025-04-17 14:48:05 +08:00
|
|
|
|
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;
|
2025-04-26 14:12:14 +08:00
|
|
|
|
for (int i = 0; i < cloumnlist.Count+1; i++)
|
2025-04-17 14:48:05 +08:00
|
|
|
|
{
|
2025-04-26 14:12:14 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
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)
|
2025-04-14 10:57:27 +08:00
|
|
|
|
{
|
2025-04-17 14:48:05 +08:00
|
|
|
|
List<IFeature> features = new List<IFeature>();
|
|
|
|
|
|
var attributes = new AttributesTable();
|
|
|
|
|
|
string wkt = "POINT(117.968055555555 35.4761111111111)";
|
|
|
|
|
|
var geometry = ParseGeometry(wkt);
|
2025-04-14 10:57:27 +08:00
|
|
|
|
for (int i = 0; i < cloumnlist.Count; i++)
|
|
|
|
|
|
{
|
2025-04-17 14:48:05 +08:00
|
|
|
|
|
2025-04-14 10:57:27 +08:00
|
|
|
|
var header = cloumnlist[i];
|
2025-04-17 14:48:05 +08:00
|
|
|
|
if (header.Contains("geom"))
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
attributes.Add(header, 11);
|
2025-04-14 10:57:27 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
IFeature feature = new NetTopologySuite.Features.Feature(geometry, attributes);
|
|
|
|
|
|
features.Add(feature);
|
|
|
|
|
|
// 导出 SHP 文件及其关联文件
|
|
|
|
|
|
ExportToShapefileFour(shpFilePath, features);
|
|
|
|
|
|
// 将文件打包成 ZIP
|
|
|
|
|
|
CreateZipFromShapefiles(shpFilePath, shpFilePathzip);
|
2025-04-14 10:57:27 +08:00
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
|
|
|
|
|
|
return response;
|
|
|
|
|
|
}
|
|
|
|
|
|
public NetTopologySuite.Geometries.Geometry ParseGeometry(string wkt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (string.IsNullOrEmpty(wkt))
|
2025-04-14 10:57:27 +08:00
|
|
|
|
{
|
2025-04-17 14:48:05 +08:00
|
|
|
|
return null;
|
2025-04-14 10:57:27 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
var reader = new WKTReader();
|
|
|
|
|
|
return reader.Read(wkt);
|
2025-04-14 10:57:27 +08:00
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
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);
|
2025-04-14 10:57:27 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
// 写入 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)
|
2025-04-14 10:57:27 +08:00
|
|
|
|
{
|
2025-04-17 14:48:05 +08:00
|
|
|
|
var files = new List<string>
|
|
|
|
|
|
{
|
|
|
|
|
|
Path.ChangeExtension(shpPath, "cpg"),
|
|
|
|
|
|
shpPath,
|
|
|
|
|
|
Path.ChangeExtension(shpPath, "shx"),
|
|
|
|
|
|
Path.ChangeExtension(shpPath, "dbf"),
|
|
|
|
|
|
Path.ChangeExtension(shpPath, "prj")
|
|
|
|
|
|
};
|
2025-04-14 10:57:27 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
using (var zipArchive = ZipFile.Open(zipPath, ZipArchiveMode.Create))
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var file in files)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (File.Exists(file))
|
|
|
|
|
|
{
|
|
|
|
|
|
zipArchive.CreateEntryFromFile(file, Path.GetFileName(file));
|
|
|
|
|
|
}
|
2025-04-14 10:57:27 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
2025-04-14 10:57:27 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
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>>();
|
|
|
|
|
|
// 遍历每一行
|
2025-04-30 13:24:35 +08:00
|
|
|
|
var maxid = nextid(tableName, "Id");
|
2025-04-17 14:48:05 +08:00
|
|
|
|
for (int row = 1; row <= rowCount; row++)
|
|
|
|
|
|
{
|
2025-04-30 13:24:35 +08:00
|
|
|
|
maxid++;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
var currentRow = sheet.GetRow(row);
|
|
|
|
|
|
if (currentRow == null) continue;
|
|
|
|
|
|
Dictionary<String, Object> map = new Dictionary<String, Object>();
|
2025-04-26 14:12:14 +08:00
|
|
|
|
string lat = null, lng = null;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
for (int col = 0; col < currentRow.LastCellNum; col++)
|
|
|
|
|
|
{
|
2025-04-26 14:12:14 +08:00
|
|
|
|
|
|
|
|
|
|
var cell = currentRow.GetCell(col);
|
|
|
|
|
|
if (cell == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
string head = cols[col];
|
2025-04-26 14:12:14 +08:00
|
|
|
|
var cellValue = cell.ToString();
|
|
|
|
|
|
if ("id".Equals(head.ToLower()))
|
|
|
|
|
|
{
|
2025-04-30 13:24:35 +08:00
|
|
|
|
map.Add(head, maxid);
|
2025-04-26 14:12:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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();
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
listmap.Add(map);
|
|
|
|
|
|
}
|
|
|
|
|
|
_client.Insertable(listmap).AS(tableName).ExecuteCommand();
|
|
|
|
|
|
await GeoUtil.CreateStoreAndLayer("", "EPSG:4326", tableName, "");
|
|
|
|
|
|
// 返回结果
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2025-04-14 10:57:27 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public bool UpdateTableData(UpdateTableReq req) {
|
|
|
|
|
|
|
|
|
|
|
|
string tableName = req.TableName;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
string id = "";
|
2025-04-14 10:57:27 +08:00
|
|
|
|
var list = req.list;
|
|
|
|
|
|
string sql = "update " + tableName + " set ";
|
|
|
|
|
|
string sql1 = "";
|
2025-04-17 14:48:05 +08:00
|
|
|
|
string num = "";
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
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"] + "',";
|
|
|
|
|
|
}
|
2025-04-14 10:57:27 +08:00
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
var sql2 = sql1.Substring(0,sql1.Length-1)+ " where 1=1 and \""+num+"\"="+id;
|
2025-04-14 10:57:27 +08:00
|
|
|
|
_client.Ado.ExecuteCommand(sql + sql2);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
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 = "";
|
2025-04-30 13:42:15 +08:00
|
|
|
|
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);
|
|
|
|
|
|
|
2025-04-30 13:24:35 +08:00
|
|
|
|
for (int i = 0; i < list.Count; i++)
|
|
|
|
|
|
{
|
2025-04-30 13:42:15 +08:00
|
|
|
|
maxid++;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
var map = list[i];
|
|
|
|
|
|
if ("id".Equals(map["name"].ToString().ToLower()))
|
|
|
|
|
|
{
|
2025-04-30 13:42:15 +08:00
|
|
|
|
sql1 = sql1 + "\"" + map["name"] + "\",";
|
2025-04-30 13:24:35 +08:00
|
|
|
|
sql2 = sql2 + maxid + ",";
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (map["name"].ToString().ToLower().Contains("time"))
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (map["value"] != null)
|
|
|
|
|
|
{
|
2025-04-30 13:42:15 +08:00
|
|
|
|
sql1 = sql1 + "\"" + map["name"] + "\",";
|
2025-04-30 13:24:35 +08:00
|
|
|
|
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)
|
2025-04-17 14:48:05 +08:00
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
2025-04-17 16:06:24 +08:00
|
|
|
|
if (key.ToLower().Contains("time"))
|
2025-04-17 14:48:05 +08:00
|
|
|
|
{
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-04-26 14:12:14 +08:00
|
|
|
|
public async Task<Response<Dictionary<string, object>>> UploadExcel2(string tableName, IFormFile file)
|
2025-04-17 14:48:05 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (file == null || file.Length == 0)
|
|
|
|
|
|
{
|
2025-04-26 14:12:14 +08:00
|
|
|
|
return null;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
using (var stream = new MemoryStream())
|
|
|
|
|
|
{
|
2025-04-26 14:12:14 +08:00
|
|
|
|
|
|
|
|
|
|
List<dynamic> dynamics = new List<dynamic>();
|
|
|
|
|
|
List<Dictionary<string, object>> dicts = new List<Dictionary<string, object>>();
|
2025-04-30 13:24:35 +08:00
|
|
|
|
List<Dictionary<string, object>> errordicts = new List<Dictionary<string, object>>();
|
2025-04-17 14:48:05 +08:00
|
|
|
|
// 将文件复制到内存流
|
|
|
|
|
|
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("没有数据");
|
|
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
var currentRow1 = sheet.GetRow(0);
|
|
|
|
|
|
var cols = new string[currentRow1.LastCellNum];
|
2025-04-30 13:24:35 +08:00
|
|
|
|
string ids = "";
|
2025-04-17 14:48:05 +08:00
|
|
|
|
for (int i = 0; i < currentRow1.LastCellNum; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var cell1 = currentRow1.GetCell(i);
|
|
|
|
|
|
cols[i] = cell1.ToString();
|
2025-04-30 13:24:35 +08:00
|
|
|
|
if (cell1.ToString().ToLower().Equals("id"))
|
|
|
|
|
|
{
|
|
|
|
|
|
ids= cell1.ToString();
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
var result = new List<string[]>();
|
|
|
|
|
|
List<Dictionary<String, Object>> listmap = new List<Dictionary<String, Object>>();
|
|
|
|
|
|
// 遍历每一行
|
2025-04-30 13:24:35 +08:00
|
|
|
|
var maxid = nextid(tableName, ids);
|
|
|
|
|
|
var tablelist = tablestruc(tableName);
|
2025-04-17 14:48:05 +08:00
|
|
|
|
for (int row = 1; row <= rowCount; row++)
|
|
|
|
|
|
{
|
2025-04-30 13:24:35 +08:00
|
|
|
|
maxid++;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
var currentRow = sheet.GetRow(row);
|
|
|
|
|
|
if (currentRow == null) continue;
|
|
|
|
|
|
Dictionary<String, Object> map = new Dictionary<String, Object>();
|
2025-04-26 14:12:14 +08:00
|
|
|
|
Dictionary<string, object> dict = new Dictionary<string, object>();
|
2025-04-30 13:24:35 +08:00
|
|
|
|
Dictionary<string, object> errorData = new Dictionary<string, object>();
|
2025-04-26 14:12:14 +08:00
|
|
|
|
// 读取列
|
|
|
|
|
|
var flag = false;
|
|
|
|
|
|
string lat = null, lng = null;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
var flag1 = false;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
for (int col = 0; col < currentRow.LastCellNum; col++)
|
|
|
|
|
|
{
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
2025-04-26 14:12:14 +08:00
|
|
|
|
var cell = currentRow.GetCell(col);
|
|
|
|
|
|
if (cell == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
string head = cols[col];
|
2025-04-26 14:12:14 +08:00
|
|
|
|
var cellValue = cell.ToString();
|
2025-04-30 13:24:35 +08:00
|
|
|
|
for (int i = 0; i < tablelist.Count; i++)
|
2025-04-26 14:12:14 +08:00
|
|
|
|
{
|
2025-04-30 13:24:35 +08:00
|
|
|
|
string cloName = tablelist[i].ColumnName;
|
|
|
|
|
|
string cloType = tablelist[i].Type;
|
|
|
|
|
|
if (head.Equals(cloName)&&"id".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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-26 14:12:14 +08:00
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-04-26 14:12:14 +08:00
|
|
|
|
|
|
|
|
|
|
switch (head)
|
|
|
|
|
|
{
|
|
|
|
|
|
case "lat":
|
|
|
|
|
|
lat = cellValue;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
|
|
|
|
|
dict.Add(head, cellValue);
|
|
|
|
|
|
errorData.Add(head, cellValue);
|
2025-04-26 14:12:14 +08:00
|
|
|
|
continue;
|
|
|
|
|
|
case "lng":
|
|
|
|
|
|
lng = cellValue;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
|
|
|
|
|
dict.Add(head, cellValue);
|
|
|
|
|
|
errorData.Add(head, cellValue);
|
2025-04-26 14:12:14 +08:00
|
|
|
|
continue;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
2025-04-26 14:12:14 +08:00
|
|
|
|
default:
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
2025-04-26 14:12:14 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
|
2025-04-30 13:24:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
if (flag1)
|
|
|
|
|
|
{
|
|
|
|
|
|
errordicts.Add(errorData);
|
|
|
|
|
|
continue;
|
2025-04-26 14:12:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
// 遍历列
|
|
|
|
|
|
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;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
listmap.Add(map);
|
|
|
|
|
|
}
|
|
|
|
|
|
_client.Insertable(listmap).AS(tableName).ExecuteCommand();
|
2025-04-26 14:12:14 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
// 返回结果
|
2025-04-26 14:12:14 +08:00
|
|
|
|
Dictionary<string, object> res = new Dictionary<string, object>();
|
|
|
|
|
|
res.Add("nowData", dicts);
|
|
|
|
|
|
res.Add("originData", dynamics);
|
2025-04-30 13:24:35 +08:00
|
|
|
|
res.Add("errorData", errordicts);
|
2025-04-26 14:12:14 +08:00
|
|
|
|
return new Response<Dictionary<string, object>>
|
|
|
|
|
|
{
|
|
|
|
|
|
Result = res
|
|
|
|
|
|
};
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
2025-04-30 13:24:35 +08:00
|
|
|
|
return new Response<Dictionary<string, object>>
|
|
|
|
|
|
{
|
|
|
|
|
|
Result = null,
|
|
|
|
|
|
Message = ex.Message,
|
|
|
|
|
|
Code = 500
|
|
|
|
|
|
};
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-26 14:12:14 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-14 10:57:27 +08:00
|
|
|
|
[HttpPost]
|
2025-04-30 13:24:35 +08:00
|
|
|
|
public async Task<Response<Dictionary<string, object>>> AddUploadExcel(UploadExcelReq req)
|
2025-04-14 10:57:27 +08:00
|
|
|
|
{
|
2025-04-17 14:48:05 +08:00
|
|
|
|
|
|
|
|
|
|
if (req.file == null || req.file.Length == 0)
|
|
|
|
|
|
{
|
2025-04-30 13:24:35 +08:00
|
|
|
|
return null;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
using (var stream = new MemoryStream())
|
|
|
|
|
|
{
|
2025-04-26 14:12:14 +08:00
|
|
|
|
|
|
|
|
|
|
string sq2 = "delete from " + req.tableName;
|
|
|
|
|
|
_client.Ado.ExecuteCommand(sq2);
|
2025-04-17 14:48:05 +08:00
|
|
|
|
// 将文件复制到内存流
|
|
|
|
|
|
req.file.CopyTo(stream);
|
|
|
|
|
|
stream.Position = 0;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
List<Dictionary<string, object>> errordicts = new List<Dictionary<string, object>>();
|
2025-04-17 14:48:05 +08:00
|
|
|
|
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];
|
2025-04-30 13:24:35 +08:00
|
|
|
|
string ids = "";
|
2025-04-17 14:48:05 +08:00
|
|
|
|
for (int i = 0; i < currentRow1.LastCellNum; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var cell1 = currentRow1.GetCell(i);
|
|
|
|
|
|
cols[i] = cell1.ToString();
|
2025-04-30 13:24:35 +08:00
|
|
|
|
if (cell1.ToString().ToLower().Equals("id"))
|
|
|
|
|
|
{
|
|
|
|
|
|
ids = cell1.ToString();
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
var result = new List<string[]>();
|
|
|
|
|
|
List<Dictionary<String, Object>> listmap = new List<Dictionary<String, Object>>();
|
|
|
|
|
|
// 遍历每一行
|
2025-04-30 13:24:35 +08:00
|
|
|
|
var maxid = nextid(req.tableName, ids);
|
|
|
|
|
|
var tablelist = tablestruc(req.tableName);
|
|
|
|
|
|
// 遍历每一行
|
2025-04-17 14:48:05 +08:00
|
|
|
|
for (int row = 1; row <= rowCount; row++)
|
|
|
|
|
|
{
|
2025-04-30 13:24:35 +08:00
|
|
|
|
maxid++;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
var currentRow = sheet.GetRow(row);
|
|
|
|
|
|
if (currentRow == null) continue;
|
|
|
|
|
|
Dictionary<String, Object> map = new Dictionary<String, Object>();
|
2025-04-30 13:24:35 +08:00
|
|
|
|
Dictionary<string, object> errorData = new Dictionary<string, object>();
|
2025-04-26 14:12:14 +08:00
|
|
|
|
string lat = null, lng = null;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
var flag1 = false;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
for (int col = 0; col < currentRow.LastCellNum; col++)
|
|
|
|
|
|
{
|
2025-04-26 14:12:14 +08:00
|
|
|
|
|
|
|
|
|
|
var cell = currentRow.GetCell(col);
|
|
|
|
|
|
if (cell == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
string head = cols[col];
|
2025-04-26 14:12:14 +08:00
|
|
|
|
var cellValue = cell.ToString();
|
2025-04-30 13:24:35 +08:00
|
|
|
|
for (int i = 0; i < tablelist.Count; i++)
|
2025-04-26 14:12:14 +08:00
|
|
|
|
{
|
2025-04-30 13:24:35 +08:00
|
|
|
|
string cloName = tablelist[i].ColumnName;
|
|
|
|
|
|
string cloType = tablelist[i].Type;
|
|
|
|
|
|
if (head.Equals(cloName) && "id".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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-26 14:12:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-04-26 14:12:14 +08:00
|
|
|
|
switch (head)
|
|
|
|
|
|
{
|
|
|
|
|
|
case "lat":
|
|
|
|
|
|
lat = cellValue;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
errorData.Add(head, cellValue);
|
2025-04-26 14:12:14 +08:00
|
|
|
|
continue;
|
|
|
|
|
|
case "lng":
|
|
|
|
|
|
lng = cellValue;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
errorData.Add(head, cellValue);
|
2025-04-26 14:12:14 +08:00
|
|
|
|
continue;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
2025-04-26 14:12:14 +08:00
|
|
|
|
default:
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
2025-04-26 14:12:14 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
|
2025-04-26 14:12:14 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
if (flag1)
|
|
|
|
|
|
{
|
|
|
|
|
|
errordicts.Add(errorData);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2025-04-26 14:12:14 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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();
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
listmap.Add(map);
|
|
|
|
|
|
}
|
|
|
|
|
|
_client.Insertable(listmap).AS(req.tableName).ExecuteCommand();
|
|
|
|
|
|
//await GeoUtil.CreateStoreAndLayer("", "EPSG:4326", req.tableName, "");
|
|
|
|
|
|
// 返回结果
|
2025-04-30 13:24:35 +08:00
|
|
|
|
Dictionary<string, object> res = new Dictionary<string, object>();
|
|
|
|
|
|
|
|
|
|
|
|
res.Add("errorData", errordicts);
|
|
|
|
|
|
return new Response<Dictionary<string, object>>
|
|
|
|
|
|
{
|
|
|
|
|
|
Result = res
|
|
|
|
|
|
};
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
2025-04-30 13:24:35 +08:00
|
|
|
|
return new Response<Dictionary<string, object>>
|
|
|
|
|
|
{
|
|
|
|
|
|
Result = null,
|
|
|
|
|
|
Message = ex.Message,
|
|
|
|
|
|
Code = 500
|
|
|
|
|
|
};
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
public async Task<Response<bool>> uploadSldStyle(string styleName, string tablename,string filepath)
|
|
|
|
|
|
{
|
|
|
|
|
|
Response<bool> response = new Response<bool>();
|
|
|
|
|
|
var flag = await GeoUtil.ExistStyle("", styleName);
|
|
|
|
|
|
if (flag) {
|
|
|
|
|
|
response.Message = "样式已存在";
|
|
|
|
|
|
response.Result = false;
|
|
|
|
|
|
return response;
|
|
|
|
|
|
}
|
|
|
|
|
|
var sldpath = Path.Combine(_filePath, filepath);
|
|
|
|
|
|
var flag1 = await GeoUtil.PublishSldStyle(sldpath, styleName);
|
|
|
|
|
|
await GeoUtil.UpdateStyle("", tablename, styleName);
|
|
|
|
|
|
if (flag1)
|
|
|
|
|
|
{
|
|
|
|
|
|
response.Message = "发布成功";
|
|
|
|
|
|
response.Result = flag1;
|
|
|
|
|
|
return response;
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
response.Message = "发布失败";
|
|
|
|
|
|
response.Result = false;
|
|
|
|
|
|
return response;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
public async Task<Response<Dictionary<string, object>>> UploadShape2(string zipFilePath, string tableName
|
2025-04-17 14:48:05 +08:00
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
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文件");
|
|
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
List<Dictionary<string, object>> errordicts = new List<Dictionary<string, object>>();
|
2025-04-17 14:48:05 +08:00
|
|
|
|
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>();
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
|
|
|
|
|
string ids = "";
|
2025-04-17 14:48:05 +08:00
|
|
|
|
foreach (var dbaseFieldDescriptor in dbfReader.Fields)
|
|
|
|
|
|
{
|
|
|
|
|
|
headlist.Add(dbaseFieldDescriptor.Name);
|
2025-04-30 13:24:35 +08:00
|
|
|
|
if ("id".Equals(dbaseFieldDescriptor.Name.ToLower()))
|
|
|
|
|
|
{
|
|
|
|
|
|
ids = dbaseFieldDescriptor.Name;
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
Console.WriteLine("记录数" + dataReader.RecordCount);
|
|
|
|
|
|
//throw new Exception("失败");
|
|
|
|
|
|
var objs = new List<Dictionary<string, object>>(1001);
|
|
|
|
|
|
var num = 0;
|
|
|
|
|
|
int count = 0;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
|
|
|
|
|
var maxid = nextid(tableName, ids);
|
|
|
|
|
|
var tablelist = tablestruc(tableName);
|
2025-04-17 14:48:05 +08:00
|
|
|
|
while (dataReader.Read())
|
|
|
|
|
|
{
|
2025-04-30 13:24:35 +08:00
|
|
|
|
maxid++;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
count++;
|
|
|
|
|
|
Console.WriteLine("记录行:" + count);
|
2025-04-30 13:24:35 +08:00
|
|
|
|
var map = new Dictionary<string, object>();
|
|
|
|
|
|
var errorData = new Dictionary<string, object>();
|
|
|
|
|
|
var flag1 = false;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
// 读取列
|
|
|
|
|
|
for (int i = 0; i < dataReader.FieldCount; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var colName = dataReader.GetName(i);
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
|
|
|
|
|
for (int l = 0; l < tablelist.Count; l++)
|
|
|
|
|
|
{
|
|
|
|
|
|
string cloName = tablelist[l].ColumnName;
|
|
|
|
|
|
string cloType = tablelist[l].Type;
|
|
|
|
|
|
if (colName.Equals(cloName) && "id".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;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
if (colName.ToLower().Contains("time"))
|
|
|
|
|
|
{
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (colName.ToLower().Equals("geometry"))
|
|
|
|
|
|
{
|
|
|
|
|
|
var geometry = (NetTopologySuite.Geometries.Geometry)dataReader.GetValue(i);
|
|
|
|
|
|
|
|
|
|
|
|
var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326)
|
|
|
|
|
|
.CreateGeometry(geometry);
|
2025-04-30 13:24:35 +08:00
|
|
|
|
map.Add("geom", geometryForWgs84.AsText());
|
|
|
|
|
|
|
|
|
|
|
|
errorData.Add("geom", geometryForWgs84.AsText());
|
2025-04-17 14:48:05 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
if (colName.Equals(cloName))
|
2025-04-17 14:48:05 +08:00
|
|
|
|
{
|
2025-04-30 13:24:35 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-30 13:24:35 +08:00
|
|
|
|
objs.Add(map);
|
2025-04-17 14:48:05 +08:00
|
|
|
|
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();
|
2025-04-30 13:24:35 +08:00
|
|
|
|
Dictionary<string, object> res = new Dictionary<string, object>();
|
|
|
|
|
|
res.Add("errorData", errordicts);
|
|
|
|
|
|
return new Response<Dictionary<string, object>>
|
|
|
|
|
|
{
|
|
|
|
|
|
Result = res
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new CommonException(ex.Message, 500);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
public async Task<Response<bool>> UploadShape3(string zipFilePath, string tableName
|
2025-04-17 14:48:05 +08:00
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
string srd = "";
|
|
|
|
|
|
using var db = Repository.AsSugarClient();
|
|
|
|
|
|
// 开启事务
|
2025-04-14 10:57:27 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
// 取得文件完全路径
|
|
|
|
|
|
zipFilePath = Path.Combine(_filePath, zipFilePath);
|
|
|
|
|
|
// 确保ZIP文件存在
|
|
|
|
|
|
if (!File.Exists(zipFilePath))
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new FileNotFoundException("ZIP文件未找到。");
|
|
|
|
|
|
}
|
2025-04-14 10:57:27 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
// 打开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())
|
2025-04-14 10:57:27 +08:00
|
|
|
|
{
|
2025-04-17 14:48:05 +08:00
|
|
|
|
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)
|
2025-04-14 10:57:27 +08:00
|
|
|
|
{
|
2025-04-17 14:48:05 +08:00
|
|
|
|
headlist.Add(dbaseFieldDescriptor.Name);
|
|
|
|
|
|
|
2025-04-14 10:57:27 +08:00
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
|
|
|
|
|
|
Console.WriteLine("记录数" + dataReader.RecordCount);
|
|
|
|
|
|
//throw new Exception("失败");
|
|
|
|
|
|
var objs = new List<Dictionary<string, object>>(1001);
|
|
|
|
|
|
var num = 0;
|
|
|
|
|
|
int count = 0;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
|
|
|
|
|
var maxid = nextid(tableName, "Id");
|
2025-04-17 14:48:05 +08:00
|
|
|
|
while (dataReader.Read())
|
|
|
|
|
|
{
|
|
|
|
|
|
count++;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
maxid++;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
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 = (NetTopologySuite.Geometries.Geometry)dataReader.GetValue(i);
|
|
|
|
|
|
|
|
|
|
|
|
var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326)
|
|
|
|
|
|
.CreateGeometry(geometry);
|
|
|
|
|
|
insertObj.Add("geom", geometryForWgs84.AsText());
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (header.Equals(colName))
|
|
|
|
|
|
{
|
|
|
|
|
|
|
2025-04-30 13:24:35 +08:00
|
|
|
|
if (header.Equals("Id"))
|
|
|
|
|
|
{
|
|
|
|
|
|
insertObj.Add(header, maxid);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
insertObj.Add(header, dataReader.GetValue(i));
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
objs.Add(insertObj);
|
|
|
|
|
|
if (num++ == 999)
|
|
|
|
|
|
{
|
|
|
|
|
|
await db.Insertable(objs)
|
|
|
|
|
|
.AS(tableName) // 指定目标表名
|
|
|
|
|
|
.ExecuteCommandAsync();
|
|
|
|
|
|
num = 0;
|
|
|
|
|
|
objs.Clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 读取末尾
|
|
|
|
|
|
await db.Insertable(objs)
|
|
|
|
|
|
.AS(tableName) // 指定目标表名
|
|
|
|
|
|
.ExecuteCommandAsync();
|
2025-04-14 10:57:27 +08:00
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
|
|
|
|
|
|
await db.Ado.CommitTranAsync();
|
2025-04-14 10:57:27 +08:00
|
|
|
|
await GeoUtil.CreateStoreAndLayer("", "EPSG:4326", tableName, "");
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
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文件");
|
|
|
|
|
|
}
|
2025-04-14 10:57:27 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
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>>();
|
2025-04-30 13:24:35 +08:00
|
|
|
|
List<Dictionary<string, object>> errordicts = new List<Dictionary<string, object>>();
|
2025-04-17 14:48:05 +08:00
|
|
|
|
using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default))
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
var dbfReader = dataReader.DbaseHeader;
|
|
|
|
|
|
List<string> headlist = new List<string>();
|
2025-04-30 13:24:35 +08:00
|
|
|
|
string ids = "";
|
2025-04-17 14:48:05 +08:00
|
|
|
|
foreach (var dbaseFieldDescriptor in dbfReader.Fields)
|
|
|
|
|
|
{
|
|
|
|
|
|
headlist.Add(dbaseFieldDescriptor.Name);
|
2025-04-30 13:24:35 +08:00
|
|
|
|
if ("id".Equals(dbaseFieldDescriptor.Name.ToLower()))
|
|
|
|
|
|
{
|
|
|
|
|
|
ids = dbaseFieldDescriptor.Name;
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Console.WriteLine("记录数" + dataReader.RecordCount);
|
|
|
|
|
|
//throw new Exception("失败");
|
|
|
|
|
|
var objs = new List<Dictionary<string, object>>(1001);
|
|
|
|
|
|
var num = 0;
|
|
|
|
|
|
int count = 0;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
|
|
|
|
|
var maxid = nextid(tableName, ids);
|
|
|
|
|
|
var tablelist = tablestruc(tableName);
|
2025-04-17 14:48:05 +08:00
|
|
|
|
while (dataReader.Read())
|
|
|
|
|
|
{
|
|
|
|
|
|
count++;
|
2025-04-30 13:24:35 +08:00
|
|
|
|
maxid++;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
Console.WriteLine("记录行:" + count);
|
2025-04-30 13:24:35 +08:00
|
|
|
|
var map = new Dictionary<string, object>();
|
|
|
|
|
|
var errorData = new Dictionary<string, object>();
|
|
|
|
|
|
var flag1 = false;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
// 读取列
|
|
|
|
|
|
Dictionary<string, object> dict = new Dictionary<string, object>();
|
|
|
|
|
|
// 读取列
|
|
|
|
|
|
var flag = false;
|
|
|
|
|
|
for (int i = 0; i < dataReader.FieldCount; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var colName = dataReader.GetName(i);
|
2025-04-30 13:24:35 +08:00
|
|
|
|
for (int l = 0; l < tablelist.Count; l++)
|
|
|
|
|
|
{
|
|
|
|
|
|
string cloName = tablelist[l].ColumnName;
|
|
|
|
|
|
string cloType = tablelist[l].Type;
|
|
|
|
|
|
if (colName.Equals(cloName) && "id".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 = (NetTopologySuite.Geometries.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.Equals(cloName))
|
|
|
|
|
|
{
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-04-17 14:48:05 +08:00
|
|
|
|
if (colName.ToLower().Equals("geometry"))
|
|
|
|
|
|
{
|
|
|
|
|
|
var geometry = (NetTopologySuite.Geometries.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;
|
2025-04-14 10:57:27 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
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));
|
|
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
|
2025-04-17 14:48:05 +08:00
|
|
|
|
|
2025-04-30 13:24:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
if (flag1)
|
|
|
|
|
|
{
|
|
|
|
|
|
errordicts.Add(errorData);
|
|
|
|
|
|
continue;
|
2025-04-17 14:48:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
if (flag)
|
|
|
|
|
|
{
|
|
|
|
|
|
dicts.Add(dict);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
objs.Add(map);
|
2025-04-17 14:48:05 +08:00
|
|
|
|
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);
|
2025-04-30 13:24:35 +08:00
|
|
|
|
res.Add("errorData", errordicts);
|
2025-04-17 14:48:05 +08:00
|
|
|
|
return new Response<Dictionary<string, object>>
|
|
|
|
|
|
{
|
|
|
|
|
|
Result = res
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new CommonException(ex.Message, 500);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-04-14 10:57:27 +08:00
|
|
|
|
}
|
2025-04-30 13:24:35 +08:00
|
|
|
|
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;
|
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
Object obj = null;
|
|
|
|
|
|
switch (type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case "real":
|
|
|
|
|
|
flag = double.TryParse(data,out d);
|
|
|
|
|
|
obj = d;
|
|
|
|
|
|
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;
|
|
|
|
|
|
default:
|
|
|
|
|
|
flag = false;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
dict.Add("flag", flag);
|
|
|
|
|
|
dict.Add("data", obj);
|
|
|
|
|
|
return dict;
|
|
|
|
|
|
}
|
2025-01-10 10:14:58 +08:00
|
|
|
|
}
|