2012-01-09 10 views
12

लगभग एक हफ्ते पहले, मैं एक समस्या में भाग गया: एक कस्टम Google संचालित मानचित्र पर, मेरे बहुभुज दिखाई नहीं देंगे, जबकि एक ही निर्देशांक के लिए मार्कर पूरी तरह से ठीक हैं। Google मानचित्र API के साथ मेरे प्रयासों के बावजूद, ऐसा लगता है कि मुझे क्यों नहीं मिल रहा है।कुछ लैट्लिंग का उपयोग Google मानचित्र पर मार्कर लगाने के लिए कैसे किया जा सकता है, लेकिन पॉलीगॉन नहीं खींचा जा सकता है?

Here is a link to a screenshot of the map. बैंगनी तीर और नंबर मेरे अलावा रहे हैं, वे बताते हैं:

  1. google.maps.Marker मैं अपने "क्षेत्र" के किनारों पर लगा सके।
  2. google.maps.Polygon कोड द्वारा उत्पन्न आर्टिफैक्ट। यह अपेक्षित के रूप में लाल है, लेकिन पूरी तरह से जगह से बाहर और अजीब फ्लैट।

    var regionData = tecMap.regions[r]; 
    var regionMapMarkers = new google.maps.MVCArray(); 
    
    for (c in regionData.coords) { 
        var point = projection.worldToMap(regionData.coords[c]); 
        debugRegionPoints.push(point); 
        var thisLatLng = projection.fromPointToLatLng(point); 
        debugRegionLatLngs.push(thisLatLng); 
        regionMapMarkers.push(thisLatLng); 
    } 
    
    regionMapMarkers.forEach(function(latLng, m){ 
        var marker = new google.maps.Marker({  
         position: latLng, 
         map: map, 
         title: '', 
         optimized: false 
        }); 
        regionCorners.push(marker); 
    }); 
    
    var paths = new google.maps.MVCArray(); 
    paths.push(regionMapMarkers); 
    
    var region = new google.maps.Polygon({ 
        fillColor: "#FF0000", 
        fillOpacity: 0.35, 
        map: map, 
        paths: paths, 
        strokeColor: "#FF0000", 
        strokeOpacity: 0.8, 
        strokeWeight: 2  
    }); 
    regionPolys.push(region); 
    

    आप सरणियों की सरणी के बारे में सोच रहे हैं, यह Google Maps Javascript API के समान ही है:

यहाँ कोड का हिस्सा है जहां मार्करों और बहुभुज उत्पन्न कर रहे हैं है।

यदि आप मानचित्र और संबंधित स्क्रिप्ट पर एक नज़र रखना चाहते हैं, तो आप find it here कर सकते हैं। कोड स्निपेट Scripts/tectonicus.js में है, लाइन पर शुरू 659.

[संपादित करें] कुछ डिबगिंग जानकारी:

यह एक प्रतिपादन समस्या लगती है, एक एक "गणना" नहीं। फ़ायरबग कंसोल से, नक्शे में मैं जुड़ा हुआ है, दोनों

regionPolys[0].getPath().getArray(); 

और

for (i in regionCorners) {console.log(regionCorners[i].getPosition())}; 

वापस आ जाएगी

P { Na=0.2, Oa=-22.5249097921875} 
P { Na=-0.21702715474330336, Oa=-32.7277467} 
P { Na=0.19466306397879407, Oa=-37.51230686484375} 
P { Na=0.12889785332031245, Oa=-49.04594858671875} 

अगर मैं सही हूँ, इसका मतलब है कि वे एक ही निर्देशांक है, जो कोड के बराबर है।

[संपादित करें] नई प्रगति!

ऐसा लगता है कि एक कस्टम प्रोजेक्शन से निपटने के दौरान वैक्टरों ने समस्याएं प्रस्तुत की हैं, जैसे कि इस आइसोमेट्रिक माइनक्राफ्ट मानचित्र को प्रदर्शित करने के लिए उपयोग किया जाता है। (Tectonicus साथ जनरेट किया गया)

पिछले टिप्पणियों के बाद, मैं दो नए डिबग सरणी, debugRegionLatLngs और debugRegionPoints ऊपर लिंक को लाइव कोड को जोड़ने कर रहा हूँ। उपरोक्त कोड अपडेट किया गया है ताकि आप देख सकें कि उनमें क्या शामिल है।

[Edit3] प्रोजेक्शन और मेरा साथ

पार BicycleDude के अनुसंधान का समन्वय करता है, यह अब लगभग निश्चित है कि यह है कि बहुभुज जहाजों कस्टम प्रक्षेपण है। वास्तव में, a possibly related bug in Google Maps' API है।

यह प्रक्षेपण का उपयोग किया जाता है क्योंकि Minecraft नक्शे लगभग अनंत हो सकते हैं, और फिर भी एक जीएमएपी का उपयोग करना है, जो 360 डिग्री रेखांश के बाद घूमता है।यह भी तथ्य है कि ingame निर्देशांक एक isometric तरीके से गाया जाता है, जबकि gmaps मर्केटर प्रक्षेपण की तरह कुछ और उम्मीद करता है।

मैंने प्रक्षेपण को थोड़ा सा करने की कोशिश की, लेकिन अब तक कोई दिलचस्प परिणाम नहीं था।

+1

है मेरा मानना ​​है कि आप बहुभुज गुण में 'path' उपयोग कर रहे हैं, जबकि वास्तव में इस' होना चाहिए paths' अन्यथा, यह कहीं भी लाइव कोड देखने में मदद करेगा। चीयर्स, एंड्रेस – andresf

+0

मै मैप और संबंधित कोड की एक प्रति अपलोड करने के लिए कुछ जगह फहराया। लिंक सवाल में है। यदि कोई परीक्षण है तो आप मुझे दौड़ना चाहते हैं, कृपया पूछें। :) –

+0

क्या आप थोड़ा सा नमूना पोस्ट कर सकते हैं जो इसे पुन: उत्पन्न करता है, या कम से कम हमें अपने नमूने में Google मानचित्र कोड पर इंगित करता है? मैं सभी जावास्क्रिप्ट फाइलों में खो रहा हूं ... – bamnet

उत्तर

4

हम्म, मैंने इसे आगे देखा और मुझे वह स्लीवर पॉलीगॉन दिखाई देता है। यदि आप अपने अक्षांश को नोट करते हैं, तो वे 0 डिग्री के करीब हैं जिसका मतलब भूमध्य रेखा के पास लगभग एक फ्लैट रेखा है। मैंने अपने निर्देशांक को एक नए नए Google मानचित्र नमूने में चिपकाकर इसे स्वयं प्रमाणित किया है और वे आपके मार्करों के साथ स्थानिक रूप से स्थित नहीं दिखते हैं, इसलिए, आपको समीक्षा करने की आवश्यकता है कि समन्वय की जानकारी किस प्रकार छेड़छाड़ की जा रही है, क्षमा करें, मुझे पता है कि मैंने नहीं किया अपनी समस्या पाएं

मैंने आपकी कोडिंग शैली का उपयोग करने के लिए Google मानचित्र के बरमूडा त्रिभुज नमूने को संशोधित किया। यानी मैंने आपके चर को अपनाया और आपके कोड की भावना का पालन किया। यह उदाहरण 3 मार्कर प्रदर्शित करता है और बरमूडा त्रिभुज के लिए बहुभुज खींचता है।

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Bermuda Hack Triangle</title> 
    <meta name="viewport" 
     content="width=device-width, initial-scale=1.0, user-scalable=no"> 
    <meta charset="UTF-8"> 
    <style type="text/css"> 
     #map_canvas { 
     width: 500px; 
     height: 500px; 
     } 
    </style> 
    <script type="text/javascript" scr="https://github.com/douglascrockford/JSON-js/blob/master/json2.js"></script> 
    <script type="text/javascript" 
     src="http://maps.googleapis.com/maps/api/js?sensor=false"></script> 
    <script type="text/javascript"> 
     var map; 
     function initialize() { 
     var myoptions = { 
      zoom: 4, 
      center: new google.maps.LatLng(25, -70), 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
     }; 
     map = new google.maps.Map(
      document.getElementById('map_canvas'), 
      myoptions 
     ); 

     // Create pseudo coordinates 
     var regionMapMarkers = new google.maps.MVCArray(); 
     var p1 = new google.maps.LatLng(25, -80); 
     var p2 = new google.maps.LatLng(18, -66); 
     var p3 = new google.maps.LatLng(32, -64); 
     //p2.Qa += 360; 
     //p3.Qa -= 360; 
     regionMapMarkers.push(p1); 
     regionMapMarkers.push(p2); 
     regionMapMarkers.push(p3); 
     console.log(JSON.stringify(regionMapMarkers)); 

     // Draw Markers 
     regionMapMarkers.forEach(function(latLng, m){ 
      var marker = new google.maps.Marker(
      {   
      position: latLng, 
      map: map, 
      title: '', 
      optimized: false 
      }); 
     }); 

     // Draw Polygon 
     var region = new google.maps.Polygon({ 
      map: map, 
      paths: regionMapMarkers, 
      strokeColor: "#FF0000", 
      strokeOpacity: 0.8, 
      strokeWeight: 2, 
      fillColor: "#FF0000", 
      fillOpacity: 0.35 
     }); 
     } 

     google.maps.event.addDomListener(window, 'load', initialize); 
    </script> 
    </head> 
    <body> 
    <div id="map_canvas"></div> 
    </body> 
</html> 

नमूना काम करता है। यदि आप इसे चलाने के लिए थे तो आपको मार्करों से घिरे बरमूडा त्रिभुज मिलेगा। सवाल तब झूठ बोलता है, अभ्यास में, आपके एल्गोरिदम को कैसे प्रभावित कर सकता है? अब तक, हमने अनुमान लगाया है कि Minecraft प्रक्षेपण कुछ करता है। मुझे अभी भी विश्वास है कि मामला होना है।

उस सिद्धांत को प्रमाणित करने के लिए, मैंने बरमूडा त्रिभुज नमूना को तोड़ने की कोशिश की।

 p2.Qa += 360; 
     p3.Qa -= 360; 

क्या करता है यह अभी भी यह एक ही स्थान में मार्करों लेकिन बहुभुज भरण बिल्कुल spacko चला जाता है जगह करने की अनुमति देगा है: मैं जोड़ने और निम्नलिखित लाइनों uncommenting से दो अंक के लिए देशांतर 360 डिग्री को घटाकर की कोशिश की। मुझे विश्वास है कि यह आपके परिदृश्य में हो रहा है।

जो मैं आपको करने के लिए अनुशंसा करता हूं वह आपके आवेदन में समीक्षा समन्वय प्रणाली है। यदि आप नए निर्देशांक चुन सकते हैं तो आप ऐसी एज स्थितियों से होने से बच सकते हैं।

+0

मुझे लगता है कि अंतिम समन्वय निर्दिष्ट नहीं होने पर Google के कार्य बहुभुज को स्वचालित रूप से बंद कर रहे हैं। अपने विचार और कोड साझा करने के लिए धन्यवाद। मैं कुछ शोध करना जारी रखूंगा। +1 क्योंकि आपने इस पर कुछ समय बिताया था। :) –

+0

धन्यवाद @SilverFXQuettier। मैंने देखने के लिए आपके लिए अतिरिक्त शोध जोड़ा है। –

+0

मुझे समझ में नहीं आता है कि अजीब "एक्स" विशेषता के बावजूद, इन "thisLatLng" निर्देशांक का उपयोग इच्छित स्थान पर मार्कर लगाने के लिए क्यों किया जा सकता है। :/ –

0

मैंने देखा कि आप paths को एक एमवीसीएरे के रूप में पास कर रहे हैं जिसमें एक और एमवीसीएरे है। क्या आपने दस्तावेज़ों में Google के उदाहरण में बस एक साधारण सिंगल-आयाम सरणी पारित करने का प्रयास किया है?

और क्या आपको setMap() पर कॉल करने की आवश्यकता है या map संपत्ति में प्रस्तुत करने के लिए पर्याप्त संपत्ति है?


नीचे गूगल के बहुभुज() कोड उदाहरण ... (from here)

function initialize() { 
    var myLatLng = new google.maps.LatLng(24.886436490787712, -70.2685546875); 
    var myOptions = { 
    zoom: 5, 
    center: myLatLng, 
    mapTypeId: google.maps.MapTypeId.TERRAIN 
    }; 

    var bermudaTriangle; 

    var map = new google.maps.Map(document.getElementById("map_canvas"), 
     myOptions); 

    var triangleCoords = [ 
    new google.maps.LatLng(25.774252, -80.190262), 
    new google.maps.LatLng(18.466465, -66.118292), 
    new google.maps.LatLng(32.321384, -64.75737), 
    new google.maps.LatLng(25.774252, -80.190262) 
    ]; 

    // Construct the polygon 
    // Note that we don't specify an array or arrays, but instead just 
    // a simple array of LatLngs in the paths property 
    bermudaTriangle = new google.maps.Polygon({ 
    paths: triangleCoords, 
    strokeColor: "#FF0000", 
    strokeOpacity: 0.8, 
    strokeWeight: 2, 
    fillColor: "#FF0000", 
    fillOpacity: 0.35 
    }); 

    bermudaTriangle.setMap(map); 
} 
+1

हैलो साइमन - अफसोस की बात है, हां, समस्या तब होती है जब मैं 'पथ' (एकल सरणी) या 'पथ' विशेषता (सरणी की सरणी) का उपयोग करता हूं, और क्या नक्शा कन्स्ट्रक्टर में सेट किया गया है या 'setMap () 'समारोह। इस तरह एक नज़र रखने के लिए धन्यवाद :) –

संबंधित मुद्दे

 संबंधित मुद्दे