private void but_GDAL_Click(object sender, EventArgs e) { FolderBrowserDialog fbd = new FolderBrowserDialog(); if (fbd.ShowDialog() == DialogResult.OK) { if (Directory.Exists(fbd.SelectedPath)) { GDAL.GDAL.OnProgress += GDAL_OnProgress; GDAL.GDAL.ScanDirectory(fbd.SelectedPath); DTED.OnProgress += GDAL_OnProgress; DTED.AddCustomDirectory(fbd.SelectedPath); Loading.Close(); } } }
protected bool doCanRead(Object source, AVList parameters) { File file = this.getFile(source); if (null == file) { return(false); } // Assume that a proper suffix reliably identifies a DTED file. Otherwise the file will have to be loaded // to determine that, and there are often tens of thousands of DTED files, which causes raster server start-up // times to be excessive. if (this.canReadSuffix(source)) { parameters.setValue(AVKey.PIXEL_FORMAT, AVKey.ELEVATION); // we know that DTED is elevation data return(true); } bool canRead = false; try { AVList metadata = DTED.readMetadata(file); if (null != metadata) { if (null != parameters) { parameters.setValues(metadata); } canRead = AVKey.ELEVATION.Equals(metadata.getValue(AVKey.PIXEL_FORMAT)); } } catch (Throwable t) { Logging.logger().finest(t.getMessage()); canRead = false; } return(canRead); }
public static altresponce getAltitude(double lat, double lng, double zoom = 16) { short alt = 0; var trytiff = GeoTiff.getAltitude(lat, lng); if (trytiff.currenttype == tiletype.valid) { return(trytiff); } var trydted = DTED.getAltitude(lat, lng); if (trydted.currenttype == tiletype.valid) { return(trydted); } //lat += 1 / 1199.0; //lng -= 1 / 1201f; // lat -35.115676879882812 double // lng 117.94178754638671 double // alt 70 short var filename = GetFilename(lat, lng); if (String.IsNullOrEmpty(filename)) { return(altresponce.Invalid); } try { if (cache.ContainsKey(filename) || File.Exists(datadirectory + Path.DirectorySeparatorChar + filename)) { // srtm hgt files int size = -1; // add to cache if (!cache.ContainsKey(filename)) { using ( FileStream fs = new FileStream(datadirectory + Path.DirectorySeparatorChar + filename, FileMode.Open, FileAccess.Read, FileShare.Read)) { if (fs.Length == (1201 * 1201 * 2)) { size = 1201; } else if (fs.Length == (3601 * 3601 * 2)) { size = 3601; } else { return(srtm.altresponce.Invalid); } byte[] altbytes = new byte[2]; short[,] altdata = new short[size, size]; int altlat = 0; int altlng = 0; while (fs.Read(altbytes, 0, 2) != 0) { altdata[altlat, altlng] = (short)((altbytes[0] << 8) + altbytes[1]); altlat++; if (altlat >= size) { altlng++; altlat = 0; } } cache[filename] = altdata; } } if (cache[filename].Length == (1201 * 1201)) { size = 1201; } else if (cache[filename].Length == (3601 * 3601)) { size = 3601; } else { return(srtm.altresponce.Invalid); } int x = (lng < 0) ? (int)(lng - 1) : (int)lng; int y = (lat < 0) ? (int)(lat - 1) : (int)lat; // remove the base lat long lat -= y; lng -= x; // values should be 0-1199, 1200 is for interpolation double xf = lng * (size - 2); double yf = lat * (size - 2); int x_int = (int)xf; double x_frac = xf - x_int; int y_int = (int)yf; double y_frac = yf - y_int; y_int = (size - 2) - y_int; double alt00 = GetAlt(filename, x_int, y_int); double alt10 = GetAlt(filename, x_int + 1, y_int); double alt01 = GetAlt(filename, x_int, y_int + 1); double alt11 = GetAlt(filename, x_int + 1, y_int + 1); double v1 = avg(alt00, alt10, x_frac); double v2 = avg(alt01, alt11, x_frac); double v = avg(v1, v2, -y_frac); if (v < -1000) { return(altresponce.Invalid); } return(new altresponce() { currenttype = tiletype.valid, alt = v, altsource = "SRTM" }); } string filename2 = "srtm_" + Math.Round((lng + 2.5 + 180) / 5, 0).ToString("00") + "_" + Math.Round((60 - lat + 2.5) / 5, 0).ToString("00") + ".asc"; if (File.Exists(datadirectory + Path.DirectorySeparatorChar + filename2)) { using ( StreamReader sr = new StreamReader(readFile(datadirectory + Path.DirectorySeparatorChar + filename2))) { int nox = 0; int noy = 0; float left = 0; float top = 0; int nodata = -9999; float cellsize = 0; int rowcounter = 0; float wantrow = 0; float wantcol = 0; while (!sr.EndOfStream) { string line = sr.ReadLine(); if (line.StartsWith("ncols")) { nox = int.Parse(line.Substring(line.IndexOf(' '))); //hgtdata = new int[nox * noy]; } else if (line.StartsWith("nrows")) { noy = int.Parse(line.Substring(line.IndexOf(' '))); //hgtdata = new int[nox * noy]; } else if (line.StartsWith("xllcorner")) { left = float.Parse(line.Substring(line.IndexOf(' '))); } else if (line.StartsWith("yllcorner")) { top = float.Parse(line.Substring(line.IndexOf(' '))); } else if (line.StartsWith("cellsize")) { cellsize = float.Parse(line.Substring(line.IndexOf(' '))); } else if (line.StartsWith("NODATA_value")) { nodata = int.Parse(line.Substring(line.IndexOf(' '))); } else { string[] data = line.Split(new char[] { ' ' }); if (data.Length == (nox + 1)) { wantcol = (float)((lng - Math.Round(left, 0))); wantrow = (float)((lat - Math.Round(top, 0))); wantrow = (int)(wantrow / cellsize); wantcol = (int)(wantcol / cellsize); wantrow = noy - wantrow; if (rowcounter == wantrow) { Console.WriteLine("{0} {1} {2} {3} ans {4} x {5}", lng, lat, left, top, data[(int)wantcol], (nox + wantcol * cellsize)); return(new altresponce() { currenttype = tiletype.valid, alt = int.Parse(data[(int)wantcol]) }); } rowcounter++; } } } } return(new altresponce() { currenttype = tiletype.valid, alt = alt, altsource = "ASCII" }); } else // get something { if (filename.Contains("S00W000") || filename.Contains("S00W001") || filename.Contains("S01W000") || filename.Contains("S01W001")) { return(altresponce.Ocean); } if (oceantile.Contains(filename)) { return(altresponce.Ocean); } if (zoom >= 7) { if (!Directory.Exists(datadirectory)) { Directory.CreateDirectory(datadirectory); } if (requestThread == null) { // log.Info("Getting " + filename); lock (objlock) { queue.Add(filename); } requestThread = new Thread(requestRunner); requestThread.IsBackground = true; requestThread.Name = "SRTM request runner"; requestThread.Start(); } else { lock (objlock) { if (!queue.Contains(filename)) { //log.Info("Getting " + filename); queue.Add(filename); } } } } } } catch (Exception ex) { //log.Error(ex); return(altresponce.Invalid); } return(altresponce.Invalid); }