【问题标题】:Problems using functions on geography types with PostgreSQL - PostGIS (extension)在 PostgreSQL 中使用地理类型的函数时出现问题 - PostGIS(扩展)
【发布时间】:2015-02-26 07:55:30
【问题描述】:

问题来了,

我最近安装了带有 postGIS 扩展的 postgresql(带有函数) 我用一些地理数据构建了一个小型数据库模型。

我实际上是在尝试在其中插入一些地理数据,并在其上使用函数...比如点/多边形/...

问题是当我尝试使用 ST_Area、ST_Perimeter 等 postGis 函数时,... PostgreSQL 总是返回错误。如果我是对的,它们中的大多数都是 42P01 意思是“未知表”。但是表存在...

这是我实际测试数据库的截图:

http://s30.postimg.org/prnyyw7gh/image.png

您可以在屏幕截图中看到 postGIS 扩展在我当前的模型上处于活动状态(此扩展的 1050 个功能在此模型中可用)

我是这样插入数据的:

INSERT INTO "Base".points (point,lat,lng) VALUES ("Base".ST_GeographyFromText('POINT(45.5555 32.2222)'),'45.5555','32.2222');
and
INSERT INTO "Base".polygons (polygon) VALUES ("Base".ST_GeographyFromText('POLYGON((x y,x1 y1,x2 y2,x y))'));

对于点表,我有一个序列字段 (id)、一个地理字段 (point) 和 2 个文本字段 (lat, lng)。 对于 Polygons 表,我有一个序列字段 (id) 和一个地理字段 (polygon)。

这是我正在尝试进行的两个查询:

SELECT "Base".ST_Area(polygon) FROM "Base".polygons WHERE id=1
or
SELECT "Base".ST_Perimeter(polygon) FROM "Base".polygons WHERE id=1

这 2 个测试不起作用。他们返回错误 42P01。

当尝试在我的表“points”上测试另一个函数时,这也失败了,但返回了一条奇怪的消息。我正在尝试的是这个:

SELECT "Base".ST_Distance((SELECT point FROM "Base".points WHERE id=1),(SELECT point FROM "Base".points WHERE id=2))

此函数存在,但返回错误消息 SQL state: 42883 with message :

ERROR : function _st_distance("Base".geography, "Base".geography, numeric, boolean) does not exist

我不发送任何数字或布尔值...我无法解释这些错误来自哪里...

我不得不说我是postgresql的新手......问题可能来自这个......

感谢阅读/帮助

【问题讨论】:

  • 一些观察。您实际上并不需要存储几何图形和经纬度字段,因为您可以使用 ST_X、ST_Y 函数获取纬度/经度,因此它是冗余存储。您通常不需要像这样将架构名称放在 Postgis 函数的前面——我可以从您的屏幕截图中看到它们安装在“基本”架构中,但如果您的 search_path 设置正确,这也是冗余并使查询更难阅读。表名也是如此,除非您在同一个数据库、不同架构中有多个多边形/点表。

标签: sql postgresql function geolocation postgis


【解决方案1】:

[提示 - 发布您的 create table 语句,以便我们查看列类型实际上是什么]。

我认为您的问题是因为您使用的是geography 数据类型而不是geometry;并非所有函数都适用于地理类型(完全或使用相同的参数)。 Here's 解释原因 - 简而言之,根据文章。

如果您进行大量测量,例如必须比较大小 大多边形,使用地理而不是 几何。

要了解哪些函数需要哪些参数,请查看postgis documentation。它会告诉你例如

float ST_Area(几何 g1);

float ST_Area(geography geog, boolean use_spheroid=true);

所以你可以看到 st_area 有两个版本。一个接受几何作为参数,另一个接受地理,但您还必须添加另一个参数。

如果“多边形”是地理类型,则需要

SELECT "Base".ST_Area(polygon, TRUE) FROM "Base".polygons WHERE id=1
-- true will measure around the geography spheroid and is more accurate
-- than false - read the documentation for what you need!

st_perimeter 类似。

关于您在 st_distance 上的错误,您是否在错误消息中看到“st_distance”之前的下划线?我怀疑您遇到了问题,因为您已经在模式中创建了 postgis 扩展。在 PGAdmin 中,查看函数“ST_distance”。您会看到它依次调用函数“_st_distance” - 它找不到,因为在您的情况下,该函数位于不同的模式中。尝试这样做:

CREATE EXTENSION postgis

我认为这将为您节省一个痛苦的世界。

最后,我认为你的 st_geographyfromtext 中的 lat 和 lon 参数是错误的(但我可能是错的)。

【讨论】:

  • 最后一句是对的:PostGIS使用的坐标顺序是always笛卡尔(X Y)或(Long Lat),never(Y X ) 或 (经纬度)。
  • 好答案。当我开始使用 postgis 时,我还遇到了“geography-vs-geometry”问题
猜你喜欢
  • 2022-10-13
  • 2019-11-02
  • 1970-01-01
  • 2021-11-03
  • 2014-05-08
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多