Research
Security News
Quasar RAT Disguised as an npm Package for Detecting Vulnerabilities in Ethereum Smart Contracts
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
高性能、通用的 webgl地图组件库
dmap是一种3d的地理类可视化引擎(一些非地理相关的功能也能实现)
dmap依赖开源、通用的jquery 和 three.js。
dmap基于webgl,性能合表现比svg、canvas等其他dom元素形成的可视化更好。但webgl非所有浏览器支持,如需兼容性更好的2d地图,可以使用ldmap
tnpm install @ali/ldmap
dmap的组件采用require机制,你可以用 node-cube 启动
sudo npm install node-cube -g
cd your_dir
cube start
浏览demo http://localhost:9999/demo/
一些地理数据放在内部服务器,需日常环境绑定
10.189.224.26 daily.s.aliyun.com# daily
可以整体引入
var D = require('@ali/dmap');
var map = new D.Map(container, options);
也可部分引入
var Map = require('@ali/dmap/map/map');
var map = new Map(container, options);
为了选择性引入,可以了解dmap的目录组织 ↓↓↓
d-map目录组织如下:
名称 | 说明 |
---|---|
map | map是地图的核心,此目录包括map的构造、投影、交互、渲染等 |
layer | 3d图层,包括地理类图层和可视类图层,详见下文 |
layer_2d | 2d的可视化贴图,可以贴图在地球等实体表面 |
render | 和绘图相关的,如特殊3d结构、shader等 |
core | 公共方法等 |
mapping | 贴图 |
demo | 案例 |
组件开发主要涉及地理数据和可视化数据。
地理类数据组要为geojson格式,如地理边界、公路数据等。 详细
在javascript语法层面上,可视类数据一般有2层结构,如:
[[]] 型:
[['上海', 222], ['宁波市':111], ...]
[{}] 型:
[{name: '上海', value: 222}, {name: '宁波市', value:111}, ...]
{{}} 与 {[]}型数据同理。
从展现形式区分 分为连接型数据、与点状、面状、轨迹数据。
点状数据(点图、热力图等):
[{name: '上海', value: 222}, {name: '宁波市', value:111}, ...]
连接型数据(飞线数据等):
[{name: '上海', value: 222, from: { lat: 30, lng: 120}, to: { lat: 30.5, lng: 120.6}], {name: '上海', value: 222, from: { lat: 30, lng: 120}, to: { lat: 30.9, lng: 120.8}], ...]
map是地图的核心,包含: 1、初始化三维环境 2、与输入进行交互 3、定义了地理投影 4、触发各类事件等
当移动或缩放map结束,鼠标离开时,map默认会打印现在的位置信息。
map的交互方式有2种,平移和旋转,敲击键盘自动切换(外部禁了敲击事件除外)。
var Map = require('@ali/dmap/map/map');
var container = $('#map-container');
var map = new Map(container, {});
名称 | 类型 | 说明 |
---|---|---|
projection | String | 投影方式, 详见下表 |
angle | Number | 相机视野的角度,50为人眼视野角度 |
near | Number | 相机可视最近距离 |
far | Number | 相机可视最远距离 |
rotation | Object | 相机旋转角 {x: x, y: y} |
rotateSpeed | Number | 相机旋转缓动速度 |
center | Object | 相机视觉的中心坐标 {x: x, y: y, z:z} |
moveSpeed | Number | 相机中心移动的速度 |
distance | Number | 相机距离中心的距离 |
moveSpeed | Number | 相机缩放缓动速度 |
autoRotateSpeed | Number | 自动旋转速度 |
clearColor | ColorString | webgl背景色 |
clearAlpha | Number | 0-1 webgl背景透明度 |
globalAlpha | Number | 0-1 总体透明度 |
projection的分类:
map投影方式 | 说明 |
---|---|
plane / mecator | 墨卡托投影 最通用的平面投影方式 |
sphere | 球面投影 |
origin_2d | 将经纬度直接按照数值映射到平面上 |
normal | {x:x,y:y,z:z} -> {x:x,y:y,z:z}(非经纬度映射) |
layer是3d地图的层,层即具有独立意义的整体。
和数据一样,layer可分为地理展现和可视展现。
地理展现包括贴图地球、太阳、地理边界、建筑层等。
可视展现包括点图、热力图、飞线图、区域热力图等。
但对于组件而言,一个组件也许兼具两种类型,如/layer/area.js 其可以勾勒地理边界,也可以填充颜色形成区域热力图(即所谓Choropleth map)
大部分可视化图层,都能跟随map的投影方式,如平面图和地球。
layer/addons目录存放不常用的,辅助性的图表,如标注、辅助线等。
部分layer会分为2个层次,如 flying_lines 和 flying_line。 flying_lines管理一组飞线,而flying_line管理一根飞线。
名称 | 说明 |
---|---|
globe.js | 地球的模型 支持多种贴图 |
sky.js | 天空,支持贴图和颜色 |
solar.js | 太阳, 可以做光源、支持发光效果 |
areas.js | 通过geojson格式的边界地理数据,绘制矢量层 |
flying_lines.js | 飞线图,支持如两地交易、电话通信等关联性数据可视化 |
layer_2d.js | 生成2d的可视化贴图 |
heatmap_height.js | 高度热力图 |
scatter.js | 3d点图 |
addons/markers | 3d标注 |
var Map = require('@ali/dmap/map/map');
var Solar = require('./../layer/solar');
//初始化地图
var container = $('#map-container');
var map = new Map(container, {});
//各种不同的组件 构造的方式都很类似
var scatter = new Scatter();
scatter.addTo(map);
scatter.render([{lat:30, lng: 120}]);
配置采用多层的配置结构,传入组件后和组件的配置深度合并。
名称 | 类型 | 说明 |
---|---|---|
ratio | Number | 当投影为球面的时候,为了避免多个层重叠,各层在径向上的scale的比例 |
offset | Object | 在投影结束后进行的偏移 {x:x,y:y,z:z} |
各组件配置中,有许多函数型配置,如颜色对应函数,经纬度提取函数等,以经纬度提取函数为例: 在我们传入render函数的data,组织结构也许非常多变,如:
//案例1
{
lat: 30,
lng: 120,
value:1
}
//案例2
[30, 120, 1]
//案例3
{
cp:{
lat: 30,
lng: 120
},
value: 1
}
//案例4
{
cp:[30,120],
value: 1
}
我们很难枚举这些常用的经纬度组合,为了获得数据中的经纬度,我们通过函数传入:
var getLat = function(d){
var lat = d.lat || d.latitude || d[0];
if(lat) return lat;
var center = d.cp || d.center || d.c || d.pos || d.position;
if(center) return center.lat || center[0] || center.latitude;
};
//
var options = {
lat: getLat
};
......
这些常用的字段可以为函数, 其中,d为可视数据中的一项,id为其序号或id。v为提取出来的可视化字段,min, max为其中的最值,feature为geojson的单元。
名称 | 说明 | 常见输入值 |
---|---|---|
lat | 纬度提取函数 | d, id |
id | 获取数据的id | d, id |
geoid | 获取地理数据的地理id | feature |
color | 色彩映射函数 | v, min, max |
value | 获取需要可视化字段值的方法 | d, id |
配置中有一些具有普遍的特殊对象: gradient对象:
{
'from': '#001f6b',//起始颜色
'to': '#e4f2f1',//结束颜色
'easing': 'Quadratic.Out.1.1',//过渡函数
'space': 'hsl'//色彩空间
}
gradient对象到组件内部,会通过内置的高阶函数构造一个颜色映射函数,当输入0-1的数值,返回相应的颜色。 easing字段用.隔开成3段, 前两段采用 TWEEN.js中描述过渡函数的记号,如线性变换Linear.None:
function(k){
return k;
}
后者在这个基础上进行乘方,如 Linear.None.2.2:
function(k){
return Math.pow(k, 2.2);
}
sprite对象: 经过内部处理,生成粒子系统、2d点图等的贴图,如:
var options = {
'sprite': {
'drawN': 1.15,
'color': {
'from': 'hsla(20,100%,75%,0.8)',
'to': 'hsla(120,100%,50%,0.1)',
'easing': 'Linear.None.1.7',
'space': 'rgb'
}
}
};
不同组件有些公共的方法
名称 | 说明 |
---|---|
initialize | 初始化 |
init | init型的方法,各种初始化,如initEvents initDom |
update | update型方法,多针对属性的改变进行更新,如updateColor |
addTo | 加入地图 |
data | 导入数据 有时进行一些处理 |
render | 接受数据并绘制 |
draw | 仅仅绘制或图形更新 |
hide | 回到初始状态而不销毁 可以用于组件回收 |
destroy | 彻底清除 |
layer层基本是通过在3维空间里建立实体实现,另外有一种可视化方案,在贴图中实现可视化,贴入3d的实体表面,甚至与shader进行交互,layer_2d内的组件就是为了实现这种贴图。
名称 | 说明 |
---|---|
scatter | 点/热力图 |
FAQs
3d map visualization lib
The npm package dmap receives a total of 16 weekly downloads. As such, dmap popularity was classified as not popular.
We found that dmap demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 5 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
Security News
Research
A supply chain attack on Rspack's npm packages injected cryptomining malware, potentially impacting thousands of developers.
Research
Security News
Socket researchers discovered a malware campaign on npm delivering the Skuld infostealer via typosquatted packages, exposing sensitive data.