Non puoi selezionare più di 25 argomenti
Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
76 righe
2.9 KiB
76 righe
2.9 KiB
//TODO: rewrite exif2geojson module and export |
|
/** Convert a list of image file or a list of image into geojson |
|
* reading location in the EXIF tags |
|
* @constructor |
|
* @param {Array<Image|File>} img the array to process |
|
* @param {} options |
|
* @param {boolean} camera true to get camera info |
|
* @param {boolean} options.date true to get photo date |
|
* @param {boolean} options.image true to get image info |
|
* @param {function} options.loading a callback function that take the number of image to process |
|
* @param {function} options.onLoad callback function that takes a geojson when loaded |
|
* @require Exif-JS [https://github.com/exif-js/exif-js] |
|
*/ |
|
/* global EXIF */ |
|
var exif2geojson; |
|
(function(){ |
|
// Get fractionnal number |
|
function getNumber(n) { return n.numerator / n.denominator; } |
|
// Convert to DMS |
|
function getDMS(l) { |
|
if (l) return getNumber(l[0]) + getNumber(l[1]) /60 + getNumber(l[2]) /3600; |
|
else return null; |
|
} |
|
// Constructor |
|
exif2geojson = function (img, options) { |
|
options = options || {}; |
|
if (typeof(options.loading) !== "function") options.loading = function(){}; |
|
if (typeof(options.onLoad) !== "function") options.onLoad = function(json){ console.log(json); }; |
|
// |
|
var json = { |
|
"type": "FeatureCollection", |
|
"features": [] |
|
}; |
|
var nb = img.length; |
|
for (var i=0, f; f=img[i]; i++) { |
|
EXIF.getData(f, function() { |
|
// console.log(this); |
|
if (this.exifdata.GPSLongitudeRef) { |
|
// json feature |
|
var fjs = { |
|
"type": "Feature", |
|
"properties": {}, |
|
"geometry": { |
|
"type": "Point", |
|
"coordinates": [] |
|
} |
|
}; |
|
json.features.push (fjs) |
|
fjs.geometry.coordinates = [ |
|
(this.exifdata.GPSLongitudeRef=='E'? 1: -1) * getDMS(this.exifdata.GPSLongitude), |
|
(this.exifdata.GPSLatitudeRef=='N'? 1: -1) * getDMS(this.exifdata.GPSLatitude) |
|
]; |
|
if (this.exifdata.GPSAltitude) fjs.geometry.coordinates.push (getNumber(this.exifdata.GPSAltitude)); |
|
fjs.properties.url = this.src || this.name; |
|
if (this.exifdata.ImageDescription) fjs.properties.description = this.exifdata.ImageDescription; |
|
if (options.date && this.exifdata.DateTime) fjs.properties.date = this.exifdata.DateTime; |
|
// Camera info |
|
if (options.camera) { |
|
if (this.exifdata.Make) fjs.properties.make = this.exifdata.Make; |
|
if (this.exifdata.Model) fjs.properties.model = this.exifdata.Model.replace(new RegExp(String.fromCharCode(0),'g'),""); |
|
} |
|
// Image info |
|
if (options.image) { |
|
fjs.properties.size = this.size; |
|
fjs.properties.type = this.type; |
|
if (this.exifdata.ImageHeight) fjs.properties.height = this.exifdata.ImageHeight; |
|
if (this.exifdata.ImageWidth) fjs.properties.width = this.exifdata.ImageWidth; |
|
} |
|
} |
|
nb--; |
|
options.loading(nb) |
|
if (!nb) options.onLoad(json); |
|
}); |
|
} |
|
} |
|
})();
|
|
|