首页 文章

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

提问于
浏览
0

这是问题所在,

我最近安装了postgresql和postGIS扩展(带功能)我用一些地理数据构建了一个小型数据库模型 .

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

问题是,当我尝试使用postGis函数,如ST_Area,ST_Perimeter,... 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 .

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

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 回答

  • 3

    [提示 - 发布您的create table语句,以便我们可以看到实际的列类型] .

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

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

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

    浮动ST_Area(几何g1); fl_at 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参数是错误的方式(但我可能是错的) .

相关问题