view.goTo карта отображает пустой Arcgis - PullRequest
1 голос
/ 20 апреля 2020

Я работаю над картой arcgis, пытаюсь обновить центр карты, вызывая goTo () в моем виде карты, но по какой-то причине карта просто меняется на пустую и никогда не обновляется, я записываю новые координаты и они правильные.

Я использую справочные документы здесь: https://developers.arcgis.com/javascript/latest/api-reference/esri-views-MapView.html

Может ли кто-нибудь с некоторым опытом ArcGIS помочь мне. Я знаю, что это не проблема с моим кодом, но это может быть проблема с vue и рендерингом компонентов, так как я до сих пор пытался - избавиться от подпорок и обновить все, что есть в arcgis

компонент локально - используя клавиши для принудительного повторного рендеринга компонента

в качестве интересной заметки, если я просто введу несколько магических чисел c для моего нового местоположения, карта обновится правильно, однако, когда я использую какую-то функцию чтобы получить местоположение и затем передать его, оно не работает и просто показывает как пустую карту

мое приложение. vue

<template>
    <div id="app">
        <web-map v-bind:centerX="lat" v-bind:centerY="long" ref="map"/>

        <div class="center">
          <b-button class="btn-block" @click="updateCenter()" variant="primary">My Location</b-button>
        </div>
    </div>


</template>

<script>
import WebMap from './components/webmap.vue';

export default {
    name: 'App',
    components: { WebMap }, 
    data(){
      return{
        lat: null,
        long: null,
      }
    },
    methods:{
      updateCenter(){
        this.$refs.map.getLocation()
      }
    },
};
</script>

компонент моей карты

<template>
  <div></div>
</template>

<script>
import { loadModules } from 'esri-loader';

export default {
  name: 'web-map',
  data: function(){
    return{
      X: -118,
      Y: 34,

    }
  },
  mounted() {
    console.log('new data',this.X,this.Y)

    // lazy load the required ArcGIS API for JavaScript modules and CSS
    loadModules(['esri/Map', 'esri/views/MapView'], { css: true })
    .then(([ArcGISMap, MapView]) => {
      const map = new ArcGISMap({
        basemap: 'topo-vector'
      });

      this.view = new MapView({
        container: this.$el,
        map: map,
        center: [-118,34],   ///USE PROPS HERE FOR NEW CENTER
        zoom: 8
      });
    });
  },
  beforeDestroy() {
    if (this.view) {
      // destroy the map view
      this.view.container = null;
    }
  },


  methods:{
    showPos(pos){
        console.log('new location',pos.coords.latitude,pos.coords.longitude) 
        this.view.goTo({center:[pos.coords.latitude,pos.coords.longitude]})  
      },


      getLocation(){
        if (navigator.geolocation) {
              navigator.geolocation.getCurrentPosition(this.showPos);
          } else { 
            console.log("Geolocation is not supported by this browser.");
          }
      },
  }

};

</script>

1 Ответ

0 голосов
/ 20 апреля 2020

Вот кое-что, что работает:

https://codesandbox.io/s/frosty-glitter-39wpe?file= / src / App. vue

Я сделал это с нуля, взяв лишь небольшие кусочки от вашего и объединяя их с некоторыми примерами из ArcGIS (с которыми я вообще не знаком).

Следует отметить, что .goTo({center: [lat, long]}) не работал должным образом: он продолжал центрироваться в середине немного океана.
Затем я импортировал Point из esri и передал center как new Point(long, lat), что, похоже, дает ожидаемый результат. Так как это работает, я не смотрел дальше, но я думаю, что это должно быть выполнимо без преобразования. Возможно, вам нужно передать систему координат или что-то в этом роде.

Насколько я могу судить, в вашем примере неправильно то, что вы пытаетесь передать данные от родителя к потомку. Вы ожидаете, что this.$refs.map будет Vue экземпляром, но это не так. Это элемент DOM. Это в основном Vue экземпляр $el. Доступ к дочерним методам из родительского экземпляра не так прост. Еще одна вещь, на которую стоит обратить внимание: даже если вы в своем примере привязываете centerX и centerY к child, вы, похоже, никогда не будете их использовать (но я полагаю, что это просто остаток, когда вы пытались использовать реквизит!?).

В любом случае, в моем примере я решил просто обновить реквизиты координат детей, имея watch fn для обработки повторного центрирования.

...