使用shp2pgsql转换shapefile导入PostGIS时坐标异常问题
问题说明
- 现有一份纽约州议会选区shapefile文件,最初误判该文件采用GCS_North_American_1983坐标系,目标是将文件以经纬度格式导入PostgreSQL数据库
- 采用shp2pgsql搭配PostGIS执行导入操作时,始终无法匹配正确运行参数,无法完成坐标正确转换
- 此前尝试执行的导入命令如下:
shp2pgsql -I -s 4269 NYS-Assembly-Districts.shp assembly_districts
- 导入后执行质心坐标校验查询,返回的坐标数值高达数十万,完全不符合经纬度取值范围,校验查询语句如下:
select st_x(st_centroid(geom)), st_y(st_centroid(geom)) from assembly_districts;
- 查阅资料得知
-s参数需同时传入源SRID(from_srid)与目标SRID(to_srid),但无法确认两个参数的正确取值 - 该shapefile配套.prj文件内容如下:
PROJCS["NAD_1983_UTM_Zone_18N",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-75.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]
- 核心诉求:确认正确的参数配置方案,导入后得到符合规范的经纬度坐标
解决方案
导入失败的核心原因是源坐标系判定错误。从.prj内容可直接确认,该shapefile采用的是NAD 1983基准下的UTM 18N投影坐标系,单位为米,对应源SRID为26918;目标为经纬度格式的NAD83地理坐标系,对应目标SRID为4269。此前直接指定-s 4269,相当于把米单位的投影坐标错误标记成了度单位的经纬度坐标,查询结果自然会出现数十万级别的异常值。
可根据自身情况选择以下任意一种方案完成修正:
方案1:导入时直接完成坐标转换
执行导入命令时按源SRID:目标SRID的格式传入-s参数,shp2pgsql会在导入过程中自动完成投影转换,直接存入经纬度格式的坐标:
shp2pgsql -I -s 26918:4269 NYS-Assembly-Districts.shp assembly_districts | psql -d 你的目标数据库名
方案2:已错误导入的情况下在库内完成转换
如果已经用错误参数完成过导入,无需重复导入文件,直接在数据库内执行两步SQL修正即可:
- 先修正geom字段的SRID错误标记,将其改回原始数据对应的26918:
SELECT UpdateGeometrySRID('assembly_districts', 'geom', 26918);
- 再将投影坐标转换为4269对应的经纬度坐标:
ALTER TABLE assembly_districts ALTER COLUMN geom TYPE Geometry(Polygon, 4269) USING ST_Transform(geom, 4269);
校验提示:转换完成后重新执行质心查询语句,返回的经度值会落在纽约州对应的-79-71区间、纬度值落在4045区间,完全符合经纬度的合法取值范围。
内容的提问来源于stack exchange,提问作者Aidan Foley
相关产品推荐
相关产品推荐

