OpenLayers 3 में ज्यामिति का केंद्र प्राप्त करें


12

GeometryOpenLayers में किसी वस्तु को देखते हुए 3. कोई इसका केंद्र कैसे प्राप्त करेगा?

OpenLayers के पुराने संस्करणों ने एक getCentroidविधि प्रदान की । getBoundsवर्कअराउंड भी था । लेकिन ये OpenLayers 3 में हटाए गए प्रतीत होते हैं।

जवाबों:


16

वर्कअराउंड के बिट लेकिन आप getExtentनक्शे पर सीमा निर्धारित करने के लिए ज्यामिति पर विधि का उपयोग कर सकते हैं । मैं मान लेता हूं कि दृश्य का केंद्र फिर ज्यामिति का केंद्र होगा;

Test = new ol.geom.Geometry();
map.getView().fitExtent(Test.getExtent, map.getSize());
var CenterOfGeom = map.getView().getCenter()

यदि आप दृश्य को बदलना नहीं चाहते हैं (जो मैं कल्पना कर सकता हूं), तो आप हद के केंद्र की गणना करने के लिए एक फ़ंक्शन के बारे में सोच सकते हैं। यह कुछ प्रकार के समन्वय प्रणालियों (EPSG: 3857, जो मीटर आधारित है) में आसान होगा, लेकिन दूसरों में अधिक कठिन है (EPSG: 4326, लून / लाट कोर्ड्स पर आधारित)। एक फ़ंक्शन जो इस केंद्र की गणना कर सकता है (ईपीएसजी: 3857 में) निम्नानुसार होगा;

function getCenterOfExtent(Extent){
var X = Extent[0] + (Extent[2]-Extent[0])/2;
var Y = Extent[1] + (Extent[3]-Extent[1])/2;
return [X, Y];
}

उम्मीद है की यह मदद करेगा!


1
मुझे लगता है कि यह होना चाहिए var x = extent[0] + (extent[2] - extent[0]) / 2; var y = extent[1] + (extent[3] - extent[1]) / 2;
Gerrit Fölster

हाँ, आप सही हैं, वहाँ छोटी सी गलती, मेरे awnser को बदल दिया
टिम। लुकास

3
कुछ तुच्छ बस OL3 के साथ भेज दिया जाना चाहिए। अज्ञेय के लिए +1getCenterOfExtent
जोएल

4
@ योएल हे, अब यह है। OL संस्करण 3.9.0 है ol.extent.getCenterऔर इसका स्थिर है। उदाहरण के लिए, मैंने किया var aa = e.selected[0].getGeometry().getExtent(); var oo = ol.extent.getCenter(aa);और मुझे बिंदुओं, रेखाओं और बहुभुजों का केंद्र दिया। इसे यहाँ देखें
स्लीपविन

यह वास्तव में काफी अच्छा है :)
जोएल

15

आप इसका सीमा केंद्र का उपयोग कर प्राप्त कर सकते हैं ol.extent.getCenter। मेरे मामले में मेरे पास एक वेक्टर परत है और मैं इसे क्लिक करने के बाद एक सुविधा का केंद्र प्राप्त करना चाहता हूं।

इसलिए

एक साधारण क्लिक इंटरैक्शन बनाएं और इसे मानचित्र में जोड़ें

 var select = new ol.interaction.Select();
 map.addInteraction(select);

प्रत्येक क्लिक के लिए ...

select.on('select', function(e) {

"चयनित" सरणी से, पहली विशेषता प्राप्त करें। फिर इसकी ज्यामिति प्राप्त करें, और फिर इसकी सीमा।

उस केंद्र का उपयोग करने के लिए उस सीमा का उपयोग करें ol.extent.getCenter

    var aa = e.selected[0].getGeometry().getExtent();
    var oo = ol.extent.getCenter(aa);
    console.log("The center is :  "+oo); // voila!!!!

 });

उसी कोड ने लाइनों, बिंदुओं और बहुभुजों के लिए काम किया।

पुनश्च। ol.extent.getCenterस्थिर है, राजभाषा संस्करण 3.9.0 और संस्करण 3.10.1 में प्रयोग किया जाता है और आप इसे प्राप्त कर सकते हैं कर सकते हैं यहां


1
लाइनों के लिए, यह आपको लाइन ज्यामिति द्वारा व्याप्त सीमा का केंद्र मिलेगा। एक बिंदु पाने के लिए जो वास्तव में लाइन पर है, आप e.selected [0] .getGeometry () का उपयोग कर सकते हैं। getClosestPoint (oo)
jOshT

1

आप इसके साथ केंद्र भी प्राप्त कर सकते हैं:

var center = e.feature.getGeometry().getCenter();

OpenLayers 3 के किस संस्करण में यह काम करता है? 3.15.1 में, मुझे ए Uncaught TypeError: feature.getGeometry(...).getCenter is not a function
डिर्क

getCenter()विधि केवल सर्कल geometries के लिए लागू है ol.geom.Circle। क्या यह संभव है कि आपके पास एक अलग प्रकार की ज्यामिति है?
Bwyss

हां, मैंने इसे एक LineString के साथ आज़माया, यह जानकर अच्छा लगा कि यह केवल मंडलियों के साथ काम करता है। लाइनस्ट्रीम के लिए, हालांकि, कोई @ स्लीविन के उत्तर में कोड का उपयोग कर सकता है जो बिंदु "लाइन के बीच में" वापस आ जाएगा।
डर्क

1

OpenLayers v 6.1.1

var center = e.feature.getGeometry().getExtent().getCenter()


यह सीमा का केंद्र है, ज्यामिति का केंद्र नहीं है जैसा कि प्रश्न में अनुरोध किया गया है।
TomazicM

मुझे नहीं लगता कि यह आपको ज्यामिति का केंद्रक मिल जाएगा, यह आपको लाइन / बहुभुज ज्यामिति द्वारा व्याप्त सीमा का केंद्र मिलेगा।
कादिर Kadबज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.