ST_GeneratePoints指定生成1个点返回NULL的问题求助
问题原因与解决方案
核心原因:坐标系不匹配导致采样异常
你的city_data表中geometry列使用的是WGS84地理坐标系(EPSG:4326,经纬度格式),而ST_GeneratePoints是基于平面几何实现的随机点生成函数,直接在地理坐标系下使用会出现逻辑异常:
- 查询返回的
area_size=3.948是WGS84下的平方度面积,这个数值远小于东京实际的地表面积(约2194平方公里),极小的平方度范围会让随机采样逻辑难以命中有效多边形区域。 - 当指定生成1个点时,采样完全未命中有效区域,返回
NULL;生成2个点时仅1次命中,因此只返回1个点。
解决方案:转换为平面投影坐标系后生成点
需要先将MultiPolygon转换为适合东京区域的平面投影坐标系(比如UTM 54N,EPSG:32654),在平面坐标系下完成随机点生成,再转换回WGS84得到经纬度点。
示例查询:
SELECT ST_Area(geometry) AS area_wgs84_sq_deg, ST_Area(ST_Transform(geometry, 32654)) AS area_utm_sq_m, ST_GeometryType(geometry) AS geom_type, ST_IsEmpty(geometry) AS is_empty, ST_IsValid(geometry) AS is_valid, -- 先转平面投影生成点,再转回WGS84经纬度 ST_Transform(ST_GeneratePoints(ST_Transform(geometry, 32654), 1, 1211647988), 4326) AS random_point FROM "city_data";
补充说明
- 平面投影坐标系下的面积计算(如示例中的
area_utm_sq_m)才是符合实际的地表面积(单位:平方米),ST_GeneratePoints在平面环境中能按区域大小正常采样,避免地理坐标系的单位问题。 - 若需要生成多个随机点,只需调整
ST_GeneratePoints的第二个参数(如改为5即可生成5个点)。
内容的提问来源于stack exchange,提问作者FryingPan
相关产品推荐
相关产品推荐

