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.
});

Лучший из обоих миров, если вы не возражаете против многословия.

Другие вопросы по тегам