gmap-ol
Version:
A set of helper classes for working with openLayers.
219 lines (208 loc) • 7.44 kB
JavaScript
import { Vector as VectorLayer } from 'ol/layer';
import { Cluster, Vector as VectorSource } from 'ol/source';
import GeoJSON from 'ol/format/GeoJSON';
import { getOptionsStyle } from '../MapUtil/MapUtil';
/**
* Adds a new vector layer from a geojson file.
* @param {import("ol/Map").default} map the map to add the layer to
* @param {File} file the file to read the geojson from
*/
export function addPointLayer(olmap, pointGeoJSON, pointOptions) {
if (olmap === null || olmap === undefined) {
return; // 终止函数执行
}
// 设置站点样式
const getFeatureStyles = (feature) => {
const properties = feature.getProperties();
const textFieldName = pointOptions.textFieldName ? properties[pointOptions.textFieldName] : '';
const styles = {
image: {
src: '',
anchor: [0.5, 0.5],
scale: 1,
...pointOptions.styles?.image,
},
text: {
font: '11px Microsoft YaHei',
textAlign: 'center',
textBaseline: 'middle',
fill: { color: 'rgba(0, 0, 0, 0.85)' },
stroke: {
color: 'rgba(255, 255, 255, 0.75)',
width: 2,
},
offsetY: 16,
text: '',
...pointOptions.styles?.text,
},
};
if (pointOptions.styles.circle) {
styles.image = { circle: pointOptions.styles.circle };
}
if (pointOptions.icon) {
styles.image.src = pointOptions.icon;
}
if (pointOptions.textColor) {
styles.text.fill.color = pointOptions.textColor;
}
if (textFieldName !== '') {
styles.text.text = textFieldName;
}
return getOptionsStyle(styles);
};
const vectorLayer = new VectorLayer({
className: `${pointOptions.className ? pointOptions.className : ''}`,
source: new VectorSource({
features: new GeoJSON().readFeatures(pointGeoJSON),
}),
style: getFeatureStyles,
zIndex: pointOptions.zIndex ? pointOptions.zIndex : 5,
visible: pointOptions?.visible !== undefined && !pointOptions?.visible ? false : true,
});
vectorLayer.set('layerName', `${pointOptions.layerName ? pointOptions.layerName : ''}`);
vectorLayer.set('pickLayerName', `Point${pointOptions.layerName ? pointOptions.layerName : ''}`);
if (pointOptions.hoverStyle) {
vectorLayer.set('tipsLayerName', `tipsLayerName${pointOptions.layerName ? pointOptions.layerName : ''}Point`);
vectorLayer.set('hoverLayerName', `hoverLayerName${pointOptions.layerName ? pointOptions.layerName : ''}Point`);
}
olmap.addLayer(vectorLayer);
}
/**
* Adds a new vector layer from a geojson file.
* @param {import("ol/Map").default} map the map to add the layer to
* @param {File} file the file to read the geojson from
*/
export function addPointDataLayer(olmap, pointData, pointOptions) {
if (olmap === null || olmap === undefined) {
return; // 终止函数执行
}
// 地图站点级别
const level = [2, 4, 6, 8];
const pointLevelData = { 2: [], 4: [], 6: [], 8: [] };
if (pointData && pointData.length === 0) return {};
for (let i = 0; i < pointData.length; i++) {
for (let j = 0; j < level.length; j++) {
let levelNum = 2;
if (pointOptions.zoomFieldName) {
levelNum = pointData[i][pointOptions.zoomFieldName];
}
if (levelNum === level[j]) {
pointLevelData[`${level[j]}`].push(pointData[i]);
}
}
}
const formatDataToLayerByStationType = (pointData, levelKey) => {
const temp = {};
function formatFeature(data) {
const LGTD = data.LGTD ? data.LGTD : data.lgtd;
const LTTD = data.LTTD ? data.LTTD : data.lttd;
return {
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [Number(LGTD), Number(LTTD)],
},
properties: data,
};
}
// 将数据按站点类型分类,并转为GeoJSON<FeatureCollection>格式
pointData.forEach((item) => {
const stationType = 'Point';
if (Object.prototype.hasOwnProperty.call(temp, stationType)) {
temp[stationType].features.push(formatFeature(item));
} else {
temp[stationType] = {
type: 'FeatureCollection',
features: [formatFeature(item)],
};
}
});
// 将分类数据转为地图控件所需图层数据
const layers = [];
Object.keys(temp).forEach((key) => {
layers.push({
type: key,
zoom: levelKey,
data: temp[key],
});
});
return layers;
};
// 获取按站点类型分类的图层
const layers = [];
for (const key in pointLevelData) {
const pointData = pointLevelData[key];
if (pointData.length > 0) {
const layer = formatDataToLayerByStationType(pointData, key);
layers.push(...layer);
}
}
// 地图添加图层数据
layers.forEach((layer) => {
// 设置站点样式
const getFeatureStyles = (feature) => {
const properties = feature.getProperties();
const textFieldName = pointOptions.textFieldName ? properties[pointOptions.textFieldName] : '';
const styles = {
image: {
src: '',
anchor: [0.5, 0.5],
scale: 1,
...pointOptions.styles?.image,
},
text: {
font: '11px Microsoft YaHei',
textAlign: 'center',
textBaseline: 'middle',
fill: { color: 'rgba(0, 0, 0, 0.85)' },
stroke: {
color: 'rgba(255, 255, 255, 0.75)',
width: 2,
},
offsetY: 16,
text: '',
...pointOptions.styles?.text,
},
};
if (pointOptions.icon) {
styles.image.src = pointOptions.icon;
}
if (pointOptions.textColor) {
styles.text.fill.color = pointOptions.textColor;
}
if (textFieldName !== '') {
styles.text.text = textFieldName;
}
feature.set('NAME', textFieldName);
return getOptionsStyle(styles);
};
// 创建矢量源
let vectorSourceData = new VectorSource({
features: new GeoJSON().readFeatures(layer.data),
});
// 是否创建聚合源,默认设置聚合距离为30像素
if (pointOptions.cluster) {
const clusterSource = new Cluster({
distance: pointOptions.distance ? pointOptions.distance : 30,
source: vectorSourceData,
});
vectorSourceData = clusterSource;
}
const vectorLayer = new VectorLayer({
className: `${pointOptions.className ? pointOptions.className : ''}`,
source: vectorSourceData,
zIndex: pointOptions.zIndex ? pointOptions.zIndex : 5,
minZoom: parseInt(layer.zoom) + Number(`${pointOptions.zoomNumber ? pointOptions.zoomNumber : 5.5}`),
visible: pointOptions?.visible !== undefined && !pointOptions?.visible ? false : true,
style: getFeatureStyles,
});
vectorLayer.set('layerName', `${pointOptions.layerName ? pointOptions.layerName : ''}`);
vectorLayer.set('pickLayerName', `Point${pointOptions.layerName ? pointOptions.layerName : ''}`);
const hoverStyle = pointOptions?.hoverStyle !== undefined && !pointOptions?.hoverStyle ? false : true;
if (hoverStyle) {
vectorLayer.set('tipsLayerName', `tipsLayerName${pointOptions.layerName ? pointOptions.layerName : ''}_Point`);
vectorLayer.set('hoverLayerName', `hoverLayerName${pointOptions.layerName ? pointOptions.layerName : ''}_Point`);
}
olmap.addLayer(vectorLayer);
});
}