2014-11-25 1 views
0

Я потратил часы, пытаясь включить возвращаемый код (см. Ниже) на http://epsg.io/2193.js в мое приложение.proj4 javascript include/import from epsg.io

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-адреса), поэтому он указывает на проблему определения области. Это находится в виджетах dojo (в случае, если это имеет значение). Я ссылаюсь на 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. 
}); 

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

+0

Это всегда proj4. Я попробовал ваше первое предложение, но proj4 еще не определено. Моя загрузка выглядит как 'define (['// cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.3/proj4.js'], function (proj4) { return declare ([], { _init function() { // требуется для proj4 defs идет здесь } ... Это находится в виджетах dojo, поэтому может возникнуть проблема с областью определения. – tr3v

+0

ну, это странно. Можете ли вы добавить минимальный неудачный пример ваш вопрос? трудно догадаться, где проблема. – Hamish

+0

Помогает ли это? http://jsfiddle.net/3amfzj1e/10/ – tr3v