Sql ST_HexagonGrid geom矢量用于查找所有点

Sql ST_HexagonGrid geom矢量用于查找所有点,sql,postgresql,gis,postgis,Sql,Postgresql,Gis,Postgis,我在PostGis中回顾这个功能 1) 我不明白的是,潜在的几何数据是什么。如图所示,获取美国地图的来源是什么?什么是数据库模式?如果我只需要美国边界,而不是每个州,我想这可能是一个记录 2) 结果是一系列的分数吗?还是几何矢量 3) 如果是几何矢量,如何将它们转换为lat和lng点 4) 如何从一个点算起,将六西格山脉的半径近似为50英里 更新: 根据下面的Jim Jones示例,我使用宽度来尝试获得正确的六边形数。不幸的是,出了点问题 1) 长度似乎与米无关 2) 有多种大小的六边形,看起

我在PostGis中回顾这个功能

1) 我不明白的是,潜在的几何数据是什么。如图所示,获取美国地图的来源是什么?什么是数据库模式?如果我只需要美国边界,而不是每个州,我想这可能是一个记录

2) 结果是一系列的分数吗?还是几何矢量

3) 如果是几何矢量,如何将它们转换为lat和lng点

4) 如何从一个点算起,将六西格山脉的半径近似为50英里

更新:

根据下面的Jim Jones示例,我使用宽度来尝试获得正确的六边形数。不幸的是,出了点问题

1) 长度似乎与米无关

2) 有多种大小的六边形,看起来很奇怪

postgis_test=# WITH j AS (
postgis_test(# SELECT ST_Transform((hex).geom,4326) AS hex FROM ( 
postgis_test(#   SELECT 
postgis_test(#   generate_hexgrid(
postgis_test(#     5909968.8,
postgis_test(#     ST_XMin(ST_Extent(ST_Transform(geom,3857))) ,
postgis_test(#     ST_YMin(ST_Extent(ST_Transform(geom,3857))) ,
postgis_test(#     ST_XMax(ST_Extent(ST_Transform(geom,3857))) ,
postgis_test(#     ST_YMax(ST_Extent(ST_Transform(geom,3857))) ) AS hex
postgis_test(# FROM usa_states)i) 
postgis_test-# SELECT count(j.hex) FROM j,usa_states
postgis_test-# WHERE ST_Intersects(usa_states.geom,j.hex);
 count 
-------
   119
(1 row)

postgis_test=# WITH j AS (
postgis_test(# SELECT ST_Transform((hex).geom,4326) AS hex FROM ( 
postgis_test(#   SELECT 
postgis_test(#   generate_hexgrid(
postgis_test(#     5909968.8,
postgis_test(#     ST_XMin(ST_Extent(ST_Transform(geom,3857))) ,
postgis_test(#     ST_YMin(ST_Extent(ST_Transform(geom,3857))) ,
postgis_test(#     ST_XMax(ST_Extent(ST_Transform(geom,3857))) ,
postgis_test(#     ST_YMax(ST_Extent(ST_Transform(geom,3857))) ) AS hex
postgis_test(# FROM usa_states)i) 
postgis_test-# SELECT DISTINCT st_area(j.hex) FROM j,usa_states
postgis_test-# WHERE ST_Intersects(usa_states.geom,j.hex);
     st_area      
------------------
 1219.78281686003
 2089.11341619338
 2089.11341619338
 3379.93344444246
  7051.4650344734
 12076.9943663072
(6 rows)
根据,以下函数应基于给定的BBOX和以米为单位的单元大小创建一个具有范围的网格

SRID 3857单位为[非常接近]米,使用 投影将创建在网络地图上“向右看”的十六进制单元格(大多数 其中使用web墨卡托投影)

考虑到您有一个名为
usa
的表,其中包含该表的几何图形,您应该能够创建一个网格,该网格与美国地图重叠,并使用以下查询:

CREATE TABLE usa_hex AS
WITH j AS (
SELECT ST_Transform((hex).geom,4326) AS hex FROM ( 
  SELECT 
  generate_hexgrid(
    80467,
    ST_XMin(ST_Extent(ST_Transform(geom,3857))) ,
    ST_YMin(ST_Extent(ST_Transform(geom,3857))) ,
    ST_XMax(ST_Extent(ST_Transform(geom,3857))) ,
    ST_YMax(ST_Extent(ST_Transform(geom,3857))) ) AS hex
FROM usa)i) 
SELECT j.hex FROM j,usa
WHERE ST_Intersects(usa.geom,j.hex);

编辑:这仍然不是答案,因为它不会使用米创建六边形,但它可能会帮助其他用户。以下函数(由此派生)创建大小完全相同的几何体类型

CREATE OR REPLACE FUNCTION generate_hexagons(width FLOAT, bbox BOX2D, srid INTEGER DEFAULT 4326)
RETURNS TABLE (gid INTEGER, hexagon GEOMETRY) AS $$
DECLARE
  b FLOAT := width/2;
  a FLOAT := b/2;
  c FLOAT := 2*a;
  height FLOAT := 2*a+c;
  ncol FLOAT := ceil(abs(ST_Xmax(bbox)-ST_Xmin(bbox))/width);
  nrow FLOAT := ceil(abs(ST_Ymax(bbox)-ST_Ymin(bbox))/height);
  polygon_string VARCHAR := 'POLYGON((' || 
    0 || ' ' || 0 || ' , ' || b || ' ' || a || ' , ' || b || ' ' || a+c || ' , ' || 0 || ' ' || a+c+a || ' , ' ||
   -1*b || ' ' || a+c || ' , ' || -1*b || ' ' || a || ' , ' || 0 || ' ' || 0 || '))';
BEGIN    
  RETURN QUERY 
  SELECT 
    row_number() OVER ()::INTEGER,
    ST_SetSRID(
      ST_Translate(geom, x_series*(2*a+c)+ST_Xmin(bbox), y_series*(2*(c+a))+ST_Ymin(bbox)),srid)
  FROM generate_series(0, ncol::INTEGER, 1) AS x_series,
       generate_series(0, nrow::INTEGER,1 ) AS y_series,
       (SELECT polygon_string::GEOMETRY AS geom
        UNION
        SELECT ST_Translate(polygon_string::GEOMETRY, b, a + c) AS geom) AS two_hex;    
END;
$$ LANGUAGE plpgsql;
与上面使用的数据集重叠:

WITH j (hex_rec) AS (
  SELECT generate_hexagons(3.0,ST_Extent(geom)) 
  FROM usa
)
SELECT (hex_rec).gid,(hex_rec).hexagon FROM j, usa 
WHERE ST_Intersects(usa.geom,(hex_rec).hexagon);

进一步阅读:


不久前,我修改了一个函数来创建六边形来回答这个问题:它对您有帮助吗?伟大的项目!如何确保六边形的大小是相等的距离/面积,并且可以用作50英里半径的代理?也许您可以详细介绍一下您的用例,并补充您的问题。你为什么需要六边形?你需要覆盖特定区域的六边形,或者你想在一个点周围创建一个六边形,比如缓冲区?我有一个api,我可以按半径(50英里)搜索。我希望覆盖/查询整个美国,尽可能减少对API的调用次数,因此我正在尝试计算需要查询的位置。因此,您希望使用相同大小的六边形覆盖整个国家-50英里?我看到您硬编码了最小x和y以及最大x和y的点。这些要点是什么?3857与WGS84代表什么?4326是参考系统WGS84的编号。3857是另一个参考系统:)x和y不是硬编码的,它们代表BBOX的范围。很明显,你可以将其更改为覆盖更小或更大的区域:)祝你好运!谢谢,但我觉得有点不对劲,有太多的和弦了。脚本创建了5075个hexigons,但我估计只有473个hexigons使用50英里半径,118个使用100英里半径。我相信这个脚本使用的是50英里半径。我算错了吗?我现在无法计算你应该从美国领土上得到多少50英里的六边形,但是你有没有使用过尺寸参数,看看它是否给出了一个令人满意的六边形数量?你是在建议我只是猜测它的宽度吗?
WITH j (hex_rec) AS (
  SELECT generate_hexagons(3.0,ST_Extent(geom)) 
  FROM usa
)
SELECT (hex_rec).gid,(hex_rec).hexagon FROM j, usa 
WHERE ST_Intersects(usa.geom,(hex_rec).hexagon);