SQL 错误:未知几何类型:13 - PolyhedralSurface

问题描述 投票:0回答:1

基本上,我正在为创建表约束等的作业创建一个数据库。

我有3张桌子,分别是上层和下层。我需要将数据插入到这些表中,其中包括几何数据。

我为顶级表编写了这个 SQL:

insert into ucesfur.mines(mine_name, total_capacity, location)
values ('Mine A', 10000, 
        st_extrude(ST_GeomFromText('POLYGON((400000 200000 0, 400010 200000 0, 400010 200010 0, 400000 200010 0, 400000 200000 0))', 27700), 0, 0, 200)),
       ('Mine B', 8000, 
        st_extrude(ST_GeomFromText('POLYGON((400020 200020 0, 400030 200020 0, 400030 200030 0, 400020 200030 0, 400020 200020 0))', 27700), 0, 0, 200));

这工作得很好。

接下来我需要将数据输入到名为

mining_sites
的表中。
mines
表有一个
mine_id
串行PK,
mining_sites
将其视为FK。

我在这里遇到的问题是我需要使用几何中的 FK 而不是我的名称。

所以查询不能是这样的:

INSERT INTO mining_sites (site_name, mine_id, production_rate, geometry)
VALUES ('Site A1', 1, 150.00, ST_GeomFromText('POLYGON((400001 200001, 400004 200001, 400004 200004, 400001 200004, 400001 200001))', 27700)),
       ('Site A2', 1, 200.00, ST_GeomFromText('POLYGON((400006 200006, 400009 200006, 400009 200009, 400006 200009, 400006 200006))', 27700)),
       ('Site B1', 2, 180.00, ST_GeomFromText('POLYGON((400021 200021, 400025 200021, 400025 200025, 400021 200025, 400021 200021))', 27700));

其中

mine_id
硬编码为1或2。我需要它从几何图形的交集查询矿井ID。

现在,我已经这样编写了查询:

insert into ucesfur.mining_sites (site_name, mine_id, production_rate, location)
values ('Site A1',
        (select mine_id 
         from ucesfur.mines 
         where st_intersects(location, 
st_geomfromtext('POLYGON((400002 200002, 400008 200002, 400008 200008, 400002 200008, 400002 200002))',27700))),
500.00,
st_geomfromtext('POLYGON((400002 200002, 400008 200002, 400008 200008, 400002 200008, 400002 200002))',27700)
);

但是,我收到错误

错误:未知的几何类型:13 - 多面体表面

插入

mining_sites
语句导致了此错误,但我不知道如何修复它。我尝试将几何数据替换为矿山表插入中的几何数据,但仍然出现错误。

我有非常具体的说明,我必须使用

ST_INTERSECT
查询来获取
mine_id
FK 并且无法使用解决方法。我有一种感觉,它与
ST_INTERSECT
声明有关,可能无法获取 3D 数据,但我可能是错的。

有解决这个问题的想法吗?

谢谢。

sql postgresql
1个回答
0
投票

您可以从仅限 2D 的

ST_Intersects()
切换到
ST_3DIntersects()
:

insert into ucesfur.mining_sites (site_name, mine_id, production_rate, location)
select v.site_name
     , m.mine_id
     , v.geom
from ucesfur.mines as m
join(values('Site A1',st_geomfromtext('POLYGON((400002 200002
                                               ,400008 200002
                                               ,400008 200008
                                               ,400002 200008
                                               ,400002 200002
                                              ))',27700)
    )as v(site_name,geom)
on st_3dintersects(m.location,v.geom);
© www.soinside.com 2019 - 2024. All rights reserved.