Determine if Lat/Lng in Bounds

时光总嘲笑我的痴心妄想 提交于 2020-04-08 05:00:15

问题


I'm interested in determining if a lat/lng location is within the bounds and looking for recommendations on a algorithm. (javascript or php)

Here is what I have so far:

var lat = somelat;
var lng = somelng;

if (bounds.southWest.lat < lat && lat < bounds.northEast.lat && bounds.southWest.lng < lng && lng < bounds.northEast.lng) {
     'lat and lng in bounds
}

will this work? thanks


回答1:


The simple comparison in your post will work for coordinates in the US. However, if you want a solution that's safe for checking across the International Date Line (where longitude is ±180°):

function inBounds(point, bounds) {
    var eastBound = point.long < bounds.NE.long;
    var westBound = point.long > bounds.SW.long;
    var inLong;

    if (bounds.NE.long < bounds.SW.long) {
        inLong = eastBound || westBound;
    } else {
        inLong = eastBound && westBound;
    }

    var inLat = point.lat > bounds.SW.lat && point.lat < bounds.NE.lat;
    return inLat && inLong;
}



回答2:


As you asked about both Javascript and PHP (and I needed it in PHP), I converted CheeseWarlock's great answer into PHP. Which, as usual with PHP, is a lot less elegant. :)

function inBounds($pointLat, $pointLong, $boundsNElat, $boundsNElong, $boundsSWlat, $boundsSWlong) {
    $eastBound = $pointLong < $boundsNElong;
    $westBound = $pointLong > $boundsSWlong;

    if ($boundsNElong < $boundsSWlong) {
        $inLong = $eastBound || $westBound;
    } else {
        $inLong = $eastBound && $westBound;
    }

    $inLat = $pointLat > $boundsSWlat && $pointLat < $boundsNElat;
    return $inLat && $inLong;
}



回答3:


here is mine code i modified it for mysql its mysql function now we can directly check that our long lat is in bounds or not from sql query .

and special thanks to CheeseWarlock and Chris Rae for the solution thanks sir

select inBounds("58.25173","-100.21041","89.71691425364952","180","-88.9294031317244","-180")

and you can call this function in query like this way

DELIMITER $$
CREATE FUNCTION inBounds(pointLat FLOAT, pointLong FLOAT, boundsNElat FLOAT, boundsNElong FLOAT, boundsSWlat FLOAT, boundsSWlong FLOAT) RETURNS VARCHAR(30)
 BEGIN
  DECLARE westBound FLOAT ;
  DECLARE eastBound FLOAT ;
  DECLARE inLong FLOAT DEFAULT 0 ;
  DECLARE inLat FLOAT DEFAULT 0 ;
  IF (pointLong < boundsNElong) THEN 
    SET eastBound = 1;
  End if;
  IF (pointLong > boundsSWlong) THEN
    SET westBound = 1;
  End if;

  IF (boundsNElong < boundsSWlong) THEN
      IF (eastBound || westBound) THEN
         SET inLong = 1;
     END if;
  ELSE 
     IF (eastBound && westBound) THEN 
         SET inLong = 1;
     END IF;
  END IF;
  IF (pointLat > boundsSWlat && pointLat < boundsNElat) THEN
    SET inLat = 1;
  END IF;
  RETURN inLat && inLong;
END$$
DELIMITER ;


来源:https://stackoverflow.com/questions/10939408/determine-if-lat-lng-in-bounds

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!