前端实现使用Arcgis地图服务进行相交分析

一、编写相交查询函数

/**
 * @param {String} url Arcgis地图服务查询地址
 * @param {Object} [param] 查询参数
 * @param {string} [param.where='1=1']
 * @param {string} [param.text]
 * @param {string} [param.objectIds]
 * @param {string} [param.time]
 * @param {string} [param.geometry]
 * @param {string} [param.geometryType='esriGeometryEnvelope']
 * @param {string} [param.inSR]
 * @param {string} [param.spatialRel='esriSpatialRelIntersects']
 * @param {string} [param.relationParam]
 * @param {string} [param.outFields]
 * @param {boolean} [param.returnGeometry=true]
 * @param {boolean} [param.returnTrueCurves=false]
 * @param {string} [param.maxAllowableOffset]
 * @param {string} [param.geometryPrecision]
 * @param {string} [param.outSR='4326']
 * @param {boolean} [param.returnIdsOnly=false]
 * @param {boolean} [param.returnCountOnly=false]
 * @param {string} [param.orderByFields]
 * @param {string} [param.groupByFieldsForStatistics]
 * @param {string} [param.outStatistics]
 * @param {boolean} [param.returnZ=false]
 * @param {boolean} [param.returnM=false]
 * @param {string} [param.gdbVersion]
 * @param {boolean} [param.returnDistinctValues=false]
 * @param {string} [param.resultOffset]
 * @param {string} [param.resultRecordCount]
 * @param {string} [param.f='pjson']
 * @param {boolean} [toFeature=false]
 * @returns {Promise<ResponseS>}
 */
export function arcgisQuery(url, param, toFeature = false) {
  const _default = {
    where: '1=1',
    text: '',
    objectIds: '',
    time: '',
    geometry: '',
    geometryType: 'esriGeometryEnvelope',
    inSR: '',
    spatialRel: 'esriSpatialRelIntersects',
    relationParam: '',
    outFields: '*',
    returnGeometry: true,
    returnTrueCurves: false,
    maxAllowableOffset: '',
    geometryPrecision: '',
    outSR: '4326',
    returnIdsOnly: false,
    returnCountOnly: false,
    orderByFields: '',
    groupByFieldsForStatistics: '',
    outStatistics: '',
    returnZ: false,
    returnM: false,
    gdbVersion: '',
    returnDistinctValues: false,
    resultOffset: '',
    resultRecordCount: '',
    f: 'pjson'
  }

  Object.assign(_default, param)
  const data = new FormData()
  for (const key in _default) {
    data.set(key, _default[key])
  }
  let loadingInstance = Loading.service({ fullscreen: true });
  return axios.post(url, data).then(({ data: resp }) => {
    loadingInstance.close();
    if (resp.error) {
      const { details, message } = resp.error
      return Promise.reject([message, ...details].join(';') || 'Error')
    }
    if (toFeature) {
      resp.features = new EsriJSON().readFeatures(resp)
    }
    return resp
  })
}

二、获取查询要素

function getFeatures(url,whereClause ){
      let formData = new FormData();
      formData.append("f", "json");
      formData.append("where", whereClause);
      formData.append("returnGeometry", true);
      formData.append("outFields", "*");
      formData.append("outSR", "4527");

      axios.post(url, formData).then(e => {
        if (e.data.features && e.data.features.length > 0) {
          let features = EsriJsonFormatter.readFeatureFromObject(
            e.data.features[0]
          );
         return features;
        } else {
          return null;
        }
      });
}

三、进行相交查询

function doIntersect(queryUrl,features){
    arcgisQuery(queryUrl, {
        geometry: toArcGIS(features[0].getGeometry(), true),
        geometryType: 'esriGeometryPolygon',
        outSR: getSrid(this.map),
        where
      }, true)
        .then(({ features }) => {
          if (features && features.length > 0) {
          let feature = EsriJsonFormatter.readFeatureFromObject(
            features[0]
          );
          this.map.overLayer.clear();
          this.map.overLayer.addFeature(feature);
          this.map.getView().fit(feature.getGeometry(), {
            duration: 500,
            padding: [1000, 1000, 1000, 1000],
            maxZoom: 14
          });
        }
    })
}

const ESRIJSON_FORMAT = new EsriJSON()
function toArcGIS(param, stringify = false, opt_options) {
  if (param instanceof Feature) {
    return ESRIJSON_FORMAT[stringify ? 'writeFeature' : 'writeFeatureObject'](param, opt_options)
  } else if (param instanceof Geometry) {
    return ESRIJSON_FORMAT[stringify ? 'writeGeometry' : 'writeGeometryObject'](param, opt_options)
  } else if (param instanceof Array) {
    return ESRIJSON_FORMAT[stringify ? 'writeFeatures' : 'writeFeaturesObject'](param, opt_options)
  }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值