@amap/amap-jsapi-loader实现高德地图嵌入React项目中,并且做到点击地图任意一处,获得它的经纬度

1.第一步要加入项目package.json中或者直接yarn install它都可以

想必大家应该都会

cpp 复制代码
 "@amap/amap-jsapi-loader": "0.0.7"

2.加入项目中

关于接口获取key的接口 大家改成自己对应的项目请求方法

cpp 复制代码
import React, { PureComponent } from 'react';
import { Input, Spin } from 'antd';
import AMapLoader from '@amap/amap-jsapi-loader';
import { services } from '@comall-backend-builder/core';

import './index.less';

const { api } = services;
const pfix = 'scal-select';
interface ScalSelectProps {
    onChange: (data: any) => void;
    /**
     * 当前值
     */
    value: any;
    row: any;
    /**
     * 坐标查询-按钮
     * 默认展示
     */
    showBtn: any;
}

interface ScalSelectStates {
    /**
     * 当前地图实例
     */
    map: any;
    /**
     * 地图api
     */
    AMap: any;
    /**
     * 位置标记
     */
    marker: any;
    /**
     * 当前选择位置经纬度
     */
    centerPosition: any[];
    loading: boolean;
}

export class ScalSelect extends PureComponent<ScalSelectProps, ScalSelectStates> {
    constructor(props: any) {
        super(props);
        this.state = {
            map: undefined,
            AMap: undefined,
            marker: undefined,
            centerPosition: [],
            loading: false,
        };
    }

    componentDidMount() {
        this.initMap();
    }
    initMap = () => {
        this.setState({ loading: true });
        api.get({}, { apiPath: '/admin/amap/config' }).then((result: any) => {
            AMapLoader.load({
                key: result.key, // 申请好的Web端开发者Key,首次调用 load 时必填
                version: '1.4.15', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
                plugins: ['AMap.Marker', 'AMap.ToolBar', 'AMap.IndoorMap'], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
            })
                .then((AMap: any) => {
                    let map = new AMap.Map('mapContainer', {
                        zoom: 13,
                    });
                    map.addControl(new AMap.ToolBar());
                    map.on('click', this.showInfoClick);
                    this.setState({ AMap, map, loading: false });
                    map.on('complete', this.mapEnd);
                })
                .catch((e: any) => {
                    console.log(e);
                });
        });
    };

    showInfoClick = (e: any) => {
        const lat = e.lnglat.lat;
        const lng = e.lnglat.lng;
        this.setState(
            {
                centerPosition: [lng, lat],
            },
            () => {
                this.changePosition();
            }
        );
    };
    mapEnd = () => {
        const { centerPosition } = this.state;
        if (centerPosition.length) {
            this.changePosition();
        }
    };
    changePosition = () => {
        const { AMap, map, centerPosition, marker } = this.state;
        //移除所有覆盖物
        if (marker) {
            map.remove(marker);
        }
        // 创建一个 Marker 实例:
        let newMarker = new AMap.Marker({
            icon: '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png', // 添加 Icon 实例
            zoom: 18,
            position: centerPosition,
        });
        // 将创建的点标记添加到已有的地图实例:
        map.add(newMarker);
        // 缩放地图到合适的视野级别
        //  map.setFitView(newMarker);
        //地图中心点平移至指定点位置
        map.panTo(centerPosition);
        this.props.onChange(centerPosition);
        this.setState({
            AMap,
            map,
            marker: newMarker,
        });
    };

    render() {
        const { loading, centerPosition } = this.state;
        const longitudeAndLatitude = centerPosition && centerPosition.join(',');
        const innerName = {
            box: `${pfix}`,
            wrap: `${pfix}--wrap`,
            searchBox: `${pfix}--search_box`,
            searchBtn: `${pfix}--search_box_btn`,
        };
        return (
            <div className={innerName.box}>
                <Spin spinning={loading}>
                    <div className={innerName.searchBox}>
                        <Input
                            disabled={true}
                            value={longitudeAndLatitude}
                            placeholder={services.language.getText('qxzzb')}
                        />
                    </div>
                    <div className={innerName.wrap}>
                        <div className="map-container" id="mapContainer"></div>
                    </div>
                </Spin>
            </div>
        );
    }
}

效果图如下

相关推荐
宿6741 小时前
tsconfig.node.json
前端·javascript·vue.js
小杨互联网1 小时前
Cursor 前端 Dist 自动化逆向框架:/fr 流水线 · 4 脚本 · Vite/Webpack
前端·webpack·自动化·前端逆向框架·ai前端逆向框架
瑞码空间2 小时前
Web应用的多端部署之道:浏览器 · Electron · Docker
前端·docker·electron·浏览器·web
徐奥雯XUAOWEN2 小时前
Codex官网前端可抄吗?从技术视角深度解析与借鉴指南
前端
文艺理科生2 小时前
3 年,8 种方案,1 次重构:LangChain 记忆方案如何从混乱走向清晰
前端·后端·架构
huabuyu2 小时前
SourceMap:从「看不懂线上报错」到「让 AI 定位真根因」
前端·javascript
এ慕ོ冬℘゜2 小时前
前端树形二级列表渲染 + 页面传参完整实战解析(附原生jQuery源码)
前端·javascript·jquery
weixin_469273813 小时前
.md文件是什么?.md如何打开?
前端·编辑器
不好听6133 小时前
Web Worker:浏览器给 JS 开的后台子线程
前端·浏览器
计算机魔术师3 小时前
数据分析还在靠人跑 SQL?AI 智能体已经把效率拉到 63 倍
前端