OpenLayers 2 में Google परत पर lat / lon पॉइंट को ओवरले कैसे करें?


13

मैं OpenLayers में एक Google परत के शीर्ष पर lat / lon में एक वेक्टर बिंदु जोड़कर अटक गया हूं। मानचित्र को पैन करते समय बिंदु आगे बढ़ रहा है। यदि मैं Google परत को WGS84 में एक परत के साथ प्रतिस्थापित करता हूं तो ऐसा नहीं होता है। मैं इसे कैसे ठीक करूं?

map = new OpenLayers.Map('map');
map.addControl(new OpenLayers.Control.LayerSwitcher());

var gmap = new OpenLayers.Layer.Google(
            "Google Streets", 
            {numZoomLevels: 20}
           );
var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

map.addLayers([gmap,pointLayer]);
map.setCenter(new OpenLayers.LonLat(16.373056, 48.208333), 5);

var point = new OpenLayers.Geometry.Point(16.373056, 48.208333);
var pointFeature = new OpenLayers.Feature.Vector(point,null,null);
pointLayer.addFeatures([pointFeature]);

मैंने http://docs.openlayers.org/library/spherical_mercator.html का अनुसरण करने की कोशिश की है, लेकिन सफलता के बिना।


मेरी समस्या उसी पृष्ठ पर Jquery के उपयोग से संबंधित है। ठीक काम करता है अगर मैं Jquery के सभी संदर्भों को पुनः प्राप्त करता हूं।

जवाबों:


11

आवश्यक परिणाम प्राप्त करने के लिए आपको कुछ बदलाव जोड़ने होंगे:

  1. SphericalMercator जोड़ें : आपकी Google परत पर सच्ची संपत्ति इसलिए वेक्टर लेयर्स को आपके Google बेस लेयर के ऊपर सही तरीके से दिखाया गया है (यह स्थानांतरण ज्यामिति का कारण है)।
  2. अपनी Google परत की अधिकतम संपत्ति में जोड़ें, अन्यथा मानचित्र का केंद्र सही ढंग से सेट नहीं किया जाएगा। नीचे दी गई सीमा मर्केटर निर्देशांक में दुनिया की सीमा है।
  3. जैसा कि user1795 ने कहा है कि आपके पॉइंट ज्योमेट्री को मैप पर सही ढंग से प्रदर्शित होने के लिए 4326 से वेब मर्केटर पर रीप्रोडक्ट करना होगा।
  4. यह सेटेंटर लोनलैट पर भी लागू होता है इसलिए आपको इसे भी बदलना होगा।

नीचे काम कोड:

            map = new OpenLayers.Map('map');
            map.addControl(new OpenLayers.Control.LayerSwitcher());

            var proj = new OpenLayers.Projection("EPSG:4326");

            var gmap = new OpenLayers.Layer.Google("Google Streets", {
                sphericalMercator: true,
                'maxExtent': new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34)
            });
            var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

            map.addLayers([gmap, pointLayer]);
            var lonlat = new OpenLayers.LonLat(16.373056, 48.208333);
            lonlat.transform(proj, map.getProjectionObject());
            map.setCenter(lonlat, 5);

            var point = new OpenLayers.Geometry.Point(16.373056, 48.208333);
            point = point.transform(proj, map.getProjectionObject());
            //console.log(point);
            var pointFeature = new OpenLayers.Feature.Vector(point, null, null);
            pointLayer.addFeatures([pointFeature]);

यह महान काम करता है! जब ट्रांसफॉर्मेशन की बात आती है तो ओपन लाइयर्स वास्तव में सहज नहीं होते हैं। क्या यह 'स्पेरिकलमेकर' विकल्प है जो वास्तव में अस्वीकृति को सक्षम करता है?
UnderDark

1
सहमति दें कि यह सहज ज्ञान युक्त नहीं है। गोलाकार मेसर्चर
geographer

4

यह एक प्रक्षेपण समस्या है, आपको बिंदु के प्रक्षेपण को आधार परत (Google मानचित्र यहां) में बदलना होगा। निम्नलिखित कोड काम करना चाहिए

    map = new OpenLayers.Map('map');
    map.addControl(new OpenLayers.Control.LayerSwitcher());

    var gmap = new OpenLayers.Layer.Google(
        "Google Streets", 
        {numZoomLevels: 20}
    );
    var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

    map.addLayers([gmap,pointLayer]);
    map.setCenter(new OpenLayers.LonLat(16.373056, 48.208333), 5);

    var point = new OpenLayers.Geometry.Point(16.373056, 48.208333);
    point.transform(new OpenLayers.Projection("EPSG:4326"),new OpenLayers.Projection("EPSG:900913"));
    var pointFeature = new OpenLayers.Feature.Vector(point,null,null);
    pointLayer.addFeatures([pointFeature])

इसका कारण यह है कि गूगल मैप (गोलाकार व्यापारी) का डिफ़ॉल्ट प्रक्षेपण 900913 है और यह 4326 में लोनलट में एक साधारण बिंदु है।

कृपया सुनिश्चित करें कि बिंदु (देशांतर, अक्षांश) के रूप में निर्धारित है और अक्षांश (देशांतर) के रूप में नहीं है।


परिवर्तन जोड़ने से मेरे मानचित्र पर बिंदु गायब हो जाता है। मेरा OpenLayers संस्करण 2.9.1 है अगर इससे कोई फर्क पड़ता है।
UnderDark

बिंदु। ट्रांसफॉर्मर ने मेरे लिए चाल चली!
स्टीफन

1

जब आप Google मैप्स जेएस एपीआई के साथ काम कर रहे हैं, तो आपको संस्करण पर सावधान रहना चाहिए। विकास संस्करण Google JS Maps API के साथ जाने के लिए डिफ़ॉल्ट है। पृष्ठ देखें: http://code.google.com/apis/maps/documentation/javascript/basics.html#Versioning

और Google मैप्स JS टीम फिक्सिंग बग्स भी। Http://code.google.com/p/gmaps-ap-issues/wiki/JavascriptMapsAPIv3shangogog चेक करें

भविष्य में, प्रश्न में Google मैप्स एपीआई संस्करण का उल्लेख करें। v3.3 में ओपनएयर के साथ कोई समस्या नहीं थी जैसा कि ज्यादातर डेवलपर्स द्वारा उपयोग किया जाता है।


हाय सेंथिल, मुझे यकीन नहीं है कि Google मैप्स जेएस एपीआई संस्करण ओपनलाइयर के साथ मेरी समस्या को कैसे प्रभावित करते हैं।
UnderDark

हाय अंडरडार्क, मुझे v3.4 के साथ समस्या थी जब मैंने ओपनलेयर के साथ उपयोग किया और फिर विशेष रूप से 3.3 का उपयोग किया और जब गूगल मैप्स ट्रंक संस्करण का उपयोग किया, तो परिणाम जारी विकास के रूप में अप्रत्याशित हैं। क्या आपने संस्करण के साथ प्रयास किया है? भले ही आप सलामी बल्लेबाजों का उपयोग कर रहे हों, लेकिन Google नक्शे में अंतर्निहित एपी हैं।
सेंथिल

0

मुझे लगता है कि यह एक प्रक्षेपण मुद्दा है।

क्या आपने मानचित्र के पैन होने पर बिंदु के केंद्रक को रिपोर्ट करने की कोशिश की है? आप देख सकते हैं कि क्या कुछ बदल रहा है।

लेकिन क्या मैं योर कोड के बारे में देख रहा हूं, आप WGS84 बिंदु को एक अलग कोरॉर्ड्स में जोड़ देंगे


वैसे, क्या आपने अपने पास मौजूद नक्शे के प्रक्षेपण की क्वेरी करने की कोशिश की है, बस यह देखने के लिए कि यह वास्तव में क्या सेट है?
बालों वाली

और अंत में, क्षमा करें, लेकिन यदि आप प्रक्षेपण मुद्दे हैं तो अपनी बात को बदलने का एक तरीका है: var a = new OpenLayers.LonLat (3,53) .transform (ll, new OpenLayers.Projection ('EPSG: 900913')) ;
बालों वाली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.