我在 AWS Postgres 服务器中有两个表(我正在使用 DBeaver 进行查询)。
表 1 是我从名为
uk_counties
的 S3 存储桶导入的 shapefile,其中列出了英国所有县的几何图形(SRID = 27700 - 可以在此处找到 shapefile)。
表 2 称为
demand_origin
,包含字段 origin_city
(英国的地点)和两个字段 latitude
和 longitude
(其中包含 origin_city
中地点的纬度和经度)。
通过加入
uk_counties
(shapefile)和 demand_origin
,我想通过查找各自的经度与县的 shapefile 相交的位置,将一个县分配给英国的各个地方。
问题是这个连接一直显示为空。经过大量调查后,shapefile 中的几何形状似乎被映射到几内亚湾(纬度 = 0,经度 = 0 及其周围)。
请参阅莱斯特的 shapefile 作为示例:
我的猜测是,几何图形使用的是北距/西距,而不是纬度/经度,因此 PostGIS 将这些形状映射到 lat=0、long=0 左右,因此可能需要重新校准。
这是莱斯特和其他县的几何形状的片段:
ctyua23nm | 几何 |
---|---|
约克 | 多边形 ((464216.99650000036 462110.9015999995、464266.20299999975 462093.0965999998、464270.3008000003 462094.3962999992、 464289.8992999997 4 |
德比 | 多边形 ((434972.3005999997 341311.7999000009、434986.3008000003 341310.40029999986、435000.0536000002 341314.6991000008、 435015.29860000033 3 |
莱斯特城 | 多边形 ((457057.1997999996 310757.2960000001, 457090.5016000001 310726.5047999993, 457074.2011000002 310704.1012999993, 4 57103.5039999997 310 |
拉特兰 | 多边形 ((493934.8219999997 318917.9001000002、493958.61730000004 318915.10089999996、493992.2159000002 318917.1002999991、 493998.72119999956 |
诺丁汉 | 多边形 ((454895.60030000005 346916.29560000077, 454878.09609999973 346857.5024999995, 454844.00270000007 346750.303099999 2、454809.5960999997 |
赫里福德郡 | 多边形 (342023.89639999997 277833.5003999993、342103.60140000004 277823.8030999992、342105.7039000001 277831.3010000009、 342188.6986999996 2 |
剑桥郡 | 多多边形 (((529832.0997000001 300053.7999000009, 529880.2013999997 300039.1041000001, 529903.7987000002 300036.6048000008 ,529914.20399999 |
德比郡 | 多边形 (409407.5981999999 404118.1018000003、409420.79860000033 404098.09750000015、409451.00019999966 404037.2050000001、 409495.2019999996 |
米德尔斯堡 | 多多边形 ((446854.7000000002 517192.69999999925, 446854.28139999975 517190.0275999997, 446853.7965000002 517195.703700000 4、446858.357499 |
特尔福德和雷金 | 多边形 ((371253.05030000024 325634.0976, 371253.0007999996 325619.1019000001, 371253.50380000006 325613.0035999995, 37125 9.8030000003 325591.8 |
特伦特河畔斯托克 | 多边形 (386974.19689999986 354963.50210000016、386978.0968000004 354963.40220000036、386989.7965000002 354965.2017000001、 386993.9025999997 |
巴斯和东北萨默塞特 | 多边形 (376262.7988999998 171210.70079999976、376272.9979999997 171210.30089999922、376299.8026999999 171210.5008000005、 376307.29750000034 |
布里斯托尔市 | 多多边形 (352548.5558000002 175971.75489999913, 352557.1923000002 175970.77720000036, 352560.45139999967 175972.732599999 76、352567.2955 |
北萨默塞特 | 多多边形 (((323057.9967 160841.4989, 323061.50090000033 160841.09899999946, 323064.7988999998 160841.1989999991, 323072.3 019000003 160850.5 |
出了什么问题?
几何图形使用北距/西距,而不是纬度/经度
正确!
SRID 27700 / EPSG:27700 与 Ordnance Survey National Grid (OSGB) 或更通称的英国国家电网 (BNG) 一致。它基本上使用以米为单位的投影东距和北距,而不是以度为单位的纬度和经度。
您可以通过执行
SELECT srtext FROM spatial_ref_sys WHERE srid = 27700;
: 来看到这一点
PROJCS["OSGB 1936 / British National Grid",
GEOGCS["OSGB 1936",
DATUM["OSGB_1936",
SPHEROID["Airy 1830", 6377563.396, 299.3249646,
AUTHORITY["EPSG", "7001"]],
TOWGS84[446.448, -125.157, 542.06, 0.15, 0.247, 0.842, -20.489],
AUTHORITY["EPSG", "6277"]],
PRIMEM["Greenwich", 0, AUTHORITY["EPSG", "8901"]],
UNIT["degree", 0.0174532925199433, AUTHORITY["EPSG", "9122"]],
AUTHORITY["EPSG", "4277"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin", 49],
PARAMETER["central_meridian", -2],
PARAMETER["scale_factor", 0.9996012717],
PARAMETER["false_easting", 400000],
PARAMETER["false_northing", -100000],
UNIT["metre", 1, AUTHORITY["EPSG", "9001"]],
AXIS["Easting", EAST],
AXIS["Northing", NORTH],
AUTHORITY["EPSG", "27700"]]
注意
UNIT["metre"
、AXIS["Easting", EAST]
和AXIS["Northing", NORTH]
。
您很可能希望使用 SRID 4326 / EPSG:4326 来投影数据,这与 WGS84 即 GPS 标准一致。
它是一个 2D 地理坐标系,即使用纬度和经度。
要投影您的表,首先使用
geometry
验证
Find_SRID
列的 SRID 是否设置为 SRID 27700。
SELECT Find_SRID('public', 'uk_counties', 'geometry');
UpdateGeometrySRID
: 设置列的 SRID
SELECT UpdateGeometrySRID('uk_counties', 'geometry', 27700);
ST_Transform
函数进行转换:
返回一个新的几何图形,其坐标转换为不同的空间参考系统。
ALTER TABLE 'uk_counties'
ALTER COLUMN 'geometry'
TYPE geometry(Geometry, 4326)
USING ST_Transform(geometry, 4326);