import ol_ext_Ajax from '../util/Ajax.js' import { ol_geom_createFromType } from './GeomUtils.js' import ol_geom_Point from 'ol/geom/Point.js' import ol_geom_LineString from 'ol/geom/LineString.js' /** French Geoportail alti coding * @param {ol.geom.Geometry} geom * @param {Object} options * @param {ol/proj~ProjectionLike} [options.projection='EPSG:3857'] geometry projection, default 'EPSG:3857' * @param {number} [options.sampling=0] number of resulting point, max 5000, if none keep input points or use samplingDist * @param {number} [options.samplingDist=0] distance for sampling the line or use sampling if lesser * @param {number} [options.minZ=-99] min altitude (for undefined measures) * @param {string} options.success a function that takes the resulting XYZ geometry * @param {string} options.error */ var ol_geom_GPAltiCode = function(geom, options) { options = options || {}; var typeGeom = geom.getType(); if (typeGeom !== 'Point' && typeGeom !== 'LineString') { console.warn('[GPAltiCode] '+typeGeom+' not supported...') return; } var proj = options.projection || 'EPSG:3857'; var minZ = options.minZ === undefined ? -99 : options.minZ; var sampling = options.sampling || 0; if (options.samplingDist) { var d = geom.getLength(); sampling = Math.max(sampling, Math.round(d / options.samplingDist)); } if (sampling > 5000) sampling = 5000; if (sampling < 2) sampling = 0; geom = geom.clone().transform(proj, 'EPSG:4326'); var g, lon = [], lat = []; switch (typeGeom) { case 'Point': { g = [geom.getCoordinates()]; break; } case 'LineString': { g = geom.getCoordinates(); break; } default: return; } if (sampling <= g.length) sampling = 0; g.forEach(function(p) { lon.push(Math.round(p[0]*1000000)/1000000); lat.push(Math.round(p[1]*1000000)/1000000); }); // Get elevation var param = 'lon='+lon.join('|')+'&lat='+lat.join('|'); param += '&resource=ign_rge_alti_wld' if (sampling) param += '&sampling='+sampling; ol_ext_Ajax.get({ url: 'https://data.geopf.fr/altimetrie/1.0/calcul/alti/rest/'+(lon.length>1 ? 'elevationLine' : 'elevation')+'.json?'+param, success: function(res) { var pts = []; res.elevations.forEach(function(e, i) { if (sampling) { pts.push([e.lon, e.lat, Math.max(minZ, e.z)]); } else { pts.push([g[i][0], g[i][1], Math.max(minZ, e.z)]); } }); if (typeGeom==='Point') pts = pts[0]; var result = ol_geom_createFromType(typeGeom, pts); result.transform('EPSG:4326', proj); if (typeof(options.success) === 'function') options.success(result); }, error: function(e) { if (typeof(options.error) === 'function') options.error(e); } }); } export { ol_geom_GPAltiCode } /** Calculate elevation on coordinates or on a set of coordinates * @param {ol.coordinate|Array