public static string ProcessImageMap(Vector2d?[][] view, string imageName) { var features = view.Select(q => q.Select(p => !p.HasValue ? null : UsgsRawFeatures.GetData(p.Value)).ToArray()).ToArray(); var polys = View.GetPolygons(features); var polymap = polys .Where(p => p.Value != null) .Select(p => new { id = p.Value.Id, alt = p.Value.Name, coords = string.Join(",", p.Border.Select(q => q.X + "," + (view[0].Length - 1 - q.Y))), }) .Select(p => "<area href='" + p.alt + "' title='" + p.alt + "' alt='" + p.alt + "' shape='poly' coords='" + p.coords + "' >") .ToArray(); var mapId = Guid.NewGuid().ToString(); var mapText = "<div>" + "<map name='" + mapId + "'>" + string.Join("\r\n", polymap) + "</map>" + "<img src='" + imageName + "' usemap='#" + mapId + "' >" + "</div>"; return(mapText); }
public static async Task Doit(Config config, TraceListener log, Action <Stream, FeatureInfo[][]> drawToScreen) { DateTime start = DateTime.Now; BlobHelper.SetConnectionString(ConfigurationManager.AppSettings["ConnectionString"]); int subpixel = 3; var compositeBmp = new DirectBitmap(subpixel * config.Width, subpixel * config.Height); Device.RenderState renderState = new Device.RenderState(compositeBmp) { Camera = new Camera() { MaxAngleRad = config.MaxAngleDec * Math.PI / 180, MinAngleRad = config.MinAngleDec * Math.PI / 180, HeightOffset = config.HeightOffset, }, }; var chunks = View.GetRelevantChunkKeys(config, log); StandardChunkMetadata mainChunk = StandardChunkMetadata.GetRangeFromKey(chunks.Last()); var mainMesh = await Meshes.Current.GetData(mainChunk, log); var norm = mainMesh.GetCenterAndScale( config.Lat.DecimalDegree, config.Lon.DecimalDegree, mainChunk.ZoomLevel, mainChunk.LatDelta.DecimalDegree, 10, log); int counter = 0; foreach (var chunkKey in chunks) { StandardChunkMetadata chunk = StandardChunkMetadata.GetRangeFromKey(chunkKey); if (chunk == null) { continue; } var mesh = await Meshes.Current.GetData(chunk, log); if (mesh == null) { continue; } mesh.Match(norm); try { mesh.ImageData = await JpegImages.Current.GetData(chunk, log); } catch { } if (mesh.ImageData == null) { DirectBitmap tmp = new DirectBitmap(10, 10); tmp.SetAllPixels(new MyColor(0, 0, 0, 255)); using (var mss = new MemoryStream()) { tmp.WriteFile(OutputType.PNG, mss); mss.Position = 0; mesh.ImageData = new byte[mss.Length]; mss.Read(mesh.ImageData, 0, mesh.ImageData.Length); } } using (var renderMesh = SoftEngine.Mesh.GetMesh(mesh)) { Device.RenderInto(renderState, renderMesh); renderState.UpdateLatLons(chunk.LatLo, chunk.LatDelta, chunk.LonLo, chunk.LonDelta); } counter++; log?.WriteLine(counter); } FeatureInfo[][] features = renderState.GetLatLons().Select(q => q.Select(p => !p.HasValue ? null : UsgsRawFeatures.GetData(p.Value)).ToArray()).ToArray(); string fileNameRoot = DateTime.Now.ToString("HHmmss"); //config.LocalTime = new DateTimeOffset(2019, 3, 5, 0, 0, 0, TimeSpan.FromHours(-8)); //while (config.LocalTime < new DateTimeOffset(2019, 3, 6, 0, 0, 0, TimeSpan.FromHours(-8))) { var skyColor = new Nishita(config.SunPos); using (DirectBitmap lighted = renderState.RenderLight(config.Light, config.DirectLight, config.AmbientLight, skyColor)) { drawToScreen?.Invoke(lighted.GetStream(OutputType.PNG), features); using (var fs = File.OpenWrite("final_" + config.LocalTime.ToString("HHmmss") + "_" + fileNameRoot + ".jpg")) { lighted.WriteFile(OutputType.JPEG, fs); } } //config.LocalTime = config.LocalTime.AddHours(1); } DateTime end = DateTime.Now; log?.WriteLine(start); log?.WriteLine(end); log?.WriteLine(end - start); }