Geometry vs. Geography

在 PostGIS 中,GEOMETRY 数据类型表示二维笛卡尔平面中的数据。 它可以存储点、线和多边形,以及更复杂的形状,如圆形和矩形。

GEOGRAPHY 数据类型与 GEOMETRY 类似,但它表示球形地球坐标系中的数据。 这使得它更适合存储覆盖大面积或跟踪地球表面运动的数据。

这两种数据类型之间的一个主要区别是它们存储和操作空间数据的方式。 GEOMETRY 使用平坦的笛卡尔平面,这对于测量距离和执行空间分析等任务很有用。

然而,地球并不平坦,因此 GEOGRAPHY 使用更复杂的坐标系来更准确地表示地球表面的数据。 在处理需要考虑地球曲率的数据时,这会很有帮助。

1、地球是一个球体

大圆是球体表面上与球体直径相同并通过球心的圆。 大圆是可以在球体上画出的最大的圆,它们是球体表面两点之间的最短距离。

大圆的一个例子是赤道,它是由地球表面与垂直于其旋转轴的平面相交形成的圆。 大圆的其他例子包括经线,即从北极到南极的圆,以及子午线,即从东到西的圆。

在处理球体的距离时,在 SQL 中使用 GEOGRAPHY 数据类型可能是一个优势,因为它使用考虑了地球曲率的圆地球坐标系。 这比使用 GEOMETRY 数据类型更准确,后者使用平面笛卡尔平面来表示空间数据。

例如,如果要计算地球表面两点之间的距离,使用 GEOGRAPHY 数据类型比使用 GEOMETRY 数据类型可以获得更准确的结果。 你可以使用 ST_Distance 方法计算两个 GEOGRAPHY 对象之间的距离,它会返回沿地球表面的对象之间的最短距离。

2、Geometry 和 Geography 的转换

可以在 PostGIS 中的 GEOMETRY 和 GEOGRAPHY 数据类型之间进行转换。 有几种不同的方法可以做到这一点,具体取决于您的数据和您使用的工具的具体要求。

在 GEOMETRY 和 GEOGRAPHY 之间进行转换的一种常见方法是在 SQL 中使用 ST_GeomFromText 和 ST_GeographyFromText 函数。 这些函数允许你将几何或地理对象的字符串表示形式转换为相应的数据类型。

例如,可以将 GEOMETRY 点对象转换为 GEOGRAPHY 点对象,如下所示:

SELECT ST_GeographyFromText(ST_AsText(geometry_point_column))
FROM your_table;

你还可以使用 ST_GeomFromWKB 和 ST_GeographyFromWKB 函数,使用对象的众所周知的二进制 (WKB) 表示在 GEOMETRY 和 GEOGRAPHY 数据类型之间进行转换。

也可以使用其他函数和方法在 GEOMETRY 和 GEOGRAPHY 数据类型之间进行转换,具体取决于您使用的特定工具和库。 例如,可以使用数据库管理系统提供的空间函数,或者可以使用 GDAL(地理空间数据抽象库)等第三方库来执行转换。

安装 GDAL 后,可以使用 ogr2ogr 实用程序在 GEOMETRY 和 GEOGRAPHY 数据类型之间进行转换。 ogr2ogr 是一个命令行实用程序,允许你对矢量数据执行各种操作,包括在不同数据格式和空间参考系统之间进行转换。

要使用 ogr2ogr 在 GEOMETRY 和 GEOGRAPHY 数据类型之间进行转换,你需要指定输入和输出数据源,以及输出所需的数据类型。 例如,要将 PostgreSQL 表中的 GEOMETRY 列转换为 GEOGRAPHY 列,可以使用如下命令:

ogr2ogr -f "PostgreSQL" PG:"host=myhost user=myuser password=mypassword dbname=mydb" \
  -sql "SELECT ST_GeographyFromText(ST_AsText(geometry_column)) AS geography_column FROM mytable" \
  -nln mytable_geography

此命令使用 ogr2ogr 连接到 PostgreSQL 数据库,执行将 geometry_column 转换为 GEOGRAPHY 的 SQL 查询,并将结果存储在名为 mytable_geography 的新表中。


原文链接:The difference between Geography and Geometry

BimAnt翻译整理,转载请标明出处