vue使用vant-ui、天地图、Openlayers实现轨迹查询,点击事件信息弹窗,列表加载刷新,复位功能

568 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

功能需求:

  • 数据图层叠加;
  • 轨迹查询显示;
  • 港口起始点可点击显示弹窗;
  • 复位功能;
  • 根据选择的时间段查询船舶行驶的轨迹;
  • 船舶行驶的港口列表,下拉数据刷新、上拉数据列表分页加载;

技术栈:

vue、有赞vant-ui、天地图、Openlayers

实现效果:

image.png

image.png

image.png

代码实现: 

安装openlayers:

cnpm i -S ol #或者 npm install ol

cnpm i -S ol
#或者
npm install ol
  <div>
    <nav-bar-top :titleText="titleName" :arrowTrue="arrowTrue"></nav-bar-top>
    
    <div class="ships">
      <!-- <div id="mapContainer"></div> -->
      <div style="width:100%;height:100%">
          <div id="trajecttoryMap"></div>
          <!-- 弹窗元素 -->
          <div class="popup" ref="popup" v-show="shopPopup" >
            <div class="ship-header">
              <!-- <div class="cname">经度:{{traData[0]}}</div>
              <div class="cname">纬度:{{traData[1]}}</div> -->
               <div class="cname">{{shipInfo.shipName}}</div>
              <img class="icon-close" @click="closePopup" src="../../assets/img/sy_close.png"/>
            </div>
            <div class="ship-content">
              <div class="mb15">MMSI:{{shipInfo.mmsi}}</div>
              <div class="con-sx mb15">
                <span class="txt-margin">航速:{{shipInfo.speed}}节</span>
                <span>航向:{{shipInfo.csx}}°</span>
              </div>
              <div>最后上报时间:{{shipInfo.createTime}}</div>
            </div>
          </div>
          <!-- 复位 -->
          <ul class="bot_imgs">
            <li @click="handleCenter">
              <img :src="feiwei" />
            </li>
          </ul>
      </div>
    </div>
    <van-collapse v-model="orderDetails" :accordion="true" :border="false" class="trajCollapse">
      <van-collapse-item title="船舶轨迹" name="1" class="order-title">
        <!-- 搜索框 -->
        <div class="searchWrap">
          <van-row class="aic">
            <van-col span="20" class="fontSize30 color3 aic">
              <span class="">时间查询</span>
              
              <van-button type="default" size="small" v-for="(item,index) in filterBtns" :key="index" :disabled="index==2?true:false"
                class="pl20 pr20 marginLeft" :color='btnActive == item.status ?"#1989fa":""'
                @click="filterBtnClick(item,index)">
                {{item.name}}
              </van-button>
            </van-col>
            <van-col span="4" class="text-right aic">
              <van-button size="small" type="info" @click="search" :disabled="btnActive||searchValue?false:true" style="width:100%">查询</van-button>
            </van-col>
          </van-row>
          <div class="mt10 search_field">
            <van-row class="aic">
              <van-col span="20 aic">
                <van-field readonly clickable name="calendar" :value="searchValue" label="" placeholder="选择时间"
                  @click="showCalendar = true">
                </van-field>
              </van-col>
              <van-col span="4" class="text-right aic">
                <van-button size="small" type="info" @click="reset" style="width:100%">重置</van-button>
              </van-col>
            </van-row>
            <van-calendar type="range" :max-range="30" v-model="showCalendar" @confirm="dateOnConfirm" color="#024ee0"
              :min-date="minDate" :max-date="maxDate" :default-date="isReset?null:range"/>
          </div>
        </div>
        <div class="orderStatus mt20 pl20">
          <van-pull-refresh v-model="isLoading" @refresh="onRefresh">
            <div class="text-center" v-if="noData">暂无数据</div>
            <van-list v-if="stepList.length>0" v-model="loading" :finished="finished" :immediate-check="false"
              :offset="10" finished-text="我也是有底线的" @load="onLoad">
              
              <div class="flex stepContent" v-for="(item, index) in stepList" :key="index"
                :class="index==0?'ship-active':''">
                <div class="stepdiv">
                  <span class="childradius mr20" v-if="index==0"></span>
                  <span v-else class="mr30"></span>
                  <span class="ship-text van-ellipsis shipNameWidth">{{item.port}}</span>
                </div>
                <span class="ship-time">{{item.createTime}}</span>
              </div>
            </van-list>
          </van-pull-refresh>
 
        </div>
      </van-collapse-item>
    </van-collapse>
  </div>
</template>