9

में मेरे पास पुस्तिका भूगर्भित मानचित्र से चयनित बहुभुज निर्देशांक के दो सेट हैं। माता पिता और बच्चे के निर्देशांक निर्देशांक हैं कर रहे हैं:जांचें कि क्या बहुभुज बिंदु किसी अन्य के अंदर है,

var parentCoordinates=[ 
    [ 
     32.05898221582174, 
     -28.31004731142091 
    ], 
    [ 
     32.05898221582174, 
     -28.308044824292978 
    ], 
    [ 
     32.06134255975485, 
     -28.308044824292978 
    ], 
    [ 
     32.06134255975485, 
     -28.31004731142091 
    ], 
    [ 
     32.05898221582174, 
     -28.31004731142091 
    ] 
] 
var childCoordinates=[ 
    [ 
    32.059904895722866, 
    -28.30970726909422 
    ], 
    [ 
    32.059904895722866, 
    -28.308743809931784 
    ], 
    [ 
    32.06089194864035, 
    -28.308743809931784 
    ], 
    [ 
    32.06089194864035, 
    -28.30970726909422 
    ], 
    [ 
    32.059904895722866, 
    -28.30970726909422 
    ] 
] 

जैसा कि चित्र में दिखाया गया है बच्चे को माता-पिता क्षेत्र के अंदर तैयार की है: enter image description here

निर्धारित करने के लिए करता है, तो बिंदु बहुभुज मैं हूँ अंदर निहित है Ray Casting algorithm का उपयोग करना मुझे जो परिणाम मिल रहा है, वह निर्धारित करने में सक्षम नहीं है। कृपया मुझे बताएं कि मैं कहां गलत कर रहा हूं या समाधान का निर्धारण करने के किसी अन्य तरीके से धन्यवाद। धन्यवाद

+0

नोट: बहुभुज के अंदर पॉलीलाइन के लिए अपनी कार्यशील ठीक .not बहुभुज (के रूप में छवि में दिखाया गया) के अंदर बहुभुज के लिए काम – forgottofly

उत्तर

4

मैंने आपके एल्गोरिदम के साथ प्रयास किया और दूसरा यहां https://rosettacode.org/wiki/Ray-casting_algorithm पाया और दोनों सही मूल्य लौटाते हैं।

हो सकता है कि इस बेला कार्यान्वयन में मदद कर सकते हैं:

https://jsfiddle.net/4psL2hoo/1/

आपका algo

// Data 
var parentCoordinates=[ 
    [ 
     32.05898221582174, 
     -28.31004731142091 
    ], 
    [ 
     32.05898221582174, 
     -28.308044824292978 
    ], 
    [ 
     32.06134255975485, 
     -28.308044824292978 
    ], 
    [ 
     32.06134255975485, 
     -28.31004731142091 
    ], 
    [ 
     32.05898221582174, 
     -28.31004731142091 
    ] 
] 
var childCoordinates=[ 
    [ 
    32.059904895722866, 
    -28.30970726909422 
    ], 
    [ 
    32.059904895722866, 
    -28.308743809931784 
    ], 
    [ 
    32.06089194864035, 
    -28.308743809931784 
    ], 
    [ 
    32.06089194864035, 
    -28.30970726909422 
    ], 
    [ 
    32.059904895722866, 
    -28.30970726909422 
    ] 
] 

// Other algo 
function test(point, vs) { 
    // ray-casting algorithm based on 
    // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html 

    var x = point[0], y = point[1]; 

    var inside = false; 
    for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) { 
     var xi = vs[i][0], yi = vs[i][1]; 
     var xj = vs[j][0], yj = vs[j][1]; 

     var intersect = ((yi > y) != (yj > y)) 
      && (x < (xj - xi) * (y - yi)/(yj - yi) + xi); 
     if (intersect) inside = !inside; 
    } 

    return inside; 
}; 

for (var i = 0; i < childCoordinates.length; i++) { 
    var testPoint = childCoordinates[i]; 
    console.log(JSON.stringify(testPoint) + '\tin parentCoordinate\t' + test(testPoint, parentCoordinates)); 
} 

Rosetta कोड algo

//https://rosettacode.org/wiki/Ray-casting_algorithm 
function contains(bounds, lat, lng) { 
    //https://rosettacode.org/wiki/Ray-casting_algorithm 
    var count = 0; 
    for (var b = 0; b < bounds.length; b++) { 
     var vertex1 = bounds[b]; 
     var vertex2 = bounds[(b + 1) % bounds.length]; 
     if (west(vertex1, vertex2, lng, lat)) 
      ++count; 
    } 
    return count % 2; 

    /** 
    * @return {boolean} true if (x,y) is west of the line segment connecting A and B 
    */ 
    function west(A, B, x, y) { 
     if (A.y <= B.y) { 
      if (y <= A.y || y > B.y || 
       x >= A.x && x >= B.x) { 
       return false; 
      } else if (x < A.x && x < B.x) { 
       return true; 
      } else { 
       return (y - A.y)/(x - A.x) > (B.y - A.y)/(B.x - A.x); 
      } 
     } else { 
      return west(B, A, x, y); 
     } 
    } 
} 

var square = {name: 'square', bounds: [{x: 32.05898221582174, y: -28.31004731142091}, {x: 32.05898221582174, y: -28.308044824292978}, {x: 32.06134255975485, y: -28.308044824292978}, {x: 32.06134255975485, y: -28.31004731142091}]}; 

var shapes = [square]; 
var testPoints = [{lng: 32.059904895722866, lat: -28.30970726909422}, {lng: 32.059904895722866, lat: -28.308743809931784}, {lng: 32.06089194864035, lat: -28.308743809931784}, 
    {lng: 32.06089194864035, lat: -28.30970726909422}]; 

for (var s = 0; s < shapes.length; s++) { 
    var shape = shapes[s]; 
    for (var tp = 0; tp < testPoints.length; tp++) { 
     var testPoint = testPoints[tp]; 
     console.log(JSON.stringify(testPoint) + '\tin ' + shape.name + '\t' + contains(shape.bounds, testPoint.lat, testPoint.lng)); 
    } 
} 
4

मुझे Turf के साथ अच्छा अनुभव मिला है। यह अच्छी तरह से काम करता है, अच्छी तरह से प्रलेखित है और उदाहरण पहले से ही पर्चे के साथ दिखाए गए हैं।

आपकी समस्या के लिए, आप turf.point की एक सरणी के रूप में parentCoordinatesturf.polygon के रूप में और childCoordinates साथ turf.within इस्तेमाल कर सकते हैं:

var parentPolygon = turf.polygon([parentCoordinates]); 

var inside = true; 
childCoordinates.forEach(function(coordinates) { 
    point = turf.point(coordinates); 
    if (!turf.inside(point, parentPolygon)){ 
     alert("Oh no! "+ coordinates + " isn't in polygon"); 
     inside = false; 
    } 
}); 

alert("Child polygon inside parent polygon ? " + inside); 

Here एक फिडल उदाहरण।

1

आप उस के लिए पत्रक के एपीआई कोशिश कर सकते हैं - contains। आप LatLngBounds और फिर बच्चे के साथ एक मूल बहुभुज बनाते हैं।

parentPolygon.contains(childPolygon) 
+0

LatLngBounds एक आयत बनाता है; पोस्टर को सामान्य बहुभुज की आवश्यकता होती है। Downvoted। –

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