2009-11-04 4 views
6

Ceci est ma première fois sur stackoverflow et de travailler avec Openlayers & Google Maps.OpenLayers Google Maps Projection Problème w/KML

J'ai parcouru différents sites & sites, y compris OpenLayers.org, pour résoudre mon problème. J'ai fait des recherches sur une combinaison de ce qui suit: Openlayers, google map projections, et mercator sphérique ... mais je n'ai pas trouvé de solution. Problème: Les données KML provenant d'un appel de service Web (func setDataSource) se déplacent lorsque j'effectue un zoom avant ou arrière sur la carte. Ma conjecture est que les projections dans mon code sont fausses ou mal placées. Je n'ai pas de fond sur les projections cartographiques il est donc difficile de digérer peut aider quelqu'un à la terminologie de cartographie en ligne :-(.?

//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); 

Merci !!!

+3

Les gars et les filles sur [GIS.stackexchange.com] (http://gis.stackexchange.com/) trouveront probablement plus facile de vous aider la prochaine fois .. – DefenestrationDay

+0

peut-être vous pouvez m'aider avec ce poblem [OpenLayers Google Map Borders] [1] [1]: http://stackoverflow.com/questions/29120583/how-to-remove-countries-borders-from-a-google- map-integrated-in-opnelayers –

Répondre

7

J'ai découvert le problème. Au lieu de GML, j'ai essayé d'utiliser Vector plutôt comme ceci:

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

Je trouve la solution dans cet exemple de cadrans solaires: http://openlayers.org/dev/examples/sundials-spherical-mercator.html :-) Hope this helps quelqu'un w/le même problème.

+1

J'ai eu un problème similaire. Après être passé à la dernière version d'OpenLayers, je ne savais pas où placer 'projection' et sans elle, mes fichiers KML étaient tous réduits à la coordonnée (0,0). Cette réponse l'a résolu pour moi, merci. –