Невозможно использовать конкретную проекцию с OpenLayers

Я хотел бы использовать конкретную проекцию с OpenLayers. Я связал proj4js со своим html

<html>
  <head>
    <title>OpenLayers Test</title>
    <style type="text/css">
            #map {
                width: 600px;
                height: 300px;
                border: 1px solid black;
                float:left;
            }
        </style>
    <script type="text/javascript" src="http://svn.osgeo.org/metacrs/proj4js/trunk/lib/proj4js-compressed.js"></script>
    <script type="text/javascript" src="OpenLayers.js"></script>
    <script type="text/javascript" src="code.js"></script>
    <link rel="stylesheet" href="http://openlayers.org/dev/theme/default/style.css" type="text/css">
  </head>

  <body onload="init()">
    <div id=map>
    </div>
    <div id=map_coord></div>
    <div id=lonlat></div>
  </body>
</html>

и добавил новую проекцию:

Proj4js.defs["EPSG:987654"] = "+proj=eqdc +lat_1=46.4 +lat_2=71.8 +lon_0=100 +ellps=krass +units=m +no_defs";

Но перепроецирование не работает, я получаю значения NaN. Вот code.js:

Proj4js.defs["EPSG:987654"] = "+proj=eqdc +lat_1=46.4 +lat_2=71.8 +lon_0=100 +ellps=krass +units=m +no_defs";

var map;

OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {
    defaultHandlerOptions: {
    'single': true,
    'double': false,
    'pixelTolerance': 0,
    'stopSingle': false,
    'stopDouble': false
    },

    initialize: function(options) {
        this.handlerOptions = OpenLayers.Util.extend(
            {}, this.defaultHandlerOptions
        );
        OpenLayers.Control.prototype.initialize.apply(
            this, arguments
        );

        this.handler = new OpenLayers.Handler.Click(
            this, {
                'click': this.trigger
            }, this.handlerOptions
        );
     },

    trigger: function(e) {
        var mapcoord = map.getLonLatFromPixel(e.xy);
        mapcoord.transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:987654"));
        alert(mapcoord);
   }

});

function init()
{

    map = new OpenLayers.Map('map',
        {
            controls: [
              new OpenLayers.Control.MousePosition ({
                div: document.getElementById("map_coord")
              }),
              new OpenLayers.Control.MousePosition ({
                div: document.getElementById("lonlat"),
                displayProjection: new OpenLayers.Projection('EPSG:4326')
              })
            ],
            units: "m",
            projection: "EPSG:987654",
            maxExtent: new OpenLayers.Bounds(-5000000, 4400000, 4000000, 10000000)
        }
    );

    var ltopo = new OpenLayers.Layer.WMS("topo", "http://ows.mgs.geosys.ru/topo/base",
            { layers: "topo_land,world_ocean,topo_base,elev,vegt,lcov,phys,bath,hyps,dnet_pg,pplc_pg,dnet_pt,hydr,clmk,infr"}
        );

   map.addLayers([ltopo]);
   var click = new OpenLayers.Control.Click();
   map.addControl(click);
   click.activate();

   map.zoomTo(3);
}

person Alexander Popov    schedule 21.07.2014    source источник
comment
Это ваша проекция, не так ли? Не могли бы вы добавить пару пар координат источника и назначения (4326) и того, что вы ожидаете увидеть, чтобы мы могли попробовать это с proj4js, где, как я подозреваю, может быть проблема.   -  person John Powell    schedule 21.07.2014
comment
-4481368.53 6317117.12 43d19'0.902E 38d55'35.034N -5724363.14 5844144.14 38d54'46.852E 27d35'9.783N   -  person Alexander Popov    schedule 21.07.2014
comment
Метод преобразования - это tranfrom (from, to, method), и у вас есть EPSG: 987654 в качестве проекции вашей карты, поэтому я думаю, что линия, которая выполняет преобразование, должна быть такой: mapcoord.transform (новый OpenLayers.Projection (EPSG: 987654) ), новый OpenLayers.Projection (EPSG: 4326)); Он все еще сломан, но я прав?   -  person John Powell    schedule 21.07.2014
comment
Да, вы правы, я перепутал исходную и конечную проекции при вызове метода преобразования. Но все равно не работает, возвращает (NaN, NaN). Так кажется ошибка в proj4js.   -  person Alexander Popov    schedule 22.07.2014
comment
Да, я не думаю, что это имеет какое-то отношение к OpenLayers. Было бы проще отлаживать непосредственно в proj4js, поэтому я попросил точки выборки и ожидаемый результат.   -  person John Powell    schedule 22.07.2014


Ответы (1)


Проблема решена. Мне выдали плохую строку проекции (пропущены некоторые параметры). Вместо использования

+ proj = eqdc + lat_1 = 46,4 + lat_2 = 71,8 + lon_0 = 100 + ellps = krass + units = m + no_defs

Я должен был использовать

+ proj = eqdc + lon_0 = 100 + lat_0 = 0 + x_0 = 0 + y_0 = 0 + lat_1 = 46,4 + lat_2 = 71,8 + towgs84 = 0,0,0,0,0,0,0 + эллипсы = krass + единицы = m + no_defs

Но любопытно, что C-версия Proj4 отлично работает и с первой строкой.

Спасибо Джону Барсе за помощь.

person Alexander Popov    schedule 22.07.2014