Как найти местоположения (индексы, латинские координаты которых хранятся в формате geo-json) в радиусе 5 км от индекса h3 в h3-js?
Я создаю приложение гипер локальной доставки. Я могу получить заказ, только если есть магазин в радиусе 5 км от пользователя. Я сохранил расположение магазинов в формате геойсон. Есть ли в h3-js функция, которая будет принимать радиус, массив магазинов, индекс h3 и затем возвращать список магазинов, которые находятся в пределах 5 км от заданного индекса h3. или как я могу реализовать это с помощью h3-js?
1 ответ
Здесь есть несколько разных частей:
Выберите разрешение: выберите разрешение H3 для поиска. Более тонкий res означает больше точности, но больше использования памяти. Res 8 - это примерно несколько городских кварталов.
Индексирование данных: чтобы использовать H3 для поиска радиуса, необходимо проиндексировать магазины по индексу H3. Если вы хотите, чтобы это было эффективно, вам лучше индексировать все магазины заранее. Как вы это делаете, зависит от вас; Одним из простых способов в JS может быть создание карты массивов идентификаторов:
const lookupIndexes = stores.features.reduce((map, feature) => {
const [lon, lat] = feature.geometry.coordinates;
const h3Index = h3.geoToH3(lat, lon, res);
if (!map[h3Index]) map[h3Index] = [];
map[h3Index].push(feature.id);
return map;
}, {})
Выполните поиск: чтобы выполнить поиск, индексируйте свое местоположение поиска и получите все индексы H3 в пределах некоторого радиуса. Вы можете использовать h3.edgeLength
функция, чтобы получить приблизительный радиус ячейки при вашем текущем разрешении.
const origin = h3.geoToH3(searchLocation.lat, searchLocation.lon, res);
const radius = kmToRadius(searchRadiusKm, res);
// Find all the H3 indexes to search
const lookupIndexes = h3.kRing(origin, radius);
// Find all points of interest in those indexes
const results = lookupIndexes.reduce(
(output, h3Index) => [...output, ...(lookupMap[h3Index] || [])],
[]);
Смотрите рабочий пример на Observable
Предостережения: это не настоящий поиск радиуса. K-кольцо представляет собой примерно шестиугольную форму с центром в начале координат. Это достаточно для многих случаев использования и намного быстрее, чем традиционный поиск по радиусу Хаверсайна, особенно если у вас есть много строк для поиска. Но если вы заботитесь о точном расстоянии H3, может быть неуместно (или, в некоторых случаях, H3 может подойти, но вы можете захотеть, чтобы индексы находились внутри "истинного" круга), один из вариантов здесь - преобразовать ваш круг в близкий. в круговой многоугольник, затем получить индексы через h3.polyfill
).