OpenLayers में मानचित्र का प्रक्षेपण


22

मैं कुछ डेटा को ओवरले करना चाहता हूं, जिसका प्रक्षेपण OpenLayers में Google मानचित्र परत पर WGS-84 है। लेकिन मैं उन्हें सही जगह पर नहीं बना सकता। मैंने इस प्रकार किया:

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

हालाँकि मैंने veclayer4326 प्रोजेक्शन में असाइन किया है, लेकिन इसे अभी भी 900913 के रूप में समझा जाता है, और डिस्प्ले कोऑर्डिनेशन सिस्टम भी 900913 है, हालाँकि मैंने डिस्प्लेप्रोजिशन को 4326 पर सेट किया है। मैं क्या गलती करता हूँ?

जवाबों:


16

मैं "प्रीफेचर इंसरटर" का बहुत बड़ा प्रशंसक हूं ...।

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

अहा, यह काम करता है! आपका बहुत बहुत धन्यवाद। लेकिन मुझे आश्चर्य है कि संपत्ति preFeatureInsertका क्या मतलब है, किसी भी तरह से, मैं इसे आधिकारिक एपीआई डॉक्टर में नहीं पा सकता हूं ~
ChanDon

1
जहाँ तक im का संबंध है, यह अनुमानों को रूपांतरित करता है, जैसा कि फीचर डालने से पहले ... अच्छा और सामान्य है, और रूपांतरण कार्यों आदि की कोई आवश्यकता नहीं है
CatchingMonkey

6

आपके पास बृहदान्त्र के बाद एक स्थान है। Projection("EPSG: 4326")वास्तव में होना चाहिए Projection("EPSG:4326"), पहले कोई स्थान नहीं 4326


Haha यह वास्तव में काम करता है! मेरा मतलब डिस्प्ले प्रोजेक्शन से है। हालाँकि, ओवरलैड डेटा अभी भी सही जगह पर नहीं है (पहले की तरह ही गलत जगह)। कोई विचार?
चैनडॉन

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 मैप्स पर एक बग है जो OpenLayers Map ऑब्जेक्ट को शुरू करते समय div आकार का अच्छी तरह से मूल्यांकन नहीं करता है यदि यह अभी तक दिखाई नहीं दे रहा है। इसलिए ट्रांसफ़ॉर्म () और रिड्रा () कॉल के बाद, आपको 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

याहू के लिए आप इन विकल्पों की कोशिश कर सकते हैं:

baseLayerOptions:{
  sphericalMercator: true,
  maxExtent:new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.