3D Web Map Client查询3D CityDB多表关联建筑物专题属性问题咨询
解决方案
最优方案:Postgres 关联视图适配(改造成本最低,无需修改业务代码)
3DWMC 仅支持单表查询的限制可以通过在 3D CityDB 中创建关联视图解决,直接把分散在多表的建筑物属性拼接为单个虚拟表,天然适配 PostgREST 的接口规则:
- 第一步:在 Postgres 中创建关联视图,将需要的属性表和 cityobject 表通过主键外键关联,示例 SQL 如下:
CREATE OR REPLACE VIEW v_building_full_attr AS SELECT co.gmlid, b.building_function, b.year_of_construction, -- building 表字段 a.street, a.house_number, a.postal_code, a.city -- address 表字段 -- 可自行添加其他关联表的需要字段 FROM cityobject co LEFT JOIN building b ON co.id = b.cityobject_id LEFT JOIN address_to_building atb ON b.cityobject_id = atb.building_id LEFT JOIN address a ON atb.address_id = a.id WHERE co.objectclass_id = 26; -- 26对应建筑物的objectclass编码,过滤非建筑物数据
- 第二步:给 PostgREST 访问角色开放视图的查询权限,示例 SQL 如下(将
anon替换为你实际配置的 PostgREST 匿名访问角色):
GRANT SELECT ON v_building_full_attr TO anon;
- 第三步:修改 3DWMC 配置,将
cityobjectsJsonUrl参数值替换为该视图对应的 PostgREST 接口地址,格式为http://<你的PostgREST服务地址>/v_building_full_attr。配置完成后 3DWMC 点击建筑物发起的?gmlid=xxx请求会直接触发 PostgREST 对视图的过滤查询,返回所有关联的属性字段,前端可直接渲染展示。
备选方案:接口代理层适配
如果不方便修改数据库结构,可以在 PostgREST 前搭建轻量代理接口:
- 保留 3DWMC 的请求地址为你自定义的代理接口地址
- 代理接口收到带
gmlid参数的请求后,自行调用多次 PostgREST 接口查询多表数据,拼接为符合 3DWMC 要求的单条属性数据返回即可
注意事项
- 视图中必须保留
gmlid字段,且需确保该字段值唯一,避免返回多条数据导致 3DWMC 解析异常 - 不需要展示的字段不要加入视图,减少数据传输体积的同时避免前端展示冗余信息
内容的提问来源于stack exchange,提问作者tdranv
相关产品推荐
相关产品推荐

