1、简介
这章接着PostGis空间之后,主要是讲投影数据和地理在PostGis中的作用~
2、Projecting Data(投影数据)
- 地图投影的必要性:由于地球是球形的,直接将其表面展示到平面(如纸质地图或计算机屏幕)上会产生错误。为了解决这个问题,人们发明了多种地图投影方法。这些投影方法各有优缺点,有的保持面积(等面积投影),有的保持角度(保角投影,如Mercator投影),还有的在多个参数上尝试减少变形,寻找一个平衡点。
- 坐标系统转换:在处理空间数据时,有时需要在不同的空间参考系统之间进行转换。PostGIS提供了内置支持来变更数据的投影,主要函数包括: ○ ST_Transform(geometry, srid):用于变换数据的投影。 ○ ST_SRID(geometry):返回几何数据的空间参考系统标识符(SRID)。 ○ ST_SetSRID(geometry, srid):设置几何数据的SRID。
2.1 比较数据
- SRID的重要性:SRID联合坐标定义了地球上的一个位置。没有SRID,坐标就只是一个抽象的概念。
- 错误处理:如果尝试比较具有不同SRID的几何形状,例如使用ST_Equals函数比较两个不同SRID的点,系统将返回错误。示例中比较了两个SRID分别为4326和26918的点,返回错误因为它们属于不同的空间参考系统。
- 使用ST_Transform的注意事项:虽然可以用ST_Transform函数在查询时动态转换SRID,但这种做法会使得
空间索引无效
,因此在数据库设计时应选择一个统一的SRID,并尽量避免在频繁的查询中使用转换。
2.2 数据库内SRID的管理
- 查看表的SRID:通过查询geometry_columns表,可以查看数据库中每个表的SRID配置。这对于维护数据的空间一致性非常有用。
3、地理
地理坐标不是笛卡尔坐标。地理坐标不表示在平面上绘制的到原点的线性距离。相反,这些球面坐标描述了地球仪上的角度坐标。在球面坐标中,点由参考子午线的旋转角度(经度)和赤道的角度(纬度)指定。 PostGIS 使用两种类型:
- geometry 类型用于存储欧几里得(平面)几何对象。它假设数据在一个平面空间中,适用于小范围的地理区域,如城市或县。空间函数和距离计算基于笛卡尔坐标系统进行,不考虑地球的曲率。
- geography 类型用于存储球面几何对象。它考虑了地球的曲率,适用于大范围的地理区域,如跨国界或全球范围的数据。
3.1 使用地理
为了将几何数据加载到地理表中,使用ST_Transform函数将geom字段中的几何数据从其原始坐标系统转换为EPSG:4326坐标系统(即WGS 84,广泛用于地图和GPS中),然后将结果转换为地理类型(geography)
CREATE TABLE nyc_subway_stations_geog AS
SELECT
ST_Transform(geom,4326)::geography AS geog,
name,
routes
FROM nyc_subway_stations;
-- 在地理表上构建空间索引与构建几何完全相同:
CREATE INDEX nyc_subway_stations_geog_gix
ON nyc_subway_stations_geog USING GIST (geog);
-- 区别在于:地理索引将正确处理覆盖极点或国际日期变更线的查询,而几何索引则不会。
3.2 创建地理表
CREATE TABLE airports (
code VARCHAR(3),
geog GEOGRAPHY(Point)
);
INSERT INTO airports
VALUES ('LAX', 'POINT(-118.4079 33.9434)');
INSERT INTO airports
VALUES ('CDG', 'POINT(2.5559 49.0083)');
INSERT INTO airports
VALUES ('KEF', 'POINT(-22.6056 63.9850)');
3. 3 转换为几何体
用于强制转换的 PostgreSQL 语法约定是追加到要强制转换的值的末尾。
PS:
大家好,我是小健,Java开发工程师一枚,我会持续发一些技术推文,偶尔也会发些工作求职,互联网热点的事情,希望各位小伙伴多多支持,如果觉得本篇文章对您有所帮助,记得点赞关注收藏喔~