在react中使用OpenLayers (一)

2,709 阅读2分钟

在react中使用OpenLayers (一)

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

一、前言

最近由于项目需要,需要在react项目中使用地图功能,所以决定使用openlayers进行开发,由于网上对于在react function components中使用OpenLayers 的文章并不多,所以来分享一下使用的方法。

二、实现步骤

项目是基于react开发,首先使用react脚手架搭建一个

npx create-react-app my-app

111

1、引入openlayers

在项目中安装openlayers

npm install ol
yarn add ol

创建函数组件容器

import React, { useState, useRef } from 'react';
import Map from 'ol/Map'
import View from 'ol/View'
import TileLayer from 'ol/layer/Tile'
import VectorLayer from 'ol/layer/Vector'
import VectorSource from 'ol/source/Vector'
import XYZ from 'ol/source/XYZ'

function MapWrapper(props) {
    // openlayers将会渲染进这个div
    const mapElement = useRef()
    return (
        <div ref={mapElement} className="map-container"/>
    )
}

export default MapWrapper

2、初始化地图

import React, { useState, useRef,useEffect } from 'react';
import Map from 'ol/Map'
import View from 'ol/View'
import TileLayer from 'ol/layer/Tile'
import VectorLayer from 'ol/layer/Vector'
import VectorSource from 'ol/source/Vector'
import XYZ from 'ol/source/XYZ'
import OSM from 'ol/source/OSM';
import { transform } from "ol/proj";
import './map.css'
function MapWrapper(props) {
    let centerPos = transform([117.29, 31.85], 'EPSG:4326', 'EPSG:3857');
    // openlayers将会渲染进这个div
    const mapElement = useRef()
    let map = null; //地图全局变量
    useEffect(()=>{
        map = new Map({
            view: new View({
                center: centerPos,//地图中心位置
                zoom: 10,//地图初始层级
                maxZoom: 15,
                minZoom: 9
            }),
            layers: [],
            target: mapElement.current
        });
        let tileLayer = new TileLayer({
            source: new OSM()
        });
        map.addLayer(tileLayer)
    },[])
    return (
        <div ref={mapElement} className="map-container"/>
    )
}

export default MapWrapper
.map-container {
    width: 100vw;
    height: 100vh;
}

222

3、添加标记点

地图中最常见的功能是绘制标记点,使用addLayer即可

import { Style, Fill, Stroke, Circle as sCircle } from 'ol/style';
import { Feature } from 'ol';
import { Point } from 'ol/geom';
import TileLayer from 'ol/layer/Tile'
import VectorLayer from 'ol/layer/Vector'
import VectorSource from 'ol/source/Vector'
const setMarker = () => {
        const _style = new Style({
            image: new sCircle({
                radius: 10,
                stroke: new Stroke({
                    color: '#fff',
                }),
                fill: new Fill({
                    color: '#3399CC',
                }),
            }),
        });
        const _feature = new Feature({
            geometry: new Point(olProj.fromLonLat([117.28, 31.86])),
        });
        _feature.setStyle(_style);
        const _marker = new VectorLayer({
            source: new VectorSource({
                features: [_feature],
            }),
        });
        map.addLayer(_marker);
    };

成功的在地图上添加了一个点位

333