使用 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 中的经纬度参数是错误的(但我可能是错的)。
问题来了,
我最近安装了带有 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 中的经纬度参数是错误的(但我可能是错的)。