Openlayers2结合jsts库实现空间分析功能

ConvexHull.vue 

<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-09-10 16:10:56
 * @LastEditTime: 2019-09-16 09:51:09
 * @LastEditors: Please set LastEditors
 -->
<template>
  <div class="col-md-12">
    <!----路径导航---->
    <div class="myman_nav_route">
      您现在的位置:<a href="javascript:">开发支持</a> > <a href="javascript:">Javascript API</a> > <a href="javascript:">参考手册</a> > <a href="javascript:">事件</a>
      <div class="pull-right myman_nav_feedback">
        <i class="glyphicon glyphicon-list-alt"></i>
        用户反馈
      </div>
    </div>
    <div> <Button type="info" id="btn03" @click="Geometry1">绘制</Button></div>
    <div><textarea type="text" id="geomtext" rows="5" cols="80">POLYGON((12615854.963811828 2649848.008031188,12615454.963811828 2649448.008031188,12615954.963811828 2649448.008031188,12615854.963811828 2649448.008031188,12615554.963811828 2649848.008031188))</textarea></div>
    <div> <Button type="info" id="btn03" @click="Geometry2">绘制</Button> <Button type="info" id="" @click="convexHull">运行</Button></div>
    <div><textarea type="text" id="geomtext3" rows="5" cols="80">POLYGON((12615854.963811828 2649848.008031188,12615840.963811828 2649048.008031188,12615954.963811828 2649999.008031188,12615994.963811828 2649848.008031188,12615999.963811828 2649998.008031188,12615954.963811828 2649999.008031188))</textarea></div>
    <!---- 中间详细内容 ---->
    <div class="myman_content">
      <h3 class="myman_title">ConvexHull</h3>
      <small>最后更新时间: 2019年09月10日</small>
    </div>
    <div class="layout">
      <Layout>
        <Sider hide-trigger>
          <span class="title">ConvexHull</span>
        </Sider>
        <Layout>
          <Header>
            <!-- 几何体1:
            <Input placeholder="Enter point" style="width: auto" />
            <Icon type="ios-contact" slot="prefix" />
            <Button type="info" id="btn03">运行</Button> -->
            <div>
              几何体1: <Button type="info" id="">绘制</Button>
              <Input v-model="value1" type="textarea" id="geomtext" :autosize="{minRows: 2,maxRows: 5}" placeholder="Enter something..." />
            </div>

            <div>
              几何体2: <Button type="info" id="">绘制</Button> <Button type="info" id="" @click="convexHull">运行</Button>
              <Input v-model="value2" type="textarea" id="geomtext3" :autosize="{minRows: 2,maxRows: 5}" placeholder="Enter something..." />
            </div>
          </Header>
          <Footer>
            <div id="map" style="width: 100%;height: 650px" @click="init()"></div>
          </Footer>
        </Layout>
      </Layout>
    </div>

  </div>
</template>
<script>
export default {
  nam: 'ConvexHull',
  data () {
    return {
      map: null,
      wktpolygon2: null,
      wktpolygon: null,
      wfvectorselectedstyle: null,
      value1: 'POLYGON((12615854.963811828 2649848.008031188,12615454.963811828 2649448.008031188,12615954.963811828 2649448.008031188,12615854.963811828 2649448.008031188,12615554.963811828 2649848.008031188))',
      value2: 'POLYGON((12615854.963811828 2649848.008031188,12615840.963811828 2649048.008031188,12615954.963811828 2649999.008031188,12615994.963811828 2649848.008031188,12615999.963811828 2649998.008031188,12615954.963811828 2649999.008031188))'

    }
  },
  mounted () {
    this.initMap()
    // console.log(OpenLayers);
  },
  methods: {
    initMap () {
      OpenLayers.Layer.OFFLINEMAP = OpenLayers.Class(OpenLayers.Layer.XYZ, {
        name: "MYMAP",
        url: "https://nqi.gmcc.net:20443/tiles/${z}/${x}/${y}.png",
        sphericalMercator: !0, //是{String} The layer attribution.
        wrapDateLine: !0, //
        tileOptions: null, //{Object} o此Layer创建的OpenLayers.Tile实例的可选配置选项。
        isBaseLayer: true,
        initialize: function (a, b, c) {
          OpenLayers.Layer.XYZ.prototype.initialize.apply(this, arguments);
          this.tileOptions = OpenLayers.Util
            .extend({ //OpenLayers.Util.extend(目标对象,原对象):将原对象中的所有非“undefined”属性拷贝到目标对象(包括"toString"函数)
              crossOriginKeyword: "anonymous" //{Object} 此Layer创建的OpenLayers.Tile实例的可选配置选项。默认是
            },
              this.options && this.options.tileOptions)
        },
        //创建此图层的克隆
        clone: function (a) {
          null == a && (a = new OpenLayers.Layer.OFFLINEMAP(this.name, this.url, this.getOptions()));
          return a = OpenLayers.Layer.XYZ.prototype.clone.apply(this, [a])
        },
        CLASS_NAME: "OpenLayers.Layer.OFFLINEMAP"
      });

      this.map = new OpenLayers.Map({
        div: "map",
        projection: "EPSG:900913",
        displayProjection: new OpenLayers.Projection("EPSG:4326"),
        maxExtent: [-20037508.34, -20037508.34, 20037508.34, 20037508.34],
        uints: 'm',
        center: [12615854.963811828, 2649648.008031188],
        isBaseLayer: true,
        numZoomLevels: [0,
          16], //屏幕点:[Screen]:692,304,WGS84:113.32483033753087,23.13118398658761,level:14,Web Mercator:

        resolutions: [0.0439453125, 0.703125, 0.3515625, 0.17578125, 0.087890625, 0.0439453125]      });
      // console.log("经纬度是:"+lonlat.lon+", "+lonlat.lat);
      var configIP = "https://nqi.gmcc.net:20443/tiles/${z}/${x}/${y}.png";
      var mapoptions = {
        name: "map",
        url: configIP,
        sphericalMercator: !0,
        wrapDateLine: !0,
        tileOptions: null,
        box: true,//允许框选
        numZoomLevels: 16,
        isBaseLayer: true,
      };

      // * 集合图层,从layer中继承
      var offlinemap = new OpenLayers.Layer.OFFLINEMAP(mapoptions);
      this.map.addLayer(offlinemap);

      /**
     * jsts 例子
     **/
      //添加样式过滤器
      var wfvectorstyle = new OpenLayers.Style({
        pointRadius: 30,
        fillOpacity: 0.7,
        fillColor: "#00b3f9",
        strokeWidth: 5,
        strokeOpacity: 1,
        graphicZIndex: 1,
        strokeColor: "#D44927"   //颜色
      });
      this.wfvectorselectedstyle = new OpenLayers.Style({
        pointRadius: 30,
        fillOpacity: 0.7,
        fillColor: "green",
        strokeWidth: 5,
        strokeOpacity: 1,
        graphicZIndex: 1,
        strokeColor: "#F0D25D"
      });
      var wfslayer = new OpenLayers.Layer.Vector("testlayer",
        {
          styleMap: new OpenLayers.StyleMap({ "default": wfvectorstyle, "select": this.wfvectorselectedstyle })
        });
      this.map.addLayer(wfslayer);

    },
    toGeometryFromWkt (wkt) {
      var geometry = null;
      var wkt_reader;
      if (wkt_reader == null) {
        wkt_reader = new OpenLayers.Format.WKT(); // wkt对象
      }
      geometry = wkt_reader.read(wkt);
      var obj = new Object();
      obj.name = "name";
      obj.wkt = wkt;
      geometry.attributes = obj;
      return geometry;
    },
    addFeature (wkt, layer) {
      var geometry = this.toGeometryFromWkt(wkt);
      $.extend(geometry.attributes, { NAME: "name", WKT: wkt });   //扩展属性
      if (wkt != null) {
        layer.addFeatures(geometry);
      }
    },
    Geometry1 () {
      //创建几何体1
      var geomt3 = document.getElementById("geomtext3");
      this.wktpolygon = geomt3.value;
      var layer = this.map.getLayersBy("name", "testlayer");
      this.addFeature(this.wktpolygon, layer[0]);
    },
    Geometry2 () {
      //创建几何体2
      var geomt2 = document.getElementById("geomtext");
      this.wktpolygon2 = geomt2.value;
      var layer = this.map.getLayersBy("name", "testlayer");   //getLayer(layerId:String):Layer	根据图层ID,获取图层对象
      console.log(layer)
      this.addFeature(this.wktpolygon2, layer[0]);
    },
    convexHull () {   //提取公共的方法
      // 使用WKT format读取A和B两个点
      //JSTS reader, converts WKT geometry to JSTS geometry
      var jsts_reader = new jsts.io.WKTReader();
      //JSTS OpenLayersParser reads OpenLayers geometry to JSTS geometry / writes JSTS geometry to OpenLayers geometry
      var jsts_parser = new jsts.io.OpenLayersParser();
      var jsts_buffer_tolerance; //2 bzw. 100000 s. init(); //buffer
      var akt_jsts_operation = 1; //buffer
      ////WKT转Geometry,points是一个点数组,如果为点,其长度为1,如果为线和面,长度大于1
      var layer = this.map.getLayersBy("name", "testlayer");
      var fts = layer[0].features;
      // //转成jsts geometry 对象
      var jsts_geomA = this.wktpolygon;
      var jsts_geomB = this.wktpolygon2;
      var jsts_geomA = jsts_parser.read(fts[0].geometry.clone());
      var jsts_geomB = jsts_parser.read(fts[1].geometry.clone());
      // //通过jsts空间扩展能力去算多点的外接矩形
      var jsts_result_geom = jsts_geomA.convexHull(); //外接矩形
      console.log(jsts_result_geom);
      console.log(jsts_result_geom.shell.points[0].x)
      //  //转成openlayer geometry 对象
      var transforgeometry = jsts_parser.write(jsts_result_geom);
      var convexHullFeature = new OpenLayers.Feature.Vector('convexHullVector', {
        styleMap: new OpenLayers.StyleMap(this.wfvectorselectedstyle)  //设置图层样式
      });
      convexHullFeature.geometry = transforgeometry;
      layer[0].addFeatures([convexHullFeature]);
      // var difference = jsts_geomB.difference(jsts_geomA)
    }
  }
}

</script>
<style scoped >
#map .olControlZoom {
  /*隐藏地图左上角的+-号*/
  display: none;
}
.myman_content {
  margin-top: 20px !important;
  border-bottom: 1px solid rgb(207, 204, 204);
}
.layout {
  margin-top: 20px;
}
.ivu-layout-sider,
.ivu-layout-header,
.ivu-layout-footer {
  border: 1px solid #d2d6de;
  height: 735px;
}
.ivu-layout-footer {
  background: white;
  padding: 10px 10px;
}
.ivu-layout-sider {
  background: #f4f4f4 !important;
  height: 900px;
}
.ivu-layout-header {
  background: #f4f4f4;
  height: 300px;
}
.ivu-layout.ivu-layout-has-sider {
  height: 900px;
}
.title {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  font-size: 20px;
  background-color: #f7eee8;
  color: #30badf;
}
.jiheti {
  display: inline-block;
}
</style>

发布了98 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42416812/article/details/100895242