Как сгенерировать шейп-файлы для шестиугольников H3 в определенной области - PullRequest
0 голосов
/ 03 июля 2018

Я хотел бы создать шейп-файлы для H3 шестиугольников в определенной географической области. В частности, меня интересует область залива с разрешениями = 6, 7 и 9. Как я могу создать шейп-файлы для шестиугольников, покрывающих эту область?

Я новичок в шейп-файлах или любых других структурах географических данных. Мне больше всего нравится Python и R.

Ответы [ 2 ]

0 голосов
/ 25 июля 2018

Если вы ищете решение в R, пакет h3jsr предоставляет доступ к библиотеке Uber H3. Решение вашего вопроса может быть сделано с помощью функций h3jsr::polyfill() и h3jsr::h3_to_polygon.

Воспроизводимый пример

library(ggplot2)
library(h3jsr)
library(sf)
library(sf)


# read the shapefile of the polygon area you're interested in
  nc <- st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE)

# projection
  nc <- st_transform(nc, crs = 4326)

# get the unique h3 ids of the hexagons intersecting your polygon at a given resolution
  nc_5 <- polyfill(nc, res = 5, simple = FALSE)

# pass the h3 ids to return the hexagonal grid
  hex_grid5 <- unlist(nc_5$h3_polyfillers) %>% h3_to_polygon(simple = FALSE)

Это вернет полигоны ниже:

enter image description here enter image description here

0 голосов
/ 03 июля 2018

Основные шаги здесь:

  • Возьмите многоугольник нужной вам области. Ограничительная рамка должна хорошо работать.
  • Используйте метод polyfill, чтобы заполнить многоугольник шестиугольниками при желаемом разрешении.
  • Обведите все шестиугольники и получите границу с помощью функции h3ToGeoBoundary.
  • Поместите эти границы в файл GeoJSON
  • Используйте конвертер типа ogr2ogr для преобразования в шейп-файл.

Привязки Python не были выпущены, и я не знаком с привязками R, но версия JavaScript может выглядеть следующим образом:

var h3 = require('h3-js');

var bbox = [
    [-123.308821530582, 38.28055644998254],
    [-121.30037257250085, 38.28055644998254],
    [-121.30037257250085, 37.242722073589164],
    [-123.308821530582, 37.242722073589164]
];

var hexagons = h3.polyfill(bbox, 6, true);

var geojson = {
    type: 'Feature',
    geometry: {
        type: 'MultiPolygon',
        coordinates: hexagons.map(function toBoundary(hex) {
            return [h3.h3ToGeoBoundary(hex, true)];
        })
    }
};

console.log(JSON.stringify(geojson));

и вы будете использовать скрипт следующим образом:

node bbox-geojson.js | ogr2ogr -f "ESRI Shapefile" bbox-hexagons.shp /vsistdin/
...