У меня есть широта и долгота JSON, которая имеет вид {(45,76,56,67)(56,78,98,67)....} и у меня есть другая отдельная широта, долгота. Я хочу выяснить, попадают ли отдельные места в форму? Любая помощь?
Это мой вариант использования! Было бы полезно, если бы я нашел какое-либо решение на любом языке программирования!
Stack Overflow — это платформа вопросов и ответов для конкретных вопросов по программированию, см. тур. У вас есть конкретный вопрос по программированию?
JSON which forms a shape like - это недопустимый JSON
то, что вы ищете, - это проблема Point in Polygon - два возможных метода определения этого - это алгоритм Ray Casting и алгоритм Winding Number - я успешно написал последний в javascript примерно в 20 строках кода
предлагаем вам выполнить поиск по запросу «реализация javascript алгоритма числа намотки»



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Учитывая, что данные полигона (формы) имеют формат
shape = [
{x: 1, y: 2},
{x: 3, y: 4},
...
]
а точка - это объект типа
target = {x: 5, y: 6}
Затем следующий код должен определить, находится ли точка внутри многоугольника (формы)
const pointInPolygon = (point, polygon) => {
const cross = (x, y) =>
(y.x - x.x) * (point.y - x.y) - (point.x - x.x) * (y.y - x.y);
let windingNumber = 0;
polygon.forEach((a, i) => {
const b = polygon[(i + 1) % polygon.length];
if (a.y <= point.y) {
if (b.y > point.y && cross(a, b) > 0) {
windingNumber += 1;
}
} else if (b.y <= point.y && cross(a, b) < 0) {
windingNumber -= 1;
}
});
pointInPolygon(target, shape);
return windingNumber !== 0;
};
Однако если многоугольник имеет формат
shape = [
[1, 2],
[3, 4],
...
]
А суть просто
target = [5, 6]
Затем вам нужно либо переписать функцию для использования массивов, либо преобразовать данные в ожидаемый формат, например
const arrayToPoint = ([x, y]) => ({x, y});
const polygonArrayToPoints = polygon => polygon.map(arrayToPoint);
pointInPolygon(arrayToPoint(target), polygonArrayToPoints(shape));
Тем не менее, я считаю, что данный порядок широты/долготы означает, что arrayToPoint на самом деле должен быть
const arrayToPoint = ([y, x]) => ({x, y});
Бонус:
Если данные действительно
shape = [
[lat, long],
[lat, long],
...
]
target = [lat, long]
Тогда функция pointInPolygon
const pointInPolygon = (point, polygon) => {
const cross = (x, y) =>
(y[1] - x[1]) * (point[0] - x[0]) - (point[1] - x[1]) * (y[0] - x[0]);
let windingNumber = 0;
polygon.forEach((a, i) => {
const b = polygon[(i + 1) % polygon.length];
if (a[0] <= point[0]) {
if (b[0] > point[0] && cross(a, b) > 0) {
windingNumber += 1;
}
} else if (b[0] <= point[0] && cross(a, b) < 0) {
windingNumber -= 1;
}
});
return windingNumber !== 0;
};