美文网首页
ArcGIS API for JavaScript(未完待续)

ArcGIS API for JavaScript(未完待续)

作者: PixelEyes | 来源:发表于2020-10-12 19:04 被阅读0次

一.准备

安装 esri-loader,使用命令 npm i esri-loader --save-dev 来安装.
用模块的方式引入 esri-loader;

esriLoader 有以下几个方法 :

1 getScript() 从库里面获取 js 文件 ;
2 isLoaded() 检测模块是否加载完成 ;
3 loadModules([], options) 用于加载arcgis 模块,
4 loadCss(url) 用于加载css文件
5 loadScript({url: "xxxxxxxx" }) 将js 加载到页面上,

1.安装esri-loader
npm install --save esri-loader
2.引入esri-loader

安装好esri-loader,在需要的位置引入esri-loader

import esriLoader from 'esri-loader'

也可以直接解构出loadModules,
如果直接解构出loadModules ,加载的时候就可以直接用loadModules([],options)

import { loadModules } from 'esri-loader';
3.引入css

在css文件内,或者页面style标签内,引入css

/*引入css*/
@import 'https://js.arcgis.com/4.7/esri/css/main.css';
4.加载地图模块 (以下是自己项目的代码片段,不完整)
const options = {
    version: '3.33',//版本号,可以省略
    url: 'https://js.arcgis.com/3.33/',//U这里的API地址可以是官网提供的CDN,也可在此配置离线部署的地址
    css: true //是否加载css
};
esriLoader.loadModules([
  "esri/map",//地图
  'esri/views/MapView',
  "esri/layers/ArcGISTiledMapServiceLayer",//切片缓存地图服务,非动态
  "esri/layers/GraphicsLayer",//图形层
  "esri/symbols/PictureMarkerSymbol",//图片标记符号
  "esri/graphic",//几何图形
  "esri/geometry/Point",//坐标点
  "esri/geometry/webMercatorUtils",//web摩托卡工具
  "esri/tasks/locator",//地理编码
  "esri/dijit/Search",//搜索
], options).then(([
  Map,ArcGISTiledMapServiceLayer,GraphicsLayer,PictureMarkerSymbol,
  Graphic,Point,webMercatorUtils,Locator,Search]) => {
    // doSomeThing
    // 这里写业务逻辑
})
.catch(err => {
  console.error(err)
})

我们使用的是esri-loader的loadModules来加载不同的类(模块),这里的loadModules是基于AMD异步加载模块的规范的,所以能看到基本代码骨架为loadModules().then().catch()

如果不配置options,在源码中会自动加载官方提供的默认的options,API的url地址是 https://js.arcgis.com/4.7/

5.绘制地图 (以下是自己项目的代码片段,不完整)

现在已经引入所需的基本类,现在就已经可以按照官网提供的API进行开发了

/**
  * 初始化地图
  * @param point 
  */
initMap(){
  let map = new Map("#divId", {
   // basemap: "oceans",系统默认底图模板,如果自定义了底图ArcGISTiledMapServiceLayer,这个就不需要了
    logo: false,//不显示logo
    center: [116.397732, 39.910388], // long, lat 天安门广场
    zoom: 12,//缩放级别
    maxZoom: 18,//最大空间等级
    minZoom: 3//最小空间等级
  });
  let url="http://cache1.arcgisonline.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer";
  let layer = new ArcGISTiledMapServiceLayer(url);//创建底图,url是官方的
  map.addLayer(layer);//把底图加载到map中

  let graphicsLayer = new GraphicsLayer({ id: "gl" });//创建一个新图层
  map.addLayer(graphicsLayer); //将图层加载到map中

  let currentSymbol = new PictureMarkerSymbol('assets/icons/mark_bs.png', 19, 33);//创建图标
  let point = new Point([116.397732, 39.910388]);//创建点
  let marker = Graphic(point, currentSymbol);//根据点和图标创建地图定位点
  graphicsLayer.add(marker);//将地图定位点绘制到id为'gl'的图层上
  //graphicsLayer.remove(marker);//清除显示范围
  //地图点击事件
  map.on("click", async (e) => {
    marker.setGeometry(e.mapPoint);//e.mapPoint是点击位置的经纬度
    let point = await getAddressInfo(e.mapPoint);
    console.log("point:",point)
  })
  //地图加载完成
  map.on("load", () => {
    map.setExtent(marker._extent)//根据点的范围,设置地图边界
    map.hideZoomSlider();//禁用地图缩放
    map.disableMapNavigation();//禁用平移
    console.log("地图加载完成...");
  });
}
/**
  * 获取地址信息
  * @param point 
  */
async getAddressInfo(point) {
  if (point.spatialReference.isWebMercator()) {//墨卡托坐标转换成物理坐标经纬度
    point = webMercatorUtils.webMercatorToGeographic(point);
  }
  point.longitude = point.x;
  point.latitude = point.y;
  point.name = await locationToAddress(point);
  return point
}

/**
* 请求地理编码服务获取地址信息
* @param point 
*/
async locationToAddress(point) {
  //创建地理编码服务
  let url="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Locators/ESRI_Geocode_USA/GeocodeServer";
  var locator = new Locator(url);//官方URL是美国地址,中国需要相应地址
  await locator.locationToAddress(point, 100)//定位点100米附近的地址信息
  .then((candidate) => {
    return candidate.address;
  }).catch((e) => {
    return null;
  });
}
/**
* 根据中心点和半径,绘制圆圈
* @param center 中心点 
* @param radius 半径
*/
drawCircle(center, radius, symbol){
  var graphic = new this.esri.Circle({
    center: center,
    geodesic: true,
    radius: radius,
  });
  return new this.esri.Graphic(graphic, symbol);
}
/**
* 绘制点
* 根据symbol类型,绘制不同的点
*  PictureMarkerSymbol图片
*  TextSymbol文字
*  SimpleFillSymbol颜色填充
*/
drawMarker(point, symbol){
  return new this.esri.Graphic(point, symbol);
}
/**
* 计算两点间距离
* p1 p2 经纬度 必须是4326坐标系
*/
calculateDistance(p1, p2){
  let polyline = new esri.Polyline(new esri.SpatialReference({ wkid: 4326 }));//创建线对象
  polyline.addPath([p1, p2]);//线对象上添加两个点(此处并没有把线绘制到地图里,虚拟线)
  let dis = Math.round(esri.geometryEngine.geodesicLength(polyline));//获取线的长度
  return dis;
}
6.版本区别

随着Arcgis版本的更新,部分模块名称也有改变,比如:
3.x 作用
ArcGISDynamicMapServiceLayer 动态地图服务
ArcGISImageServiceLayer 影像服务,也属于动态地图服务
ArcGISTiledMapServiceLayer 切片缓存地图服务,非动态

let url="http://cache1.arcgisonline.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer";
var layer = new ArcGISTiledMapServiceLayer(url);
var map = new Map({
  //...
});
//将layer添加到map里,也可以直接新建map时加入进去。
map.add(layer);

4.x 作用
MapImageLayer 动态地图服务
ImageryLayer 影像服务,也属于动态地图服务
TileLayer 切片缓存地图服务,非动态

let url="http://cache1.arcgisonline.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer";
var layer= new TileLayer({url: url});
var map = new Map({
  //...
});
//将layer添加到map里,也可以直接新建map时加入进去。
map.add(layer);

相关文章

网友评论

      本文标题:ArcGIS API for JavaScript(未完待续)

      本文链接:https://www.haomeiwen.com/subject/wdaupktx.html