Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript OpenLayers-在地图视图上调用setZoom()后,getCoordinateFromPixel的返回值保持不变_Javascript_Typescript_Gis_Openlayers_Openlayers 5 - Fatal编程技术网

Javascript OpenLayers-在地图视图上调用setZoom()后,getCoordinateFromPixel的返回值保持不变

Javascript OpenLayers-在地图视图上调用setZoom()后,getCoordinateFromPixel的返回值保持不变,javascript,typescript,gis,openlayers,openlayers-5,Javascript,Typescript,Gis,Openlayers,Openlayers 5,我有一个用例,我想确定某些坐标是否位于视口中可见的视图部分内。我们的方法是首先使用地图的getCoordinateFromPixel方法获取一些像素的坐标。这是可行的,但问题是我们还希望以编程方式放大。我们注意到,使用完全相同的参数在地图上调用getCoordinateFromPixel,在地图视图上调用setZoom前后返回完全相同的结果。奇怪的是(?)我们还注意到,当我们在两次调用地图上的getCoordinateFromPixel之间手动放大时,结果确实发生了变化 以这个脚本为例: imp

我有一个用例,我想确定某些坐标是否位于视口中可见的视图部分内。我们的方法是首先使用地图的getCoordinateFromPixel方法获取一些像素的坐标。这是可行的,但问题是我们还希望以编程方式放大。我们注意到,使用完全相同的参数在地图上调用getCoordinateFromPixel,在地图视图上调用setZoom前后返回完全相同的结果。奇怪的是(?)我们还注意到,当我们在两次调用地图上的getCoordinateFromPixel之间手动放大时,结果确实发生了变化

以这个脚本为例:

import 'ol/ol.css';
import Map from 'ol/Map';
import View from 'ol/View';
import VectorLayer from 'ol/layer/Vector';
import VectorSource from 'ol/source/Vector';
import GeoJSON from 'ol/format/GeoJSON';
import Feature from 'ol/Feature';

let markerView = new View({
    center: [5000, 1000],
    zoom: 2,
});

let map = new Map({
  target: 'map-container',
  layers: [
    new VectorLayer({
      source: new VectorSource({
        format: new GeoJSON(),
        url: './data/countries.json'
      }),
    })
  ],
  view: markerView
});

window.setTimeout(() => {
    console.log(JSON.stringify(map.getCoordinateFromPixel([0, 0])));
    map.getView().setZoom(5);
}, 2000);
window.setTimeout(() => {
    console.log(JSON.stringify(map.getCoordinateFromPixel([0, 0])));
}, 4000);
当在OpenLayers项目中执行此操作时,2000毫秒后运行的闭包将在控制台上打印与4000毫秒后运行的闭包完全相同的内容,尽管我们已经非常显著地放大了

我想知道是否有人知道解决方法、修复方法或原因。我已经尝试查看映射触发的事件,以便在处理程序中重新执行getCoordinateFromPixel,但是我还没有发现当我们(以编程方式)更改缩放时映射触发的事件

如果需要,我很乐意提供更多细节

提前多谢了


Joshua

如果您具有范围和贴图大小,则可以轻松计算像素的坐标,而无需依赖
GetCoordinateCompix
,因为某些原因,它不会立即更新(它已通过预合成事件更新)。在x坐标上有一个小的差异(800万范围内约100米),但不足以显著

map.getView().on(['change:resolution','change:center'], function() {
  var size = map.getSize();
  var extent = this.calculateExtent(size);
  var coordinate = [
    extent[0] + (extent[2]-extent[0]) * pixel[0]/size[0],
    extent[1] + (extent[3]-extent[1]) * (size[1]-pixel[1])/size[1]
  ];
  console.log(JSON.stringify(extent));
  console.log(JSON.stringify(coordinate));  // as expected
  console.log(JSON.stringify(map.getCoordinateFromPixel(pixel)));  // hasn't been updated
});


当我运行脚本时,不会发生这种情况。结果随地图大小的不同而不同,因此记录
map.getSize()
I get
[1664832]
[-32560951.05703251816280475.528516259]
[-4065226.9123188142035059.4410645324]
要侦听对可见视口的更改,请在视图
map.getView()上(['change:resolution','change:center'],function(){console.log(JSON.stringify(this.calculateExtent());})上侦听
change:resolution
change:center
map.getCoordinateFromPixel
的结果似乎没有更新。我也得到了这个结果。像素[0,0]开始匹配范围的左上角。然后触发范围更改,但像素的坐标没有更改。但2秒后,已更改为接近(但不完全接近)新范围的左上角<代码>[1664832]
[-32555951.05703252,-16279475.5285162632565951.0570325216281475.52851626]
[-32560951.05703251816280475.528516259]
[-4065118.882129065,-.2034059.441064532647118.8821290652036059.44106454532626]
<32560951.057018162805[-4065226.9123188142035059.4410645324]
Hmm,很有趣。当我在贴图的postrender事件的处理程序中调用GetCoordinates FromPixel时(这似乎也是在我以编程方式放大后执行的),我得到了一个不同的值。当我设置超时以在该处理程序中调用getCoordinateFromPixel时,我似乎也得到了一致的结果。我将对此进行更深入的测试,并在我进一步了解的情况下更新此线程
map.getView().on(['change:resolution','change:center'], function() {
  map.once('precompose', function() {
    console.log(JSON.stringify(map.getCoordinateFromPixel(pixel)));
  });
});