6

Stackoverflow で Openlayers と Google Maps を使用するのはこれが初めてです。

問題を解決するために、OpenLayers.org を含むさまざまなフォーラムやサイトを閲覧しています。次の組み合わせで検索を行いました: openlayers、Google マップ プロジェクション、および球状メルカトル... しかし、解決策が見つかりませんでした。

問題: Web サービス呼び出し (func setDataSource) からの KML データが、マップを拡大または縮小するとシフトします。私の推測では、私のコードのプロジェクションが間違っているか、間違って配置されている可能性があります。私は地図投影法の背景知識がないので、オンラインでマッピング用語を理解するのは難しいです :-(. 誰か助けてくれませんか?

   //start here
   var options = {
   projection: new OpenLayers.Projection("EPSG:900913"),
   displayProjection: new OpenLayers.Projection("EPSG:4326"),
   units: "m",
   numZoomLevels: 18,
              maxResolution: 156543.0339,
              maxExtent: new OpenLayers.Bounds(-20037508, -20037508,
                                              20037508, 20037508)}; 

   //*map = new OpenLayers.Map('map');

     map = new OpenLayers.Map('map', options);

    var gphy = new OpenLayers.Layer.Google(
             "Google Street",
    {'sphericalMercator':true});

   // Add the background images via WMS
  var bglayer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
               "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'}, {'reproject': true});

  //map.addLayer(bglayer);
    map.addLayers([gphy, bglayer]);
  map.addControl(new OpenLayers.Control.LayerSwitcher());

   map.zoomToMaxExtent(); //* Zoom all the way out, this command also initalizes the map
  OpenLayers.Console.log("initialized");
    }

function setDataSource() {
 OpenLayers.Console.log("Setting data source to " + OpenLayers.Util.getElement('loc').value);
 if (layer != undefined) {map.removeLayer(layer)};
 if (selectControl != undefined) {map.removeControl(selectControl)};

 // Encode the destination url as a parameter string.
 var params = OpenLayers.Util.getParameterString({url:OpenLayers.Util.getElement('loc').value})

 //  Make the http request to the transformer, with the destination url as a parameter.
 layer = new OpenLayers.Layer.GML("KML", transformerURL + params, 
           {
            format: OpenLayers.Format.KML, 
            formatOptions: {
            extractStyles: true, 
            extractAttributes: true,
  maxDepth: 2,

  //projection: new OpenLayers.Projection("EPSG:4326"),
             }
             });
  map.addLayer(layer); 

ありがとうございました!!!

4

1 に答える 1

7

私は問題を理解しました。GML の代わりに、次のように Vector を使用してみました。

layer = new OpenLayers.Layer.Vector("KML", {
            projection: map.displayProjection,
            strategies: [new OpenLayers.Strategy.Fixed()],
            protocol: new OpenLayers.Protocol.HTTP({
                url: transformerURL + params,
                format: new OpenLayers.Format.KML({
                    extractStyles: true,
                    extractAttributes: true
                })
            })
        });     

この日時計の例で解決策を見つけました: http://openlayers.org/dev/examples/sundials-spherical-mercator.html :-) これが同じ問題を抱えている人に役立つことを願っています。

于 2009-11-09T19:24:06.417 に答える