You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
5.4 KiB
189 lines
5.4 KiB
import React, { Component } from 'react'
|
|
import PropTypes from 'prop-types'
|
|
import { geoJson } from './mock_data';
|
|
|
|
export default class Bounds extends Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.map = props.map;
|
|
this.pl = {};
|
|
this.textMarker = {};
|
|
}
|
|
static propTypes = {
|
|
prop: PropTypes
|
|
}
|
|
|
|
componentDidMount() {
|
|
if (!window.BoundPl) {
|
|
this.drawBounds();
|
|
}
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
if (window.local_)
|
|
window.local_.remove(this.pl);
|
|
this.textMarker = null;
|
|
window.BoundPl = null;
|
|
}
|
|
|
|
drawBounds = () => {
|
|
var map = this.map;
|
|
var loca = window.local_;
|
|
loca.ambLight = {
|
|
intensity: 0.3,
|
|
color: '#fff',
|
|
};
|
|
loca.dirLight = {
|
|
intensity: 0.6,
|
|
color: '#fff',
|
|
target: [0, 0, 0],
|
|
position: [0, -1, 1],
|
|
};
|
|
loca.pointLight = {
|
|
color: 'rgb(100,100,100)',
|
|
position: [120.24289, 30.341335, 20000],
|
|
intensity: 3,
|
|
// 距离表示从光源到光照强度为 0 的位置,0 就是光不会消失。
|
|
distance: 50000,
|
|
};
|
|
var geo = new Loca.GeoJSONSource({
|
|
data: geoJson
|
|
});
|
|
|
|
var colors = ['#04398c', '#04398c', '#0542a5'].reverse();
|
|
var height = [500];
|
|
var pl = new Loca.PolygonLayer({
|
|
// loca,
|
|
zIndex: 1,
|
|
opacity: 0.6,
|
|
// cullface: 'none',
|
|
shininess: 10,
|
|
hasSide: true,
|
|
});
|
|
|
|
pl.setSource(geo);
|
|
pl.setStyle({
|
|
topColor: function (index, feature) {
|
|
var i = index % 3;
|
|
return colors[i];
|
|
},
|
|
sideColor: function (index, feature) {
|
|
return '#023890';
|
|
},
|
|
borderColor: function () {
|
|
return '#24dcf7'
|
|
},
|
|
height: function (index, feature) {
|
|
return index == 0 ? height[0] : height[0] + index * 50;
|
|
},
|
|
altitude: 0,
|
|
});
|
|
loca.add(pl);
|
|
|
|
// 创建纯文本标记
|
|
var text = new AMap.Text({
|
|
text: '纯文本标记',
|
|
anchor: 'center', // 设置文本标记锚点
|
|
draggable: true,
|
|
cursor: 'pointer',
|
|
angle: 0,
|
|
visible: false,
|
|
offset: [60, 60],
|
|
extData: 'bounds_text',
|
|
style: {
|
|
'padding': '5px 10px',
|
|
'margin-bottom': '1rem',
|
|
'border-radius': '.25rem',
|
|
'background-color': 'rgba(0,0,0,0.5)',
|
|
// 'width': '12rem',
|
|
'border-width': 0,
|
|
'box-shadow': '0 2px 6px 0 rgba(255, 255, 255, .3)',
|
|
'text-align': 'center',
|
|
'font-size': '16px',
|
|
'color': '#fff',
|
|
},
|
|
});
|
|
// text.setMap(map);
|
|
if (!this.textMarker)
|
|
map.add(text);
|
|
this.textMarker = text;
|
|
console.log(text)
|
|
// 拾取
|
|
map.on('mousemove', (e) => {
|
|
var feat = pl.queryFeature(e.pixel.toArray());
|
|
// if (!text) {
|
|
map.add(text);
|
|
// text = this.textMarker;
|
|
// }
|
|
|
|
if (feat) {
|
|
text.show();
|
|
text.setText(feat.properties.NAME);
|
|
text.setPosition(e.lnglat);
|
|
|
|
pl.setStyle({
|
|
topColor: (index, feature) => {
|
|
if (feature === feat) {
|
|
return [19, 43, 77, 1];
|
|
}
|
|
// var v = feature.properties.health * 100;
|
|
var i = index % 3;
|
|
return colors[i];
|
|
},
|
|
sideColor: (index, feature) => {
|
|
if (feature === feat) {
|
|
return '#023890';
|
|
}
|
|
return '#023890';
|
|
},
|
|
borderColor: function () {
|
|
return '#24dcf7'
|
|
},
|
|
height: function (index, feature) {
|
|
return index == 0 ? height[0] : height[0] + index * 50;
|
|
|
|
},
|
|
});
|
|
} else {
|
|
pl.setStyle({
|
|
topColor: function (index, feature) {
|
|
var i = index % 3;
|
|
return colors[i];
|
|
},
|
|
sideColor: function (index, feature) {
|
|
return '#023890';
|
|
},
|
|
borderColor: function () {
|
|
return '#24dcf7'
|
|
},
|
|
height: function (index, feature) {
|
|
return index == 0 ? height[0] : height[0] + index * 50;
|
|
},
|
|
altitude: 0,
|
|
});
|
|
|
|
text.hide();
|
|
map.remove(text);
|
|
}
|
|
});
|
|
|
|
|
|
map.setZoom(11)
|
|
map.setCenter([115.912663,28.543149]);
|
|
map.setRotation(-68.7);
|
|
map.setPitch(42);
|
|
|
|
this.pl = pl;
|
|
window.BoundPl = pl;
|
|
}
|
|
|
|
render() {
|
|
|
|
return (
|
|
<div>
|
|
</div>
|
|
)
|
|
}
|
|
}
|
|
|
|
|
|
|