Проекція карт у OpenLayers


22

Я хочу перекрити деякі дані, проекція яких WGS-84 на шарі карти Google у OpenLayers. Але я просто не можу зробити їх у потрібному місці. Я зробив так:

map = new OpenLayers.Map('map', {           
        numZoomLevels: 20,
        projection: new OpenLayers.Projection("EPSG:900913"),
        displayProjection: new OpenLayers.Projection("EPSG: 4326")
        });
googlelayer = new OpenLayers.Layer.Google("Google street", {sphericalMercator: true});
map.addLayer(googlelayer);
veclayer = new OpenLayers.Layer.Vector("vector", {
                                    projection: map.displayProjection
                                    };
var geojson_format = new OpenLayers.Format.GeoJSON();
veclayer.addFeatures(geojson_format.read(jsonData));

Хоча я призначив veclayerу проекції 4326, але це все ще інтерпретується як 900913, а система координації дисплея також 900913, хоча я встановив параметр displayProjection на 4326. Яку помилку я роблю?

Відповіді:


16

Я великий шанувальник "preFeatureInsert" ....

var veclayer = new OpenLayers.Layer.Vector("vector", {
           projection: map.displayProjection,
           preFeatureInsert: function(feature) {
           feature.geometry.transform(projWGS84,proj900913);
           }
        });

Ага, це працює! Велике спасибі. Але мені цікаво, що preFeatureInsertозначає власність , так чи інакше, я не можу її знайти в офіційному документі API ~
ChanDon

1
Що стосується ім, він перетворює проекції, як визначено, перед тим, як функція буде вставлена ​​... Приємно і загально, і не потрібно функцій перетворення тощо.
CatchingMonkey

6

У вас є пробіл після товстої кишки. Projection("EPSG: 4326")насправді не повинно бути Projection("EPSG:4326")місця раніше 4326.


Ха-ха, це справді працює! Я маю на увазі для проекції дисплея. Однак накладені дані все ще не в потрібному місці (те саме неправильне місце, що і раніше). Будь-які ідеї?
ChanDon

2
               map = new OpenLayers.Map('map',
                { numZoomLevels: 19,
                  units: 'm',
                  eventListeners: {"moveend": update_movend},
                  projection: new OpenLayers.Projection("EPSG:900913"),
                  displayProjection: new OpenLayers.Projection("EPSG:4326")

                });

        OpenLayers.Projection.addTransform("EPSG:4326", "EPSG:900913", OpenLayers.Layer.SphericalMercator.projectForward);
        OpenLayers.Projection.addTransform("EPSG:900913", "EPSG:4326", OpenLayers.Layer.SphericalMercator.projectInverse);


        var layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
        var layerTah = new OpenLayers.Layer.OSM.Osmarender("Osmarender");

        var gphy = new OpenLayers.Layer.Google(
            "Google Physical",
            {
                type: google.maps.MapTypeId.TERRAIN
            }
        );
//        gphy = map.projection;

        var gmap = new OpenLayers.Layer.Google(
            "Google Streets",
            {
                numZoomLevels: 20,
            }
        );
        //gmap = map.projection;

        layerMapnik.projection = map.projection;
        layerTah.projection = map.projection;

        vectors = new OpenLayers.Layer.Vector("Vector Layer");

          var help_layer = new OpenLayers.Layer.Vector("Waypoints", {
             projection: map.displayProjection,
             strategies: [new OpenLayers.Strategy.Fixed()],
         });

Я розмістив свій старий фрагмент коду. Я пам’ятаю, що клоу знаходиться в прогнозах. addTransform повинен вирішити вашу проблему. (proj4)


Дякую за твою допомогу. Але це, здається, не спрацювало
ChanDon

1

Ви можете потрапити туди, тому що ви шукаєте дещо зміщене представлення вектора на Картах Google, тоді як це добре на інших базових шарах і перетворення EPSG: 4326 на EPSG: 900913 або EPSG: 3857 не вирішує все.

На Картах Google є помилка, яка не оцінює добре розмір div під час ініціювання об’єкта OpenLayers Map, якщо він ще не видно. Тож після викликів transform () та перемальовування (), можливо, вам доведеться це зробити, myMapObject.updateSize();щоб повідомити Google про фактичну частку вашої карти на екрані.

Якщо ви шукаєте загальне рішення для перетворення шарів з однієї проекції в іншу, ви можете скористатися цією функцією:

var myMap = new OpenLayers.Map('mapDiv');

function mapBaseLayerChanged(evtObj) {
  var mapProj, baseProj, map_this, newBase;
  map_this = this;
  newBase = evtObj.layer;
  mapProj = (map_this.projection && map_this.projection instanceof OpenLayers.Projection) ?
            map_this.projection : new OpenLayers.Projection(map_this.projection);
  baseProj = newBase.projection;
  if (!(baseProj.equals(mapProj))) {
     var center, maxExt;
     center = map_this.getCenter().transform(mapProj, baseProj);
     maxExt = newBase.maxExtent;
     map_this.projection = baseProj;
     map_this.maxExtent = maxExt;
     map_this.setCenter(center, map_this.getZoom(), false, true);
     // Transforms all sub-layers
     for (var i = 0; i < map_this.layers.length; i++) {
        if (map_this.layers[i].isBaseLayer == false) {
           map_this.layers[i].addOptions({projection: baseProj}, true);
           // Transforms all features of the vectors
           for (var j = 0; j < map_this.layers[i].features.length; j++) {
              map_this.layers[i].features[j].geometry.transform(mapProj, baseProj);
           }
           map_this.layers[i].redraw();
        }
     }
     //Solves Google's problem (and mine at the same occasion)
     map_this.updateSize();
  }
}
myMap.events.register('changebaselayer', myMap, mapBaseLayerChanged);

Et voilà!


0

Для Yahoo ви можете спробувати такі варіанти:

baseLayerOptions:{
  sphericalMercator: true,
  maxExtent:new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.