Место падает сюда?

У меня есть широта и долгота JSON, которая имеет вид {(45,76,56,67)(56,78,98,67)....} и у меня есть другая отдельная широта, долгота. Я хочу выяснить, попадают ли отдельные места в форму? Любая помощь?

Почему "Кто-нибудь может мне помочь?" не актуальный вопрос? У вас есть конкретный вопрос по программированию?
jabaa 03.10.2022 02:56

Это мой вариант использования! Было бы полезно, если бы я нашел какое-либо решение на любом языке программирования!

Rishi Sundar 03.10.2022 02:59

Stack Overflow — это платформа вопросов и ответов для конкретных вопросов по программированию, см. тур. У вас есть конкретный вопрос по программированию?

jabaa 03.10.2022 03:00
JSON which forms a shape like - это недопустимый JSON
Jaromanda X 03.10.2022 03:11

то, что вы ищете, - это проблема Point in Polygon - два возможных метода определения этого - это алгоритм Ray Casting и алгоритм Winding Number - я успешно написал последний в javascript примерно в 20 строках кода

Jaromanda X 03.10.2022 03:13

предлагаем вам выполнить поиск по запросу «реализация javascript алгоритма числа намотки»

Jaromanda X 03.10.2022 03:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
6
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Учитывая, что данные полигона (формы) имеют формат

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;
};

Другие вопросы по теме