2015-06-07 4 views
7

मैं एक ऐसे आवेदन पर काम कर रहा हूं जहां मेरे पास सर्कल और त्रिज्या का केंद्र है और मैं सर्कल की मदद से सर्कल की योजना बना रहा हूं।एक सर्कल की परिधि पर एक पुस्तिका पुस्तिका रखने के लिए पैरामेट्रिक समीकरण सटीक नहीं है?

मैंने उत्तर में परिधि के सबसे अंत में एक मार्कर रखा और इसे खींचने योग्य बना दिया।

var circle = L.circle(coords, radius).addTo(map); 

convertRadiusToLatitude = parseInt(response.radius)/111111; 

var coordsOnRadius = [parseFloat(response.lat) + convertRadiusToLatitude, parseFloat(response.long)]; 
var markerOnRadius = L.marker(coordsOnRadius, {draggable: true}).addTo(map); 

अब, यह परिधि के लिए मार्कर कहते हैं और अब मैं यह केवल परिधि में ही है जिसके लिए मैं पैरामीट्रिक समीकरण का इस्तेमाल किया पर खींचने योग्य बनना चाहता था।

पैरामीट्रिक समीकरण

x = Xc + R * cos(theta) 
y = Yc + R * sin(theta) 

कोड के लिए खींच

markerOnRadius.on('drag', function(e){ 

    bearing = marker.getLatLng().bearingTo(markerOnRadius.getLatLng()); 

    var markerOnRadiusX = parseFloat(response.lat) + ((0.000009 * parseFloat(response.radius)) * Math.cos(toRad(bearing))); 
    var markerOnRadiusY = parseFloat(response.long) + ((0.000009 * parseFloat(response.radius)) * Math.sin(toRad(bearing))); 

    markerOnRadius.setLatLng([markerOnRadiusX, markerOnRadiusY]); 
}); 

bearingTo विधि:

L.LatLng.prototype.bearingTo = function(other) { 
    var d2r = L.LatLng.DEG_TO_RAD; 
    var r2d = L.LatLng.RAD_TO_DEG; 
    var lat1 = this.lat * d2r; 
    var lat2 = other.lat * d2r; 
    var dLon = (other.lng-this.lng) * d2r; 
    var y = Math.sin(dLon) * Math.cos(lat2); 
    var x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon); 
    var brng = Math.atan2(y, x); 
    brng = parseInt(brng * r2d); 
    brng = (brng + 360) % 360; 
    return brng; 
}; 

अंक

जब मैं मार्कर खींचना शुरू करता हूं, तो यह कोड ठीक काम कर रहा है और इसे उस असर पर परिधि में लाता है जिस पर मार्कर को खींचा जाता है। लेकिन एक समस्या है, परिधि पर तार थोड़ा दूर हैं और देशांतर के मामले में हैं। जब असर 0 (उत्तर) होता है, तो कॉर्ड सही होते हैं, लेकिन जब यह 90 (पूर्व) होता है, तो रेखांश थोड़ा कम होता है कि मार्कर को परिधि पर होना चाहिए।

फिर 180 (दक्षिण) पर, कॉर्ड सही हैं, लेकिन 270 (पश्चिम) पर, रेखांश की गणना थोड़ा कम है और मार्कर फिर से त्रिज्या की ओर जाता है।

तो मूल रूप से यदि आप मार्कर को खींचते हुए देखते हैं, तो यह पूरी तरह से उत्तर छोर पर शुरू होता है और सर्कल के अंदर आने से शुरू होता है जब तक कि यह 9 0 तक पहुंचने तक असर के साथ थोड़ा बढ़ता है और फिर 180 तक फिर से परिधि की तरफ बढ़ने लगता है फिर।

यदि आपको इसकी जानकारी मिलती है तो यह एक अंडाकार की तरह बनता है।

1

2

3

4

5

किसी को भी मुझे बता सकते हैं क्यों देशांतर एक छोटे से बंद आ रहा है और यही कारण है कि एक अण्डाकार पथ में मार्कर चाल है। क्या यह विश्व निर्देशांक और खिड़की निर्देशांक के साथ कुछ करने के लिए है। या मेरे समीकरण कहीं से थोड़ा दूर हैं?

+0

क्या आप प्रक्षेपण के साथ ऐसा कुछ करना चाहते हैं? क्या आधार मानचित्र के लिए कुछ अलग में सर्कल लगाया जा रहा है ...? – user965586

+0

यह प्रक्षेपण के मुद्दे हो सकता है लेकिन मैप्स के साथ शुरुआती होने के नाते मैं इस समस्या को हल करने के बारे में नहीं समझ सकता। कोई उपाय? – Rohan

+0

ठीक है। शायद थोड़ा सा समझने के लिए http://leafletjs.com/reference.html#iprojection यहां पढ़ा है। मैं केवल मोबाइल पर हूं इसलिए एक व्यापक उत्तर थोड़ा मुश्किल है। मैं यह जांचने के लिए कहूंगा कि आपका बेस मैप और सर्कल किस प्रक्षेपण में है, नए मार्कर में क्या प्रक्षेपण है। उन्हें सभी एक ही (डब्लूजीएस 84, वेब मर्केटर इत्यादि) – user965586

उत्तर

0

यह प्रक्षेपण समस्या की तरह दिखता है। आपके ड्रैगिंग कोड में आप मूल रूप से

lat = a + r cos(baring) 
long = b + r sin(baring) 

लैट-लॉन्ग निर्देशांक में एक मंडल दे रहे हैं। यदि आप मर्केटर प्रक्षेपण के साथ भूमध्य रेखा पर थे तो यह ठीक काम करेगा।जब आप चुनावों की ओर आगे बढ़ते हैं तो आपको अधिक विकृति मिल जाएगी।

मान लीजिए कि आप reference doc के लिए डिफ़ॉल्ट का उपयोग कर रहे हैं आपके पास EPSG3857 Web Mercator निर्देशांक हैं।

यदि आप यह सुनिश्चित करना चाहते हैं कि आपके पास सटीक सर्कल है तो स्क्रीन निर्देशांक का उपयोग करके काम करना बेहतर होगा। आप ICRS ऑब्जेक्ट्स पर विधियों का उपयोग करके इन्हें प्राप्त कर सकते हैं। सबसे पहले समन्वय प्रणाली L.CRS.EPSG3857 प्राप्त करें और latLngToPoint और pointToLatLng विधियों का उपयोग करें।

var crs = L.CRS.EPSG3857; 
var zoom = ...; // how you calculate your zoom factor 

markerOnRadius.on('drag', function(e){ 

    var markerLL = marker.getLatLng() 
    var morLL = markerOnRadius.getLatLng(); 
    var markerP = crs.latLngToPoint(markerLL,zoom); 
    var morP  = crs.latLngToPoint(morLL,zoom); 
    // get the distance between the two points 
    var dist = markerP.distanceTo(morP); 
    // Get the vector from center to point 
    var A = morP.subtract(markerP); 
    // scale so its of the desired length 
    var B = A. multiplyBy(factor/dist); 
    // Add on the center 
    var C = markerP.add(B); 
    // Convert back to LatLong 
    var D = crs.pointToLatLng(C,zoom); 
    markerOnRadius.setLatLong(D); 
}); 
+0

इनमें से कुछ मुझे समझ में आता है लेकिन मैं अभी भी उलझन में हूं। मैं ज़ूम और कारक की गणना कैसे करूं? – Rohan

+0

कारक केवल पिक्सेल में सर्कल का त्रिज्या होगा। मुझे लगता है कि आप 'map.getZoom()' से ज़ूम प्राप्त कर सकते हैं। –

+0

मैंने कोशिश की लेकिन मुझे डर है कि मैं इसे काम नहीं कर सकता। मैंने ज़ूम के लिए 'map.getZoom()' का उपयोग किया और मैंने 'त्रिज्या/6378800' द्वारा 'कारक/dist' को बदल दिया जहां 6378800 पृथ्वी का त्रिज्या है। क्या मैं यह ठीक कर रहा हूँ? – Rohan

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