javascript proj4 включает / импортирует из epsg.io
Я часами пытался включить код, возвращенный (см. Ниже) http://epsg.io/2193.js в свое приложение.
proj4.defs("EPSG:2193","+proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996 +x_0=1600000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs");
Если я скопирую и вставлю приведенный выше код, он работает нормально, но мне нужно динамически создать URL-адрес и включить этот код, используя что-то вроде:-
var url = 'http://epsg.io/2193.js';
require([url]);
Я всегда получаю сообщение об ошибке, что proj4 не определен (строка 1 URL), поэтому он указывает на проблему с областью видимости. Это в виджете додзё (если это актуально). Я ссылаюсь proj4
от //cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.3/proj4.js
Что мне здесь не хватает?
1 ответ
Как вы грузите proj4js
?
Если вы используете стиль AMD, вам нужно немного обернуть его так:
require([
"//cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.3/proj4.js"
], function(proj4) {
var url = 'http://epsg.io/2193.js';
window.proj4 = proj4; // add to global scope
require([url], function() {
// now you can use proj4 with NZTM loaded in this block.
);
});
Это кажется немного волшебным для меня, потому что вы надеетесь, что proj4
всегда будет правильное имя, и вы добавляете proj4
в глобальном масштабе, что немного нечисто. Я был бы склонен использовать .proj4
расширение с dojo/text
Плагин AMD:
require([
"//cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.3/proj4.js"
"dojo/text!http://epsg.io/2193.proj4"
], function(proj4, epsg2193) {
proj4.defs(epsg2193);
// now you can use proj4 with NZTM loaded.
});
Это означает, что вы можете загрузить оба ресурса одновременно.
К сожалению, похоже, что отсутствие Access-Control-Allow-Origin
Заголовки в ответе нарушают этот подход, но вы можете посмотреть на прокси через свой собственный домен, если вам нужна производительность.
Кстати, вы могли бы немного обмануть первый вариант, определив фальшивку proj
объект:
var Proj4Proxy = function() {
this._defs = [];
}
Proj4Proxy.prototype.defs = function(crs) { this._defs.push(crs); };
var proj4 = new Proj4Proxy();
require([
"dojo/_base/array",
"//cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.3/proj4.js",
"//epsg.io/2193.js"
], function(array, _proj4) {
array.forEach(proj4._defs, function(crs) { _proj4.defs(crs); });
proj4 = _proj4;
// now you can use proj4 with NZTM loaded.
});
Лучший из обоих миров, если вы не возражаете против многословия.