使用 PostgreSQL 地理类型函数的问题 - PostGIS(扩展)

Problems using functions on geography types with PostgreSQL - PostGIS (extension)

问题来了,

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

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

问题是,当我尝试使用像 ST_Area、ST_Perimeter 这样的 postGis 函数时,... PostgreSQL 总是 returns 错误。如果我是对的,它们中的大多数是 42P01,意思是 "unknown table"。但是 table 存在...

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

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))'));

对于 table 点,我有一个序列字段 (id)、一个地理字段 (point) 和 2 个文本字段 (lat、lng)。 对于 table 个多边形,我有一个序列字段 (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 个测试不起作用。他们 return 错误 42P01.

当尝试在我的 table "points" 上测试另一个功能时,这也失败了,但是 return 是一条奇怪的消息。我正在尝试的是:

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

此函数存在,但 returns 错误消息 SQL 状态:42883 消息:

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

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

不得不说我是postgresql的新手...问题可能出在这...

感谢reading/Help

[提示 - post 您的 create table 语句,因此我们可以看到实际的列类型。

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

If you do a lot of measurements and e.g. have to compare sizes of large polygons, it would make sense to use geography rather than geometry.

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

float ST_Area(geometry g1);

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

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

如果"polygon"是地理类型,你需要

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 中的经纬度参数是错误的(但我可能是错的)。