using EmbedIO; using EmbedIO.Routing; using EmbedIO.WebApi; using GeoSigma.SigmaDrawerUtil; using Swan.Formatters; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; namespace KevServer { public class TestJson { public int Name { get; set; } public string Age { get; set; } } /// /// 画布事件处理 Controller /// internal class DrawController : WebApiController { private const string ContentTextType = "text/plain"; private static readonly Object locker = new Object(); /// /// 用于测试的接口 /// /// pong [Route(HttpVerbs.Get, "/ping")] public bool TableTennis() { return true; } [Route(HttpVerbs.Get, "/status")] public bool Status() { return true; //return drawer?.Geo != null; } public string MapFile { get; set; } = string.Empty; public string ImageFile { get; set; } = string.Empty; public string BaseMapFile { get; set; } = string.Empty; [Route(HttpVerbs.Get, "/Open")] public async Task OpenAsync([QueryField] string drawId, [QueryField] string file, [QueryField] int w = 0, [QueryField] int h = 0) { if (GetCurrentDrawer(drawId) != null) { return drawId; } return await Task.Run(() => { string strServerPath = AppDomain.CurrentDomain.BaseDirectory; DrawerConfig.StartupPath = strServerPath; WebConfig.StartupPath = strServerPath; strServerPath = WebConfig.Instance.MapDirectory; MapFile = Path.Combine(strServerPath, file); ImageFile = Path.Combine(strServerPath, "K1.png"); WebDrawer drawer = null; lock (locker) { drawer = WebDrawer.OpenFile(MapFile); } if (drawer == null) { var result = new { errorMessage = $"Open ${file} failed" }; HttpContext.SendStringAsync(Json.Serialize(result), ContentTextType, System.Text.Encoding.UTF8); return ""; } drawer.DrawerSize = new Size(w, h); Guid guid = Guid.NewGuid(); Session[$"KevDrawer.id.{guid}"] = drawer; return guid.ToString(); }); } [Route(HttpVerbs.Get, "/Redraw")] public async Task Redraw([QueryField] string drawId, [QueryField] int w = 0, [QueryField] int h = 0) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return; } if (w > 0) { drawer.DrawerSize = new Size(w, drawer.DrawerSize.Height); } await ShowImgAsync(drawer); } /// /// 获得当前Session中的Drawer. /// /// A WebDrawer. private WebDrawer GetCurrentDrawer(string drawId) { if (Session.TryGetValue($"KevDrawer.id.{drawId}", out object oDrawer)) { return oDrawer as WebDrawer; } return null; } private async Task ShowImgAsync(WebDrawer drawer) { using (var bmp = new Bitmap(drawer.DrawerSize.Width, drawer.DrawerSize.Height)) { lock (locker) { Graphics g = Graphics.FromImage(bmp); drawer.OnPaint(g); } //bmp.MakeTransparent(Color.White); byte[] image = ConvertBitmapToByteArray(bmp); //byte[] image = GetBytesFromImage(ImageFile); await HttpContext.SendStringAsync(Convert.ToBase64String(image), ContentTextType, System.Text.Encoding.UTF8); } } [Route(HttpVerbs.Get, "/SaveFile")] public async Task SaveFileAsync([QueryField] string drawId) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return false; } return await Task.Run(() => { var savePath = Path.Combine(Environment.CurrentDirectory, drawer.DrawFileName); return drawer.Geo.SaveDocument(savePath); }); } [Route(HttpVerbs.Delete, "/DeleteFile")] public async Task DeleteFileAsync([QueryField] string drawId) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return false; } return await Task.Run(() => { var filePath = Path.Combine(Environment.CurrentDirectory, drawer.DrawFileName); drawer.Dispose(); File.Delete(filePath); return true; }); } [Route(HttpVerbs.Get, "/ZoomIn")] public async Task ZoomIn([QueryField] string drawId) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return; } drawer.ZoomIn(); await ShowImgAsync(drawer); } [Route(HttpVerbs.Get, "/ZoomOut")] public async Task ZoomOut([QueryField] string drawId) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return; } drawer.ZoomOut(); await ShowImgAsync(drawer); } [Route(HttpVerbs.Get, "/ViewAll")] public async Task ViewAll([QueryField] string drawId) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return; } drawer.ViewAll(); await ShowImgAsync(drawer); } [Route(HttpVerbs.Get, "/SelectAll")] public async System.Threading.Tasks.Task SelectAll([QueryField] string drawId, [QueryField] int arg) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return; } WebDrawToolSelect drawToolSelect = new WebDrawToolSelect(drawer.Geo); drawToolSelect.Start(); drawToolSelect.SelectAll(); await ShowImgAsync(drawer); } public static byte[] ConvertBitmapToByteArray(Bitmap bitmap) { using (MemoryStream memoryStream = new MemoryStream(bitmap.Width * bitmap.Height * 4)) { // 选择图像格式,可以是Png、Jpeg等 bitmap.Save(memoryStream, ImageFormat.Png); return memoryStream.ToArray(); } } /// /// 选中对象 /// /// [Route(HttpVerbs.Get, "/ClickImage")] public async Task ClickImageAsync([QueryField] string drawId, [QueryField] double x, [QueryField] double y) { Console.WriteLine("LbuttonDown"); var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return new ActionResult(0, null, 0, 0, 0, 0); } Bitmap bmp = drawer.OnLButtonDown(x, y); if (bmp == null) { return new ActionResult(0, null, 0, 0, 0, 0); } return await Task.Run(() => { bmp.MakeTransparent(Color.White); Point pt = drawer.CacheImgLocation; byte[] image = ConvertBitmapToByteArray(bmp); ActionResult result = new ActionResult(1, Convert.ToBase64String(image), pt.X, pt.Y, bmp.Width, bmp.Height); return result; }); } [Route(HttpVerbs.Get, "/LButtonUp")] public async Task LButtonUp([QueryField] string drawId, [QueryField] double x, [QueryField] double y) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return; } using (var bmp = drawer.LButtonUp(x, y)) { if (bmp != null) { byte[] image = ConvertBitmapToByteArray(bmp); await HttpContext.SendStringAsync(Convert.ToBase64String(image), ContentTextType, System.Text.Encoding.UTF8); } } } [Route(HttpVerbs.Get, "/TranslateElements")] public async Task TranslateElements([QueryField] string drawId, [QueryField] double x, [QueryField] double y) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return; } Bitmap bmp = drawer.TranslateElements(x, y); if (bmp != null) { byte[] image = ConvertBitmapToByteArray(bmp); await HttpContext.SendStringAsync(Convert.ToBase64String(image), ContentTextType, System.Text.Encoding.UTF8); } } [Route(HttpVerbs.Get, "/MouseMove")] public async Task MouseMove([QueryField] string drawId, [QueryField] double x, [QueryField] double y) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return -2; } return await Task.Run(() => { lock (locker) { return drawer.MouseMove(x, y); } }); } [Route(HttpVerbs.Get, "/ViewOperator")] public async Task ViewOperator([QueryField] string drawId, [QueryField] double startX, [QueryField] double startY, [QueryField] double endX, [QueryField] double endY) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return; } using (var bmp = drawer.ViewOperator(startX, startY, endX, endY)) { if (bmp != null) { byte[] image = ConvertBitmapToByteArray(bmp); await HttpContext.SendStringAsync(Convert.ToBase64String(image), ContentTextType, System.Text.Encoding.UTF8); } } } public byte[] GetBytesFromImage(string filename) { try { FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); int length = (int)fs.Length; byte[] image = new byte[length]; fs.Read(image, 0, length); fs.Close(); return image; } catch { return null; } } #region 图层管理 /// /// 获得图层数据. /// /// A Task. [Route(HttpVerbs.Get, "/GetLayers")] public async Task GetLayers([QueryField] string drawId) { var drawer = GetCurrentDrawer(drawId); if (drawer == null || drawer.LayerTree == null) { return; } var layersTemp1 = drawer.LayerTree.Layers.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); var layerList = new List(); foreach (var layer in layersTemp1) { if (layer.Split('|').Length > 0) { layerList.Add(layer.Split('|')[1]); } } var layerStr = string.Join(Environment.NewLine, layerList); await HttpContext.SendStringAsync(layerStr, ContentTextType, System.Text.Encoding.UTF8); } /// /// Sets the layers status. /// /// The layers status. /// VIEW_EDIT = 10, /// VIEW_NOT_EDIT = 11, /// NOT_VIEW_NOT_EDIT = 12 /// A Task. [Route(HttpVerbs.Get, "/SetLayersStatus")] public async Task SetLayersStatus([QueryField] string drawId, [QueryField] string layersStatus) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return; } GeoLayerTree layerTree = drawer.LayerTree; if (layerTree.SetLayersStatus(layersStatus)) { await ShowImgAsync(drawer); } } /// /// 删除图层 /// /// /// /// [Route(HttpVerbs.Delete, "/DeleteLayers")] public async Task DeleteLayers([QueryField] string drawId, [QueryField] string layers, [QueryField] bool withSubLayer) { var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return; } var layerArray = layers.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); await Task.Run(() => { lock (locker) { drawer.DeleteLayers(layerArray, withSubLayer); } }); } #endregion 图层管理 #region 底图管理 /// /// 添加底图 /// /// 文件路径 /// 文件路径 /// [Route(HttpVerbs.Post, "/AddBasicDraw")] public async Task AddBasicDraw([QueryField] string fileUrl, [QueryField] string fileName) { var strServerPath = WebConfig.Instance.BaseMapDirectory; if (!Directory.Exists(strServerPath)) { Directory.CreateDirectory(strServerPath); } try { fileName = fileName + "" + Path.GetExtension(fileUrl); BaseMapFile = Path.Combine(strServerPath, fileName); if (fileUrl.StartsWith("http://") || fileUrl.StartsWith("https://")) { using (var client = new WebClient()) { await client.DownloadFileTaskAsync(fileUrl, BaseMapFile); } } else { File.Copy(fileUrl, BaseMapFile, true); } return File.Exists(BaseMapFile) ? fileName : string.Empty; } catch (Exception e) { Console.WriteLine(e); } return string.Empty; } /// /// 底图列表 /// /// [Route(HttpVerbs.Get, "/ListBasicDraw")] public List GetBasicDrawList() { var strServerPath = WebConfig.Instance.BaseMapDirectory; return Directory.EnumerateFiles(strServerPath).ToList(); } /// /// 删除底图 /// /// /// [Route(HttpVerbs.Delete, "/DeleteBasicDraw")] public async Task DeleteBasicDraw([FormData] NameValueCollection data) { var baseDrawFiles = data.Get("baseDrawFiles"); if (baseDrawFiles == null) { return false; } var strServerPath = WebConfig.Instance.BaseMapDirectory; foreach (var s in Directory.GetFiles(strServerPath)) { if (baseDrawFiles.Contains(Path.GetFileName(s))) { File.Delete(s); } } return true; } [Route(HttpVerbs.Get, "/DecodeOverrideFile")] public bool DecodeOverrideFile([QueryField] string fileName) { //获取原路径目录 if (GeoSigmaDrawLib.FileUtility.IsTextFile(fileName)) { return false; } if (GeoSigmaDrawLib.FileUtility.DecodeFile(fileName, out string tempFileName)) { File.Copy(tempFileName, fileName, true); File.Delete(tempFileName); } else { return false; } return true; } [Route(HttpVerbs.Get, "/EncodeFile")] public bool EncodeFile([QueryField] string fileName) { if (!GeoSigmaDrawLib.FileUtility.IsTextFile(fileName)) { return true; } if (!fileName.Contains(".kev") && !Path.GetExtension(fileName).Equals(".kev")) { return true; } string tempFileName = Path.Combine(Path.GetDirectoryName(fileName), Guid.NewGuid().ToString()); //获取原路径目录 if (GeoSigmaDrawLib.FileUtility.EncodeFile(fileName, tempFileName)) { File.Copy(tempFileName, fileName, true); File.Delete(tempFileName); } else { return false; } return true; } #endregion #region 数据操作 [Route(HttpVerbs.Post, "/AddBufferData")] public async Task AddBufferData([FormData] NameValueCollection data) { string drawId = data.Get("drawId"); if (drawId == null) { return 0; } var drawer = GetCurrentDrawer(drawId); if (drawer == null) { return 0; } return await Task.Run(() => { lock (locker) { return drawer.AddBufferData(data.Get("data")); } }); } #endregion 数据操作 } public class ActionResult { public ActionResult(int resultType, string data, int imgLeft, int imgTop, int imgWidth, int imgHeight) { ResultType = resultType; Data = data; ImgLeft = imgLeft; ImgTop = imgTop; ImgWidth = imgWidth; ImgHeight = imgHeight; } public int ResultType { get; set; } = 0; public string Data { get; set; } = string.Empty; public int ImgLeft { get; set; } public int ImgTop { get; set; } public int ImgWidth { get; set; } public int ImgHeight { get; set; } } }