2014-09-24 8 views
12

मेरी आवश्यकता के अनुसार, मैं नीचे छवि में दिखाया गूगल मानचित्र पर बहुभुज बनाते हुए कर रहा हूँ। (नक्शे वी 2 का प्रयोग करके) enter image description hereपहचानें बिंदु बहुभुज में है अगर

अब मैं एक चेतावनी दिखाने की जरूरत है जब उपयोगकर्ता में प्रवेश करती है कि विशेष रूप से बहुभुज।

पॉलीगॉन में मेरा वर्तमान स्थान कैसा है या नहीं, इसकी पहचान कैसे करें। (बैटरी निकालने के बिना अनुकूलित तरीके की आवश्यकता है)

अग्रिम धन्यवाद।

+0

क्या आपने यहां भूगर्भ का उपयोग किया था? – Ranjit

+0

नहीं। मैंने पॉलीगॉन ऑप्शन का उपयोग करके उस बहुभुज को खींचा। यह पता लगाने के लिए सबसे अच्छा तरीका खोजना कि वर्तमान पॉलीगॉन में वर्तमान स्थान है या नहीं। – Supriya

+0

आप इसके लिए जियोफ़ेंस का उपयोग कर सकते हैं। http://developer.android.com/training/location/geofencing.html – Ranjit

उत्तर

17

बस रे कास्टिंग एल्गोरिथ्म जो बहुभुज में बात की पहचान करता है की कोशिश की। यह सही काम करता है।

मैं रे कास्टिंग विधि अविश्वसनीय पाया रे-कास्टिंग

private boolean isPointInPolygon(LatLng tap, ArrayList<LatLng> vertices) { 
     int intersectCount = 0; 
     for (int j = 0; j < vertices.size() - 1; j++) { 
      if (rayCastIntersect(tap, vertices.get(j), vertices.get(j + 1))) { 
       intersectCount++; 
      } 
     } 

     return ((intersectCount % 2) == 1); // odd = inside, even = outside; 
    } 

    private boolean rayCastIntersect(LatLng tap, LatLng vertA, LatLng vertB) { 

     double aY = vertA.latitude; 
     double bY = vertB.latitude; 
     double aX = vertA.longitude; 
     double bX = vertB.longitude; 
     double pY = tap.latitude; 
     double pX = tap.longitude; 

     if ((aY > pY && bY > pY) || (aY < pY && bY < pY) 
       || (aX < pX && bX < pX)) { 
      return false; // a and b can't both be above or below pt.y, and a or 
          // b must be east of pt.x 
     } 

     double m = (aY - bY)/(aX - bX); // Rise over run 
     double bee = (-aX) * m + aY; // y = mx + b 
     double x = (pY - bee)/m; // algebra is neat! 

     return x > pX; 
    } 
+0

यह मेरे लिए बहुत उपयोगी है, धन्यवाद !!! @supriya – Manish

+0

आपका एल्गोरिदम हमेशा झूठी वापसी करता है, क्यों? – ofskyMohsen

2

इस लिंक

देखें Polygon Touch detection Google Map API V2

इसके RayCasting एल्गोरिथ्म, तो यह आपको :) मदद मिल सकती है

एल्गोरिथ्म के बारे में एक संक्षिप्त विवरण:

एक क्षैतिज रेखा अपनी बात से करने के लिए तैयार की है दाएं, अगर यह बहुभुज के पक्षों को विषम संख्या में अंतर करता है तो बिंदु पॉलीगोन के अंदर और बाहर है :)

,210

ये विकी लिंक आप पूरा विचार दे देंगे:

http://en.wikipedia.org/wiki/Point_in_polygon

http://rosettacode.org/wiki/Ray-casting_algorithm

+0

आज़माएं। धन्यवाद :) – Supriya

+0

मेरे कुछ परीक्षणों के लिए काम किया। इसकी थीसिस की जांच। :) धन्यवाद – Supriya

9

की थीसिस के लिए http://en.wikipedia.org/wiki/Point_in_polygon संदर्भ लें, लेकिन मैं गूगल मैप्स से PolyUtil का उपयोग कर समाप्त हो गया।

आप निर्भरता की जरूरत compile 'com.google.maps.android:android-maps-utils:0.5'

और फिर विधि इस

PolyUtil.containsLocation(userLocation, polyPointsList, false); 

संपादित

तरह लग रहा है इस स्रोत कोड में पाया इस विधि का वर्णन है

गणना करता है चाहे दिया गया बिंदु निर्दिष्ट बहुभुज के अंदर है। बहुभुज हमेशा बंद माना जाता है, इस पर ध्यान दिए बिना कि अंतिम बिंदु पहले के बराबर है या नहीं। अंदरूनी दक्षिण ध्रुव को शामिल नहीं किया गया है - दक्षिण ध्रुव हमेशा बाहर रहता है। बहुभुज वास्तविक सर्कल खंडों का गठन होता है यदि भूगर्भीय सत्य है, और अन्यथा अंगूठे (लोक्सोड्रोमिक) सेगमेंट हैं।

+0

अंतिम पैरामीटर क्यों झूठा? वह पैरामीटर क्या है? – Virat18

+0

मैंने विधि का विवरण जोड़ा है, जैसा कि मैंने इसे अपने स्रोत कोड – DoruChidean

+0

में पाया है धन्यवाद! बहुत बढ़िया जवाब! – Virat18

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