SuperMap iPortal 对接postgis业务数据库(一):使用nodejs连接数据库并通过接口返回数据

前言

最近有很多人问SuperMap iPortal怎样对接自己的业务数据库,而目前SuperMap iPortal还没办法直接对接,但是可以通过11版本新增的低代码编辑器绕行实现.大致实现步骤如下:
1. 使用nodejs连接数据库并通过接口返回数据
2. 在大屏中请求接口数据并在图表和地图组件中加载使用
本篇介绍第一步的主要实现方法.在做相关开发之前需要准备一些东西:
1. postgresql和postgis 我用的是11的.附下载链接如下:https://pan.baidu.com/s/1R1rB5zwis2IWcl6r6r0DXA?pwd=edtm
2. nodejs 的开发环境
3. SuperMap iDesktop 11,SuperMap iPortal 11
4. 一个空间数据(点、线、面)和一份图表数据

一、将准备好的数据放入到postgis中
1. 桌面新建postgis数据库型数据源并放入一个面数据集

如图,我这边是放的一个中国省份的面数据,放入后关闭数据源即可
在这里插入图片描述

2. 放入图表相关数据

图表数据手里没有真实的图表数据就造了一个,如下:
在这里插入图片描述

二、通过express创建一个基本服务

安装express依赖

npm i express

主要代码:

const express = require("express")
const app = express()
app.listen("3000", () => {
    console.log("server http://127.0.0.1:3000");
})
三、连接数据库并查询想要的结果

安装pg依赖

npm i pg

主要代码

const { Pool } = require("pg")

const connectDb = async () => {
    try {
        const pool = new Pool({
            user: "postgres", // 用户名
            // host: "172.16.15.181",  // 主机名
            database: "postgis_test", //数据库名称
            password: "123456",  // 密码
            port: 5432, // 端口
            max: 50, // 最大连接池
            idleTimeoutMillis: 3000 // 连接最大空闲时间
        })
        
        await pool.connect()
        // 去数据库查询想要的结果
        const res = await pool.query('SELECT * FROM chart_data')
        const resMap = await pool.query('SELECT smgeometry FROM "China_Province_pg_1"')
        let resData = res.rows
        let resMapData = resMap.rows
        await pool.end()
    } catch (error) {
        console.log(error)
    }
}
connectDb()
四、转换返回的geometry数据为标准的geojson格式通过接口返回给前端

安装wkx依赖

npm i wkx

主要代码:

let geometryArr = [] // 用于存储二进制geometry转出来的geojson格式的geometry

for (let item of resMapData) {
    // 解析pg存的wkb的空间数据buffer串
    // 将请求回来的数据库二进制数组存进buffer "hex" 表示当前字符串编码为:使用16进制数值表示的字符串
    let buf = new Buffer.from(item.smgeometry, "hex")
    geometryArr.push(wkx.Geometry.parse(buf).toGeoJSON())
}
// 手动构造一个符合mapboxgl加载规则的geojson 数据
let featureObj
let geoJsonObj = {
    type: "FeatureCollection",
    features: []
}
for (let i in geometryArr) {
    featureObj = {
        type: "Feature",
        geometry: geometryArr[i]
    }
    geoJsonObj.features.push(featureObj)
}
// 注册路由 使用此路由响应数据库查到的数据
// 返回图表数据
app.get("/chart", (req, res) => {
    res.send(res)
})
// 返回空间数据
app.get("/map", (req, res) => {
    res.send(geoJsonObj)
})
五、使用cors中间件解决跨域问题

安装cors依赖

npm i cors

主要代码:

// 配置跨域中间件 必须放在路由的前面,不然还报跨域
const cors = require("cors")
app.use(cors())

最终前端请求结果如下:
图表数据接口:http://127.0.0.1:3000/chart
在这里插入图片描述
空间数据接口:http://127.0.0.1:3000/map
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SuperMap iClient 与 Cesium 结合的应用中,可以通过以下步骤绘制一个面: 1. 将笛卡尔坐标系转换为经纬度坐标系。可以使用 Cesium 中的 `Cesium.Cartographic.fromCartesian` 方法将笛卡尔坐标系转换为经纬度坐标系。 2. 在 SuperMap 的 `VectorLayer` 中添加几何图形。可以先创建一个 `GeoRegion` 对象,然后通过 `add` 方法向其添加一个 `GeoRegionPart` 对象,最后将 `GeoRegion` 添加到 `VectorLayer` 中。 下面是示例代码: ```javascript // 创建一个 GeoRegion 对象 var geoRegion = new SuperMap.Geometry.GeoRegion(); // 将笛卡尔坐标系转换为经纬度坐标系,并添加到 GeoRegionPart 中 var positions = [...]; // 笛卡尔坐标系数组 for (var i = 0; i < positions.length; i++) { var position = positions[i]; var cartographic = Cesium.Cartographic.fromCartesian(position); var lon = Cesium.Math.toDegrees(cartographic.longitude); var lat = Cesium.Math.toDegrees(cartographic.latitude); var point = new SuperMap.Geometry.Point(lon, lat); geoRegion.addPart(point); } // 将 GeoRegion 添加到 VectorLayer 中 var vectorLayer = new SuperMap.Layer.Vector("vectorLayer"); vectorLayer.addFeatures(new SuperMap.Feature.Vector(geoRegion)); ``` 其中,`positions` 是一个笛卡尔坐标系数组,表示面的各个顶点的位置。在将其添加到 `GeoRegionPart` 中时,需要先将其转换为经纬度坐标系。 最后,将创建的 `VectorLayer` 添加到地图中即可看到绘制的面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值