PostGis--地理以及投影数据

78 阅读4分钟

1、简介

这章接着PostGis空间之后,主要是讲投影数据和地理在PostGis中的作用~

2、Projecting Data(投影数据)

  1. 地图投影的必要性:由于地球是球形的,直接将其表面展示到平面(如纸质地图或计算机屏幕)上会产生错误。为了解决这个问题,人们发明了多种地图投影方法。这些投影方法各有优缺点,有的保持面积(等面积投影),有的保持角度(保角投影,如Mercator投影),还有的在多个参数上尝试减少变形,寻找一个平衡点。
  2. 坐标系统转换:在处理空间数据时,有时需要在不同的空间参考系统之间进行转换。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开发工程师一枚,我会持续发一些技术推文,偶尔也会发些工作求职,互联网热点的事情,希望各位小伙伴多多支持,如果觉得本篇文章对您有所帮助,记得点赞关注收藏喔~