alunlunlun
alunlunlun
  • 发布:2021-12-21 11:11
  • 更新:2024-03-21 10:17
  • 阅读:1711

uniapp引入arcgis for js

分类:uni-app

uniapp引入arcgis for js

​ 在前段时间,我刚开始接触uniapp,并接到了在uniapp项目中使用arcgis for js的任务。搜遍了所有的经验帖子也没有一个具体的方法步骤,只有几位大佬分享了可行的结果截图。所以今天写一个小白教程,如有错误,欢迎大家指出。

​ 首先在一个空项目中,引入esri-loader。

npm install--save esri-loader

​ 成功后,在页面中通过renderjs引入esri-loader,注意地图部分需要给出具体高度。

<template>  
    <view >  
        <view id="myMapView" style=" height: 623px " />  
    </view>  
</template>  

<script module="myMapViews" lang="renderjs">  
    //renderjs部分  
    import {  
        loadModules  
    } from 'esri-loader'  
    export default {  
        name: 'myMapView',  
        data() {  
            return {};  
        },  
        mounted() {  
            this.createMapView()  
        },  
        methods: {  
            createMapView() {  
                const options = {  
                    url: 'https://js.arcgis.com/4.14/init.js',  
                    css: 'https://js.arcgis.com/4.14/esri/themes/light/main.css'  
                };  
                loadModules([  
                    "esri/Map",  
                    "esri/views/MapView"  
                ], options).then(([Map, MapView]) => {  
                    var map = new Map({  
                        basemap: "topo-vector"  
                    });  
                    var view = new MapView({  
                        container: "myMapView",  
                        map: map,  
                        center: [-118.80500, 34.02700], // longitude, latitude  
                        zoom: 13  
                    });  
                })  
            }  
        }  
    }  
</script>  

<scrip>  
// service 层  
</scrip>  

<style>  
</style>

效果图如下:

​ 同时,在renderjs的script中,是无法获取到service层的数据的,也无法使用uni的相关接口(注意:H5是可以正常使用的,但是APP端就会报错,比如uni.request等),所以要通过一定的方式从service层去传输。

​ 如果要进行网络请求目前有两种思路:

​ 1.自己写一个原生ajax请求,在renderjs部分使用。

​ 2.在service层给后台发请求后,将数据传回renderjs部分

    下面简单给出个renderjs和service层通讯例子:  
<template>  
    <view>  
        <!-- service层mapdata改变就会调用renderjs部分的mapDataChanged方法 -->  
        <view id="myMapView" :change:mapData="myMapViews.mapDataChanged" :mapData="mapData" style=" height: 500px " />  
        <view>  
            <uni-button @click="changeMapData">service点击</uni-button>  
        </view>  
    </view>  

</template>  

<script module="myMapViews" lang="renderjs">  
    //renderjs部分  
    import {  
        loadModules  
    } from 'esri-loader'  
    export default {  
        name: 'myMapView',  
        data() {  
            return {};  
        },  
        mounted() {  
            this.createMapView()  
        },  
        methods: {  
            createMapView() {  
                const options = {  
                    url: 'https://js.arcgis.com/4.14/init.js',  
                    css: 'https://js.arcgis.com/4.14/esri/themes/light/main.css'  
                };  
                loadModules([  
                    "esri/Map",  
                    "esri/views/MapView"  
                ], options).then(([Map, MapView]) => {  
                    var map = new Map({  
                        basemap: "topo-vector"  
                    });  
                    var view = new MapView({  
                        container: "myMapView",  
                        map: map,  
                        center: [-118.80500, 34.02700], // longitude, latitude  
                        zoom: 13  
                    });  
                })  
            },  
            mapDataChanged(newValue, oldValue, ownerVm, vm) {  
                //mapData改变触发  
                console.log("newValue:", newValue)  
                console.log("oldValue:", oldValue)  
                //调用service层的getFromRenderJs方法,并传值  
                ownerVm.callMethod('getFromRenderJs', {  
                    type: 'polyline'  
                })  
                //这种方法也可以主动调用service层方法  
                /*UniViewJSBridge.publishHandler('onWxsInvokeCallMethod', {  
                    cid: this._$id,  
                    method: 'loadingClose',  
                    args: {  

                    }  
                })*/  
            }  

        }  
    }  

</script>  

<script>  
    //service层  
    export default {  
        data() {  
            return {  
                mapData: {}  
            }  
        },  
        mounted() {},  
        methods: {  
            changeMapData() {  
                //click事件触发的service层方法  
                this.mapData = {  
                    type: 'point'  
                }  
            },  
            getFromRenderJs(params) {  
                //renderjs调用的service层方法  
                console.log('getFromRenderJs:', params)  
            }  

        },  

    }  

</script>  

<style>  
</style>

结果如下:

1 关注 分享
L***@163.com

要回复文章请先登录注册

alunlunlun

alunlunlun (作者)

回复 4***@qq.com :
能帮助到就好
2024-03-21 10:17
4***@qq.com

4***@qq.com

谢谢你,我的超人
2024-03-11 10:58
crazyu

crazyu

回复 z***@126.com :
https://ask.dcloud.net.cn/question/163466?notification_id-1215893__rf-false__item_id-229605__answer_id-229605__single-TRUE#!answer_229605
看看这个链接
2023-03-27 11:31
crazyu

crazyu

回复 z***@126.com :
我现在好想不会出现内存溢出了,我之前吧开发者的工具的内存调大一些,然后就可以打包了
2023-03-27 11:31
z***@126.com

z***@126.com

回复 crazyu :
请问怎么处理?我也遇到了
2023-03-16 15:57
crazyu

crazyu

我打包的时候会存在内存溢出的情况,你们会出现吗
2023-02-20 11:28
1***@qq.com

1***@qq.com

4.24版本 会报 创建view的时候 TypeError: Failed to construct 'IntersectionObserver': member root is not of type Element.
2022-08-22 16:42