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