using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class GetElevationFromGeoServerTMS : MonoBehaviour { public static string url = "[[geoserver link]]/{0}/{1}/{2}.png"; private OnlineMapsTileSetControl control; public int resolution = 32; public int elevationScale = 1; bool getTiles = false; List tileRequests; private void Start() { tileRequests = new List(); // Get Tileset control. control = OnlineMapsControlBase.instance as OnlineMapsTileSetControl; control.elevationResolution = resolution; if (control == null) { Debug.LogError("You must use the Tileset control."); return; } OnlineMaps.instance.OnStartDownloadTile += OnStartDownloadTile; control.OnGetElevation += OnGetElevation; } private void OnGetElevation(Vector2 topLeftCoords, Vector2 bottomRightCoords) { if (!getTiles) getTiles = true; } private void OnStartDownloadTile(OnlineMapsTile tile) { if (!getTiles) return; tileRequests.Add(new TileRequest(tile)); OnlineMaps.instance.StartDownloadTile(tile); } private void CheckDownloadComplete() { bool hasComplete = false; foreach (TileRequest request in tileRequests) { if (request.www != null) { try { while (!request.www.isDone) { } } catch (Exception) { } } if (request.www.isDone) { if (string.IsNullOrEmpty(request.www.error)) { //default resize to 32x32 Texture2D tex = ResizeTexture2D.ResizeTexture (request.GetTexture2D(), ResizeTexture2D.ImageFilterMode.Average, resolution, resolution); Color[] colors = tex.GetPixels(); control.SetElevationData(GetElevation(colors, (int)Mathf.Sqrt(colors.Length))); } request.Dispose(); hasComplete = true; } } if (hasComplete) tileRequests.RemoveAll(d => d.tile == null); } private void Update() { CheckDownloadComplete(); OnlineMapsTileSetControl.instance.elevationScale = elevationScale; } short[,] GetElevation(Color[] colors, int resolution) { short[,] elevation = new short[resolution, resolution]; for (int i = 0; i < resolution; i++) { for (int j = 0; j < resolution; j++) elevation[i, j] = (short)(colors[i * resolution + j].grayscale * 1000); } return elevation; } internal class TileRequest { public OnlineMapsWWW www; public OnlineMapsTile tile; int y = -999; public TileRequest(OnlineMapsTile _tile) { int z = _tile.zoom; int ymax = 1 << z; y = ymax - _tile.y - 1; string urlFormatted = string.Format(url, _tile.zoom, _tile.x, y); www = new OnlineMapsWWW(urlFormatted); tile = _tile; } public Texture2D GetTexture2D() { Texture2D tex = new Texture2D(256, 256, TextureFormat.ARGB32, false); www.LoadImageIntoTexture(tex); return (tex); } public string GenerateImage(string path) { if (y != -999) { path += tile.zoom + "-" + tile.x + "-" + y + ".png"; System.IO.File.WriteAllBytes(path, www.bytes); return path; } return null; } public void Dispose() { www.Dispose(); www = null; tile = null; } } }