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

时间:2015-02-26 07:55:31

标签: sql postgresql function geolocation postgis

这是问题,

我最近安装了带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),一个地理字段(点)和2个文本字段(lat,lng)。 对于表多边形,我有一个串行字段(id)和一个地理字段(多边形)。

以下是我试图提出的两个问题:

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

这两项测试不起作用。它们返回错误42P01。

当我试着在我的桌子上测试另一个功能" points"时,这也会失败,但会返回一条奇怪的消息。我试着尝试的是:

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

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

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

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

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

感谢您阅读/帮助

1 个答案:

答案 0 :(得分:3)

[提示 - 发布你的create table语句,这样我们就可以看到列类型实际上是什么了。)

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

  

如果你做了很多测量,例如必须比较的大小   大的多边形,使用地理而不是地理是有意义的   几何形状。

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

  

浮动ST_Area(几何g1);

     

fl oat 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中的lat和lon参数是错误的(但我可能错了)。