0

我花了几个小时试图将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 未定义的错误(url 的第 1 行),因此它指向范围界定问题。这是在 dojo 小部件中(如果相关)。我proj4//cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.3/proj4.js

我在这里想念什么?

4

1 回答 1

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/textAMD 插件一起使用:

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

如果您不介意冗长的话,两全其美。

于 2014-11-25T00:44:46.343 回答