Определить, находятся ли координаты внутри ограничительной рамки - PullRequest
1 голос
/ 17 октября 2019

Мне нужно создать функцию, которая с учетом a, b и c возвращает логическое значение, указывающее, находится ли c в пределах a и b.

Все переменные имеютследующий тип:

type Coordinate = {
  lat: number;
  lon: number;
};

Я нашел решение, которое изначально было правильным, но после тестирования с помощью Google Maps я обнаружил, что это неправильно.

Функция:

function inBoundingBox(
  bottomLeft: Coordinate,
  topRight: Coordinate,
  point: Coordinate
) {
  let isLongInRange: boolean;
  if (topRight.lon < bottomLeft.lon) {
    isLongInRange = point.lon >= bottomLeft.lon || point.lon <= topRight.lon;
  } else {
    isLongInRange = point.lon >= bottomLeft.lon && point.lon <= topRight.lon;
  }
  return (
    point.lat >= bottomLeft.lat && point.lat <= topRight.lat && isLongInRange
  );
}

Один пример, который должен работать:

const topRight: Coordinate = {
  lat: -23.5273,
  lon: -46.833881
};

const bottomLeft: Coordinate = {
  lat: -23.537519,
  lon: -46.840019
};

const point = {
  lat: -23.52785,
  lon: -46.840545
};

const result = inBoundingBox(bottomLeft, topRight, point);
console.log(result) // false, where should be true.

И визуальное представление здесь .

Мне нужна помощь, чтобы узнать, гдеточно код неправильный, и как это исправить.

Я также пытался использовать Leaflet, чтобы увидеть, работает ли он, но результат тот же:

function leafletContains(bottomLeft, topRight, pos) {
  var bounds = new L.LatLngBounds(
    new L.LatLng(bottomLeft.lat, bottomLeft.lon),
    new L.LatLng(topRight.lat, topRight.lon)
  );
  return bounds.contains(new L.LatLng(pos.lat, pos.lon));
}

leafLetContains({ lat: -23.537519, lon: -46.840019 }, { lat: -23.5273, lon: -46.833881 }, { lat: -23.527811, lon: -46.840201 }) // false, where should be true.

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Тест ограничивающего прямоугольника должен проверять четыре стороны прямоугольника.

Рамка на поверхности сферы не является прямоугольником, поэтому трудно работать с координатами x, y. Но с «полярными» координатами (широта, долгота) это очень просто:

Я не кодировщик javascript, поэтому прости мои ошибки в этом коде:

function inBoundingBox(
  bottomLeft: Coordinate,
  topRight: Coordinate,
  point: Coordinate
) {
  let isLongInRange: boolean;
  let isLatiInRange: boolean;
  isLongInRange = point.lon >= bottomLeft.lon && point.lon <= topRight.lon;
  isLatiInRange = point.lat >= bottomLeft.lat && point.lat <= topRight.lat;
  return ( isLongInRange && isLatiInRange );
}

при условии bottomLeft.lon < topRight.lon и bottomLeft.lat < topRight.lat

1 голос
/ 17 октября 2019

эта строка неверна

else {
  isLongInRange = point.lon >= bottomLeft.lon && point.lon <= topRight.lon;
}

Должно быть || вместо && и одно из следующего: переключаться между >= и <= или переключаться на bottomLeft.lonи topRight.lon

else {
  isLongInRange = point.lon <= bottomLeft.lon || point.lon >= topRight.lon;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...