Reputation: 466
I need to verify if a coordinate LAT/LNG point is between other two points (a segment line like a road). I followed THIS topic with no success.
function inRange(start, point, end) {
start_x = start.lat();
start_y = start.lng();
end_x = end.lat();
end_y = end.lng();
point_x = point.lat();
point_y = point.lng();
var dx = end_x - start_x;
var dy = end_y - start_y;
var innerProduct = (point_x - start_x)*dx + (point_y - start_y)*dy;
return 0 <= innerProduct && innerProduct <= dx*dx + dy*dy;
}
function checkRange(start, point, end){
var x1 = start.lat();
var y1 = start.lng();
var x2 = end.lat();
var y2 = end.lng();
var x = point.lat();
var y = point.lng();
if (x1 == x2) { // special case
return y1 < y2 ? (y1 <= y && y <= y2) : (y2 <= y && y <= y1);
}
var m = (y2 - y1) / (x2 - x1);
var r1 = x1 + m * y1;
var r2 = x2 + m * y2;
var r = x + m * y;
return r1 < r2 ? (r1 <= r && r <= r2) : (r2 <= r && r <= r1);
}
Start: (44.4963217, 11.327993300000003)
End: (44.4973624, 11.32760170000006)
Point (44.4958434, 11.328122000000008)
InRange == false (OK) So Point becomes new start Point
Start: (44.4958434, 11.328122000000008)
End: (44.4973624, 11.32760170000006)
Point: (44.4966928, 11.32781620000003)
InRange == false (ERROR) Point2 is between start/end but the function returns false :(
Upvotes: 2
Views: 1671
Reputation: 11656
Your method is responding as it should given the data you've passed it:
var start_lng = 11.328122000000008;
var end_lng = 11.32760170000006; // This longitude is less than the point longitude.
var point_lng = 11.32781620000003; // This longitude more than the end longitude.
Upvotes: 1