dojox
Version:
Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.
159 lines (140 loc) • 4.2 kB
JavaScript
define([
"dojo/_base/declare",
"dojo/_base/xhr",
"dojo/_base/lang",
"dojo/_base/array",
"./LineString",
"./Collection",
"./GeometryFeature"
], function(declare, xhr, lang, array, LineString, Collection, GeometryFeature){
/*=====
dojox.geo.openlayers.__JsonImportArgs = {
// summary:
// The keyword arguments that can be passed in a JsonImport constructor.
// url: String
// The url pointing to the JSON file to load.
// nextFeature: function
// The function called each time a feature is read. The function is called with a GeometryFeature as argument.
// error: function
// Error callback called if something fails.
};
=====*/
return declare("dojox.geo.openlayers.JsonImport", null, {
// summary:
// Class to load JSON formated ShapeFile as output of the JSon Custom Map Converter.
// description:
// This class loads JSON formated ShapeFile produced by the JSon Custom Map Converter.
// When loading the JSON file, it calls a iterator function each time a feature is read.
// This iterator function is provided as parameter to the constructor.
//
constructor : function(params){
// summary:
// Construct a new JSON importer.
// params: dojox.geo.openlayers.__JsonImportArgs
// The parameters to initialize this JsonImport instance.
this._params = params;
},
loadData: function(){
// summary:
// Triggers the loading.
var p = this._params;
xhr.get({
url: p.url,
handleAs: "json",
sync: true,
load: lang.hitch(this, this._gotData),
error: lang.hitch(this, this._loadError)
});
},
_gotData: function(/* Object */items){
// summary:
// Called when loading is complete.
// tags:
// private
var nf = this._params.nextFeature;
if(!lang.isFunction(nf)){
return;
}
var extent = items.layerExtent;
var ulx = extent[0];
var uly = extent[1];
var lrx = ulx + extent[2];
var lry = uly + extent[3];
var extentLL = items.layerExtentLL;
var x1 = extentLL[0];
var y1 = extentLL[1];
var x2 = x1 + extentLL[2];
var y2 = y1 + extentLL[3];
var ulxLL = x1;
var ulyLL = y2;
var lrxLL = x2;
var lryLL = y1;
var features = items.features;
for( var f in features){
var o = features[f];
var s = o["shape"];
var gf = null;
if(lang.isArray(s[0])){
var a = new Array();
array.forEach(s, function(item){
var ls = this._makeGeometry(item, ulx, uly, lrx, lry, ulxLL, ulyLL, lrxLL, lryLL);
a.push(ls);
}, this);
var g = new Collection(a);
gf = new GeometryFeature(g);
nf.call(this, gf);
}else{
gf = this._makeFeature(s, ulx, uly, lrx, lry, ulxLL, ulyLL, lrxLL, lryLL);
nf.call(this, gf);
}
}
var complete = this._params.complete;
if(lang.isFunction(complete)){
complete.call(this, complete);
}
},
_makeGeometry: function(/* Array */s, /* Float */ulx, /* Float */uly, /* Float */lrx, /* Float */
lry, /* Float */ulxLL, /* Float */ulyLL, /* Float */lrxLL, /* Float */lryLL){
// summary:
// Make a geometry with the specified points.
// tags:
// private
var a = [];
var k = 0.0;
for( var i = 0; i < s.length - 1; i += 2){
var x = s[i];
var y = s[i + 1];
k = (x - ulx) / (lrx - ulx);
var px = k * (lrxLL - ulxLL) + ulxLL;
k = (y - uly) / (lry - uly);
var py = k * (lryLL - ulyLL) + ulyLL;
a.push({
x: px,
y: py
});
}
var ls = new LineString(a);
return ls; // LineString
},
_makeFeature: function(/* Array */s, /* Float */ulx, /* Float */uly, /* Float */lrx, /* Float */
lry, /* Float */ulxLL, /* Float */ulyLL, /* Float */lrxLL, /* Float */lryLL){
// summary:
// Make a GeometryFeature with the specified points.
// tags:
// private
var ls = this._makeGeometry(s, ulx, uly, lrx, lry, ulxLL, ulyLL, lrxLL, lryLL);
var gf = new GeometryFeature(ls);
return gf;
},
_loadError: function(){
// summary:
// Called when an error occurs. Calls the error function is provided in the parameters.
// tags:
// private
var f = this._params.error;
if(lang.isFunction(f)){
f.apply(this, parameters);
}
}
});
});