当前位置: 首页 > Web前端 > JavaScript

【Vigvika小程序分享】地图信息显示

时间:2023-03-27 18:16:09 JavaScript

分享一个Vig地图小程序,可以在地图上显示表格信息。实现的功能可以帮助租房者在租房时在地图上比对租房信息,选择自己喜欢的小基地。项目地址https://github.com/laboonly/w...功能介绍本小程序根据出租屋信息在地图上显示各个出租屋的位置,到公司的路线规划,详细信息形式。帮助租房的同学更加立体的比较每间出租屋的优劣势,找出自己喜欢的房子。使用说明请先获取高德api的key和获取高德地图的apikey,填写src/map.tsx的securityCode和apiKey,启动小程序后,选择姓名、地址对应的表格栏、价格、联系方式,填写地图中心(公司)。我来分享一下开发过程。我只是在开发过程中寻找房子。我想如果我可以使用vigtable小程序来管理租赁信息并实现我寻找最好房子的需求,那就太好了。地图小部件会很棒。顺便介绍一下vig表小程序以及高德地图相关方面的开发。需要理清规划要求。我期望的是小程序可以根据表格中的地址在地图上显示不同的标点,同时点击标点可以显示标点的详细信息,以及到每个标点的距离房子出租给公司。准备工作首先根据官方文档快速开始开发|VigTable开发人员中心,创建并安装小程序。二是高德地图的开发需要在高德开发者中心,注册一个账号,申请一个key,prepare-getstarted-tutorial-mapJSAPI|高德地图API。第一步加载高德地图JSAPI,更新V2.0版本。经过一番尝试,始终无法加载成功。咨询了伟哥的研发同学后,才知道可能是因为伟哥对iframe的支持,所以我决定不用新版的api,改用以前的V.14版的api。但是v.14版本的api加载不支持npm,所以借用了之前使用这个版本api的react-amap开源框架,以及关于地图加载的部分。源码链接,大意是用JS创建脚本标签加载。首先在小程序的框架下创建utils/ApiLoader.js文件。从上面的链接复制代码。这里的地图mapStyle,我使用的是高德的自定义主题,大家可以选择自己喜欢的地图主题,也可以自行配置。//部分代码constDEFAULT_CONFIG={v:'1.4.0',//版本号hostAndPath:'webapi.amap.com/maps',//高德api加载地址key:'',//高德apikey回调:'_amap_init_callback',//回调函数useAmapUI:true//是否使用高德UI}//获取脚本链接getScriptSrc(cfg){return`${this.protocol}//${cfg.hostAndPath}?v=${cfg.v}&key=${cfg.key}&callback=${cfg.callback}`;}//创建脚本jsbuildScriptTag(src){constscript=document.createElement('script');script.type='文本/javascript';script.async=true;//异步执行script.defer=true;//页面加载完成后,执行script.src=src;返回脚本;接下来,我们在小程序项目src中创建一个map.tsx文件,导入APILoader,创建一个MapComponent功能组件。填写地图配置参数。这里要注意挂载在地图上的DOM的宽高。从“反应”中导入反应,{useEffect,useState};从'./setting'导入{设置};importAPILoaderfrom'./utils/APILoader';//mapsecuritykeyconstsecurityCode='高德地图开发者中心应用密钥附带的安全密钥';//AmapapikeyconstapiKey='高德地图开发者中心申请的密钥';//设置地图安全密钥window['_AMapSecurityConfig']={securityJsCode:securityCode,}exportconstMapComponent:React.FC=()=>{//组件初始化时,加载sdk地图实例useEffect(()=>{newAPILoader({key:apiKey,version:null,protocol:'https'}).load().then(()=>{constlnglat=newwindow.AMap.LngLat(114.031040,22.624386);constamap=newwindow.AMap.Map('container',{zoom:12,//levelcenter:lnglat,//中心坐标viewMode:'3D',//使用3D视图mapStyle:'amap://styles/b379277160c9c3ce520627ad2e4bd22c'});window.amap=amap;},[]);返回(

);};修改小程序默认代码index.tsx.import{initializeWidget}from'@vikadata/widget-sdk';import{MapComponent}from'./map';initializeWidget(MapComponent,process.env.WIDGET_PACKAGE_ID!);接下来,我们打开Wiger小程序开发的网页,可以看到地图已经加载完毕。地图加载完成后,我们需要根据表中的地址创建地图点。首先在Vig表中创建姓名、地址、优缺点、价格、联系方式等栏目,填写自己的数据。这里需要用到两个插件,地图编码插件geocoder,高德官方UI库,在utils下新建commons.js。实现加载插件代码。后续的路线规划插件加载也是遵循同样的思路。//加载AmapUI地图插件functionloadAmapUI(){returnnewPromise(resolve=>{window.AMapUI.loadUI(['overlay/SimpleMarker'],(SimpleMarker:any)=>{resolve(SimpleMarker);})})}/加载高德地图编码插件functionloadGeocoder(){returnnewPromise(resolve=>{window.AMap.plugin('AMap.Geocoder',()=>{constgeocoder=newwindow.AMap.Geocoder({//city指定编码查询的城市,支持输入城市名称、adcode和citycodecity:'National'});resolve(geocoder);});});}感谢这些插件和高德地图api的加载是异步的,所以我们把这些功能和地图上的功能分开,将之前的地图挂载元素分成mapcontent的小组件,在src中创建components/mapcontent,根据官方微哥小程序的api修改src/设置.tsx。然后使用useCloudStorage获取用户设置名称、地址等对应列的id。然后使用record.getCellValue获取对应的值。接下来geocoder插件根据这个值获取上述地址,查询对应点的坐标值,最后使用高德AMapUI创建地址对应的标点符号。mapcontent/index.tsx//以下为部分代码及完整源码,请在github中查看sdk';import{getLocationAsync,creatTransfer}from'../../utils/common';exportconstMapContent:React.FC=({pluginStatus})=>{//获取表视图IDconst[viewId]=useCloudStorage('selectedViewId');//获取所有行的信息constrecords=useRecords(viewId);//处理后的表单信息const[recordsData,setRecordsdata]=useState();//名称const[titleId]=useCloudStorage('selectedtitleId');//地址const[addressId]=useCloudStorage('selectedAddressId');//优点和缺点const[houseInfoId]=useCloudStorage('selectedHouseInfoId');//价格const[priceId]=useCloudStorage('selectPrice');//联系信息const[contactId]=useCloudStorage('selectContact');//地图中心地址const[mapCenter]=useCloudStorage('地图中心');//地址处理useEffect(functiongetAddressList(){//获取表的所有地址constrecordsData:any[]=records.map(record=>{return{title:record.getCellValue(titleId),address:record.getCellValue(addressId),信息:record.getCellValue(houseInfoId),价格:record.getCellValue(priceId),联系人:record.getCellValue(contactId)}});setRecordsdata(recordsData);},[记录,titleId,addressId,houseInfoId,priceId,contactId]);//根据表格设置所有地图点useEffect(functiondrawAddress(){console.log('pluginStatus',pluginStatus);if(!pluginStatus||!recordsData||!mapCenterLocation){return;}markAddress(recordsData,markersLayer,mapCenterLocation,informationRef);},[recordsData,mapCenterLocation,pluginStatus]);/*createmarkerrecord:punctuationinformationmarkerConfig:punctuationparameterconfigurationtransfer:createpathobjectinformationRef:信息表单DOM引用*/functioncreatMarker(record:any,markerConfig:markConfig,mapCenterLocation?:locationType,informationRef?:any,){constmarker=newwindow.SimpleMarker({...markerConfig,//...其他标记选项...,不包括内容地图:window.amap,clickable:true,position:[record.location.lng,record.location.lat]});if(mapCenterLocation){marker.on('click',()=>{setHouseinfo(record);constinfoWindow=newwindow.AMap.InfoWindow({content:informationRef.current.innerHTML,//传入dom对象,或者htmlstringoffset:newwindow.AMap.Pixel(0,-40),closeWhenClickMap:true,//点击地图关闭autoMove:true});creatTransfer([mapCenterLocation.lng,mapCenterLocation.lat],[record.location.lng,record.location.lat]);infoWindow.open(window.amap,[record.location.lng,record.location.lat]);});}返回标记;}/*根据地址查找记录添加标记点Data:tabledatamarkersLayer:之前创建的标记层setHouseinfo:设置标点信息函数mapCenterLocation:中心点坐标informationRef:信息窗口DOM*/asyncfunctionmarkAddress(recordsData:Array,markersLayer:Array,mapCenterLocation:locationType,informationRef:any,){if(markersLayer){window.amap.remove(markersLayer);}constasyncRecords=recordsData.map(record=>getLocationAsync(record));constRecords=awaitPromise.all(asyncRecords);constmarkers=Records.map((record:any)=>{returncreatMarker(record,homeMarkerConfig,mapCenterLocation,informationRef);});setMakerslayer(标记);}return();});另外我们需要在setting.tsx中,设置姓名、地址等对应的列,并通过useCloudStorage保存。使用小程序官方的FieldPicker组件选择对应字段获取ID。//以下是部分完整源码,请查看github上exportconstSetting:React.FC=()=>{const[isSettingOpened]=useSettingsButton();//nameconst[titleId,settitleId]=useCloudStorage('selectedtitleId');//地址const[addressId,setAddressId]=useCloudStorage('selectedAddressId');//优点和缺点const[houseInfoId,setHouseInfoId]=useCloudStorage('selectedHouseInfoId');//价格const[priceId,setPriceId]=useCloudStorage('selectPrice');//联系信息const[contactId,setContactId]=useCloudStorage('selectContact');返回isSettingOpened?(设置setViewId(option.value)}/>settitleId(option.value)}/>setAddressId(option.value)}/>setHouseInfoId(option.value)}/>setPriceId(option.value)}/>setContactId(option.value)}/>setInputcenter(e.target.value)}/>OK):空;});到这里我们就基本完成了从表中获取值,然后在地图上实现标点符号等功能。后续的详细信息展示和路线规划也可以使用相应的插件完成我已经把源码上传到https://github.com/laboonly/w...欢迎Star??。后续计划将使这个小程序更具可扩展性。允许用户自由选择标点符号、详细信息显示等功能,增加更多地图功能