基本上,我正在为创建表约束等的作业创建一个数据库。
我有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 数据,但我可能是错的。
有解决这个问题的想法吗?
谢谢。
您可以从仅限 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);