183 lines
5.7 KiB
JavaScript
183 lines
5.7 KiB
JavaScript
/*
|
|
Copyright (c) 2018 Jean-Marc VIGLINO,
|
|
released under the CeCILL-B license (http://www.cecill.info/).
|
|
*/
|
|
|
|
import {get as ol_proj_get} from 'ol/proj.js';
|
|
import {transform as ol_proj_transform} from 'ol/proj.js';
|
|
import {register as ol_proj_proj4_register} from 'ol/proj/proj4.js';
|
|
import proj4 from 'proj4';
|
|
|
|
/** Convert coordinate to French DFCI grid
|
|
* @param {ol/coordinate} coord
|
|
* @param {number} level [0-3]
|
|
* @param {ol/proj/Projection} projection of the coord, default EPSG:27572
|
|
* @return {String} the DFCI index
|
|
*/
|
|
var ol_coordinate_toDFCI = function (coord, level, projection) {
|
|
if (!level && level !==0) level = 3;
|
|
if (projection) {
|
|
if (!ol_proj_get('EPSG:27572')) {
|
|
// 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);
|
|
}
|
|
coord = ol_proj_transform(coord, projection, 'EPSG:27572');
|
|
}
|
|
var x = coord[0];
|
|
var y = coord[1];
|
|
var s = '';
|
|
// Level 0
|
|
var step = 100000;
|
|
s += String.fromCharCode(65 + Math.floor((x<800000?x:x+200000)/step))
|
|
+ String.fromCharCode(65 + Math.floor((y<2300000?y:y+200000)/step) - 1500000/step);
|
|
if (level === 0) return s;
|
|
// Level 1
|
|
var step1 = 100000/5;
|
|
s += 2*Math.floor((x%step)/step1);
|
|
s += 2*Math.floor((y%step)/step1);
|
|
if (level === 1) return s;
|
|
// Level 2
|
|
var step2 = step1 / 10;
|
|
var x0 = Math.floor((x%step1)/step2);
|
|
s += String.fromCharCode(65 + (x0<8 ? x0 : x0+2));
|
|
s += Math.floor((y%step1)/step2);
|
|
if (level === 2) return s;
|
|
// Level 3
|
|
var x3 = Math.floor((x%step2)/500);
|
|
var y3 = Math.floor((y%step2)/500);
|
|
if (x3<1) {
|
|
if (y3>1) s += '.1';
|
|
else s += '.4';
|
|
} else if (x3>2) {
|
|
if (y3>1) s += '.2';
|
|
else s += '.3';
|
|
} else if (y3>2) {
|
|
if (x3<2) s += '.1';
|
|
else s += '.2';
|
|
} else if (y3<1) {
|
|
if (x3<2) s += '.4';
|
|
else s += '.3';
|
|
} else {
|
|
s += '.5';
|
|
}
|
|
return s;
|
|
};
|
|
|
|
/** Get coordinate from French DFCI index
|
|
* @param {String} index the DFCI index
|
|
* @param {ol/proj/Projection} projection result projection, default EPSG:27572
|
|
* @return {ol/coordinate} coord
|
|
*/
|
|
var ol_coordinate_fromDFCI = function (index, projection) {
|
|
var coord;
|
|
|
|
// Level 0
|
|
var step = 100000;
|
|
var x = index.charCodeAt(0) - 65;
|
|
x = (x<8 ? x : x-2)*step;
|
|
var y = index.charCodeAt(1) - 65;
|
|
y = (y<8 ? y : y-2)*step + 1500000;
|
|
if (index.length===2) {
|
|
coord = [x+step/2, y+step/2];
|
|
} else {
|
|
// Level 1
|
|
step /= 5;
|
|
x += Number(index.charAt(2))/2*step;
|
|
y += Number(index.charAt(3))/2*step;
|
|
if (index.length===4) {
|
|
coord = [x+step/2, y+step/2];
|
|
} else {
|
|
// Level 2
|
|
step /= 10;
|
|
var x0 = index.charCodeAt(4) - 65;
|
|
x += (x0<8 ? x0 : x0-2)*step;
|
|
y += Number(index.charAt(5))*step;
|
|
if (index.length === 6) {
|
|
coord = [x+step/2, y+step/2];
|
|
} else {
|
|
// Level 3
|
|
switch (index.charAt(7)) {
|
|
case '1':
|
|
coord = [x+step/4, y+3*step/4];
|
|
break;
|
|
case '2':
|
|
coord = [x+3*step/4, y+3*step/4];
|
|
break;
|
|
case '3':
|
|
coord = [x+3*step/4, y+step/4];
|
|
break;
|
|
case '4':
|
|
coord = [x+step/4, y+step/4];
|
|
break;
|
|
default:
|
|
coord = [x+step/2, y+step/2];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Convert ?
|
|
if (projection) {
|
|
if (!ol_proj_get('EPSG:27572')) {
|
|
// 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);
|
|
}
|
|
coord = ol_proj_transform(coord, 'EPSG:27572', projection);
|
|
}
|
|
|
|
return coord;
|
|
};
|
|
|
|
/** The string is a valid DFCI index
|
|
* @param {string} index DFCI index
|
|
* @return {boolean}
|
|
*/
|
|
var ol_coordinate_validDFCI = function (index) {
|
|
if (index.length<2 || index.length>8) return false;
|
|
if (/[^A-H|^K-N]/.test(index.substr(0,1))) return false;
|
|
if (/[^B-H|^K-N]/.test(index.substr(1,1))) return false;
|
|
if (index.length>2) {
|
|
if (index.length<4) return false;
|
|
if (/[^0,^2,^4,^6,^8]/.test(index.substr(2,1))) return false;
|
|
if (/[^0,^2,^4,^6,^8]/.test(index.substr(3,1))) return false;
|
|
}
|
|
if (index.length>4) {
|
|
if (index.length<6) return false;
|
|
if (/[^A-H|^K-L]/.test(index.substr(4,1))) return false;
|
|
if (/[^0-9]/.test(index.substr(5,1))) return false;
|
|
}
|
|
if (index.length>6) {
|
|
if (index.length<8) return false;
|
|
if (index.substr(6,1)!=='.') return false;
|
|
if (/[^1-5]/.test(index.substr(7,1))) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/** Coordinate is valid for DFCI
|
|
* @param {ol/coordinate} coord
|
|
* @param {ol/proj/Projection} projection result projection, default EPSG:27572
|
|
* @return {boolean}
|
|
*/
|
|
var ol_coordinate_validDFCICoord = function (coord, projection) {
|
|
if (projection) {
|
|
if (!ol_proj_get('EPSG:27572')) {
|
|
// 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);
|
|
}
|
|
coord = ol_proj_transform(coord, projection, 'EPSG:27572');
|
|
}
|
|
// Test extent
|
|
if (0 > coord[0] || coord[0] > 1200000 ) return false;
|
|
if (1600000 > coord[1] || coord[1] > 2700000 ) return false;
|
|
return true;
|
|
};
|
|
|
|
export {ol_coordinate_toDFCI}
|
|
export {ol_coordinate_fromDFCI}
|
|
export {ol_coordinate_validDFCI}
|
|
export {ol_coordinate_validDFCICoord} |