UNPKG

kmap-ui

Version:

A components of zmap base on vue2.X

153 lines (139 loc) 5.06 kB
/* Copyright (c) 2018 Jean-Marc VIGLINO, released under the CeCILL-B license (French BSD license) (http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt). */ import ol_ext_inherits from '../util/ext' import ol_geom_Polygon from 'ol/geom/Polygon' import ol_Feature from 'ol/Feature' import ol_source_Vector from 'ol/source/Vector' import {ol_coordinate_toDFCI} from '../geom/DFCI' import {transformExtent as ol_proj_transformExtent} from 'ol/proj' import {register as ol_proj_proj4_register} from 'ol/proj/proj4.js'; import proj4 from 'proj4'; /** DFCI source: a source to display the French DFCI grid on a map * @see http://ccffpeynier.free.fr/Files/dfci.pdf * @constructor ol_source_DFCI * @extends {ol/source/Vector} * @param {any} options Vector source options * @param {Array<Number>} resolutions a list of resolution to change the drawing level, default [1000,100,20] */ var ol_source_DFCI = function(options) { options = options || {}; options.loader = this._calcGrid; options.strategy = function(extent, resolution) { if (this.resolution && this.resolution != resolution){ this.clear(); this.refresh(); } return [extent]; } this._bbox = [[0,1600000],[11*100000, 1600000+10*100000]]; ol_source_Vector.call (this, options); this.set('resolutions', options.resolutions || [1000,100,20]); // Add Lambert IIe proj if (!proj4.defs["EPSG:27572"]) proj4.defs("EPSG:27572","+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs"); ol_proj_proj4_register(proj4); }; ol_ext_inherits(ol_source_DFCI, ol_source_Vector); /** Cacluate grid according extent/resolution */ ol_source_DFCI.prototype._calcGrid = function (extent, resolution, projection) { // Show step 0 var f, ext, res = this.get('resolutions'); if (resolution > (res[0] || 1000)) { if (this.resolution != resolution) { if (!this._features0) { ext = [this._bbox[0][0], this._bbox[0][1],this._bbox[1][0], this._bbox[1][1]]; this._features0 = this._getFeatures(0, ext, projection); } this.addFeatures(this._features0); } } else if (resolution > (res[1] || 100)) { this.clear(); ext = ol_proj_transformExtent(extent, projection, 'EPSG:27572'); f = this._getFeatures(1, ext, projection) this.addFeatures(f); } else if (resolution > (res[2] || 0)) { this.clear(); ext = ol_proj_transformExtent(extent, projection, 'EPSG:27572'); f = this._getFeatures(2, ext, projection) this.addFeatures(f); } else { this.clear(); ext = ol_proj_transformExtent(extent, projection, 'EPSG:27572'); f = this._getFeatures(3, ext, projection) this.addFeatures(f); } // reset load this.resolution = resolution; }; /** * Get middle point * @private */ ol_source_DFCI.prototype._midPt = function(p1,p2) { return [(p1[0]+p2[0])/2, (p1[1]+p2[1])/2]; }; /** * Get feature with geom * @private */ ol_source_DFCI.prototype._trFeature = function(geom, id, level, projection) { var g = new ol_geom_Polygon([geom]); var f = new ol_Feature(g.transform('EPSG:27572', projection)); f.set('id', id); f.set('level', level); return f; }; /** Get features * */ ol_source_DFCI.prototype._getFeatures = function (level, extent, projection) { var features = []; var i; var step = 100000; if (level>0) step /= 5; if (level>1) step /= 10; var p0 = [ Math.max(this._bbox[0][0], Math.floor(extent[0]/step)*step), Math.max(this._bbox[0][1], Math.floor(extent[1]/step)*step) ]; var p1 = [ Math.min(this._bbox[1][0]+99999, Math.floor(extent[2]/step)*step), Math.min(this._bbox[1][1]+99999, Math.floor(extent[3]/step)*step) ]; for (var x=p0[0]; x<=p1[0]; x += step) { for (var y=p0[1]; y<=p1[1]; y += step) { var p, geom = [ [x,y], [x+step, y], [x+step, y+step], [x , y+step], [x,y]]; if (level>2) { var m = this._midPt(geom[0],geom[2]); // .5 var g = []; for (i=0; i<geom.length; i++) { g.push(this._midPt(geom[i],m)) } features.push(this._trFeature(g, ol_coordinate_toDFCI([x,y], 2)+'.5', level, projection)); // .1 > .4 for (i=0; i<4; i++) { g = []; g.push(geom[i]); g.push(this._midPt(geom[i],geom[(i+1)%4])); g.push(this._midPt(m,g[1])); g.push(this._midPt(m,geom[i])); p = this._midPt(geom[i],geom[(i+3)%4]); g.push(this._midPt(m,p)); g.push(p); g.push(geom[i]); features.push(this._trFeature(g, ol_coordinate_toDFCI([x,y], 2)+'.'+(4-i), level, projection)); } } else { features.push(this._trFeature(geom, ol_coordinate_toDFCI([x,y], level), level, projection)); } } } return features }; export default ol_source_DFCI