如何创建包含各网格单元中心经纬度值的网格?——st_make_grid网格经纬度提取方法咨询
解决PostGIS网格中心经纬度的两个问题
嘿,这两个需求在PostGIS空间数据处理里太常见了,我来一步步给你讲清楚怎么实现:
一、创建自带中心经纬度的网格
你可以直接在生成网格的SQL语句里,一次性计算出每个网格的中心经纬度,把它们和网格几何一起返回或者存入表中。核心用到的函数是ST_Centroid()(获取几何中心)、ST_X()和ST_Y()(提取坐标值),如果你的网格是投影坐标系(比如UTM),记得转成WGS84(EPSG:4326)来得到真实的经纬度。
举个实际的SQL例子:
-- 假设你的边界框是WGS84坐标系(EPSG:4326)的范围 WITH bbox AS ( SELECT ST_MakeEnvelope(-122.5, 37.7, -122.3, 37.9, 4326) AS geom ), grid AS ( SELECT ST_MakeGrid(bbox.geom, 0.01, 0.01) AS grid_cell -- 0.01度为网格大小 FROM bbox ) SELECT row_number() OVER () AS grid_id, grid_cell AS geom, ST_X(ST_Centroid(grid_cell)) AS longitude, -- 提取中心经度 ST_Y(ST_Centroid(grid_cell)) AS latitude -- 提取中心纬度 FROM grid;
如果你的网格是投影坐标系(比如EPSG:32610),就需要先转换坐标系:
ST_X(ST_Transform(ST_Centroid(grid_cell), 4326)) AS longitude, ST_Y(ST_Transform(ST_Centroid(grid_cell), 4326)) AS latitude
要是想把这些数据存入表,直接在上面的语句后加CREATE TABLE your_grid_table AS ...即可。
二、从已生成的网格中提取中心经纬度
如果你已经有了存储好的网格表(比如表名为existing_grids,几何字段为geom),只需要对每个网格单元执行中心计算和坐标提取就行,逻辑和上面一致:
基本提取(假设网格是WGS84坐标系)
SELECT grid_id, ST_X(ST_Centroid(geom)) AS longitude, ST_Y(ST_Centroid(geom)) AS latitude FROM existing_grids;
投影坐标系转经纬度
如果网格是投影坐标系,必须转换到WGS84才能得到经纬度:
SELECT grid_id, ST_X(ST_Transform(ST_Centroid(geom), 4326)) AS longitude, ST_Y(ST_Transform(ST_Centroid(geom), 4326)) AS latitude FROM existing_grids;
小提示
ST_Centroid()返回的是几何的中心点,对于规则的矩形网格来说,这个点就是你需要的中心;如果是不规则多边形网格,它会返回几何质心,也是常用的中心定义。- 如果你需要更高效的计算,可以考虑预先把中心坐标存在表中,避免每次查询都重复计算。
内容的提问来源于stack exchange,提问作者fin




