我在Angular上使用openlayers来显示带有here-api作为地图图块提供程序的地图。Openlayers 6.1.1 Angular 8.0.0
但是,当页面加载时,地图不会填满整个宽度。
这发生在适用于 Windows (PC) 的 Edge 和 Chrome 以及 Android 的 Chrome 上。
在 Windows 中,只有在调整浏览器窗口大小时,地图才会使用整个宽度。
在 Android 中,当地图从视图中滚动出来并重新回到视图中时,宽度会被填充。
下面的屏幕截图演示了调整浏览器大小之前和之后地图的外观。
初始显示上的部分宽度图
调整窗口大小后地图使用全宽
我的 Angular 组件映射配置如下所示:
addCommonProjections();
this.source = new XYZ({
url: 'https://{1-4}.base.maps.ls.hereapi.com' +
'/maptile/2.1/maptile/newest/normal.day/{z}/{x}/{y}/512/png?apiKey=someApiKey',
attributions: 'Map Tiles © ' + new Date().getFullYear() + ' developer.here.com'
});
this.layer = new TileLayer({
source: this.source
});
this.view = new View({
center: fromLonLat([this.property.longitude, this.property.latitude ]),
zoom: 16
});
this.map = new Map({
target: …Run Code Online (Sandbox Code Playgroud) OpenLayers 库是否提供了一种为添加到地图的图层分配/获取唯一标识符的方法,或者我应该自己实现它?
这个问题源于我需要唯一标识添加到地图中的各种类型的图层(主要是 LayerGroup 和 TileLayer),并为我在类似内容表的 DIV 中并行创建的每个图层提供相同的引用 id(就像ol-layerswitcher一样)。这样我就能够唯一地识别地图中的图层/图层组及其 DOM 上下文(我可以在其中控制其可见性、缩放等)。
我认为类似的东西会存在,因为它看起来相当重要,但我似乎无法在文档中而不是 API 中找到它。
这个问题与我的另一个问题相关,我基本上假设不存在为层分配/检索 id 的内置方法,并且我试图弄清楚如何扩展 OpenLayers 类和方法来实现和获取无论何时何地我需要这些属性。
I have following imports (in the same TS source file):
import {Vector as sourceVector} from "ol/source";
import {Vector} from "ol/layer";
Run Code Online (Sandbox Code Playgroud)
Here is how Vector is exported in ol/source:
export { default as Vector } from './source/Vector';
Run Code Online (Sandbox Code Playgroud)
And ol/layer:
export { default as Vector } from './layer/Vector';
Run Code Online (Sandbox Code Playgroud)
Is it possible to refactor imports somehow so it will look like this:
import {Vector as source.Vector} from "ol/source";
import {Vector as layer.Vector} from "ol/layer";
Run Code Online (Sandbox Code Playgroud)
Unfortunately I don't have any control over …
使用 OpenLayers 6.15.1,我可以在地图选项中使用以下代码:
controls: ol.control.defaults({
zoom: true,
attribution: true,
rotate: false
}),
Run Code Online (Sandbox Code Playgroud)
对于 OpenLayers 7.1,这不再起作用。我收到错误:
未捕获的类型错误:ol.control.defaults 不是函数
有谁可以向我解释我必须在代码中更改什么?我在 OpenLayers 官方在线文档中没有找到任何关于 ol/control/defaults 的明确内容可以解释此错误。
我们使用的是 openlayers,在 5.3 版本中我们使用的是这种结构:
map.once('postcompose', async(event) => {
let canvas = event.context.canvas;
// doing something with canvas
}
Run Code Online (Sandbox Code Playgroud)
但在 openLayers 6.0 中,事件的参数上下文未定义(这当然破坏了我们的应用程序)。
我在这里读到:
图层不再组成单个 Canvas 元素。相反,它们作为单独的元素添加到地图视口中。
那么如何获取单层的画布呢?
我还在这里读到:
画布上下文。当事件由地图调度时不可用。仅当使用 Canvas 渲染器时才可用,否则为 null。
是否可以以某种方式将画布渲染器设置为所有图层,以便 CanvasRenderingContext2D 不会为“postcompose”事件未定义?
我的问题很简单:如何在特定的经纬度添加标记?
通过打开图层示例页面,我创建了一个带有标记的新地图。
我使用 来添加标记,new ol.Feature但似乎无论我如何设置标记位置的坐标都不会改变。
请任何人都可以就为什么地图标记未显示在正确位置提供建议?
const iconFeature = new ol.Feature({
geometry: new ol.geom.Point([53, -2]), //This marker will not move.
name: 'Somewhere',
});
const map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM(),
}),
new ol.layer.Vector({
source: new ol.source.Vector({
features: [iconFeature]
}),
style: new ol.style.Style({
image: new ol.style.Icon({
anchor: [0.5, 46],
anchorXUnits: 'fraction',
anchorYUnits: 'pixels',
src: 'https://openlayers.org/en/latest/examples/data/icon.png'
})
})
})
],
view: new ol.View({
center: ol.proj.fromLonLat([53,-2]),
zoom: 6
}) …Run Code Online (Sandbox Code Playgroud)有关的OpenLayers 6.没有人知道是什么的OpenLayers 5和6的OpenLayers我读的东西之间的主要差别的即将发布快速的问题在这里,但其他问题出现了:
OpenLayers 6是否将完全重写库或某些现有功能(例如图层渲染和WebGL),这是真的吗?
是否可以轻松地从5.xx过渡到6.xx?
也有人可以解释即将到来的Vector Tiles实施对最终用户意味着什么(如果可能的话)
Openlayers的计划发布时间6.首先根据在线资源,计划于2019年2月底发布初始版本。有人知道新日期吗?
就是这样:)感谢您的时间和耐心:)
我正在尝试创建地图,正如我在其他网站和示例中看到的那样,每个人都可以通过鼠标单击和拖动来移动他们的地图。但是我的地图根本不会移动,有人知道我做错了什么吗?
这些是我正在使用的 components.ts 和 component.html 文件。我按照https://openlayers.org/en/latest/doc/tutorials/bundle.html 上的说明操作,没有安装 Parcel,因为我使用的是 angular。
地图组件.ts
ngOnInit(): void {
this.mapInit();
}
mapInit() {
var mousePositionControl = new MousePosition({
coordinateFormat: createStringXY(4),
projection: 'EPSG:4326',
// comment the following two lines to have the mouse position
// be placed within the map.
className: 'custom-mouse-position',
target: document.getElementById('mouse-position'),
undefinedHTML: ' '
});
var source = new OSM();
var overviewMapControl = new OverviewMap({
layers: [
new TileLayer({
source: source
})
]
});
this.map = new Map({
target: 'map',
interactions: defaultInteractions().extend([
new …Run Code Online (Sandbox Code Playgroud) 我有一张地图,上面有一些功能,当我缩放到这些功能时,用户可以设置缩放缓冲区的首选项。
我不确定 OL 中是否有内置的方法来执行此操作...我查看了文档,但看不到任何内容...不确定我是否错过了它?
zoomToSelectedFeatures() {
view.extent = MapOverlay.getSource().getExtent();
map.getView().fit(view.extent, MapValues.map.getSize());
}
Run Code Online (Sandbox Code Playgroud)
想知道是否有一种方法可以插入一个数字(例如 20%),从而使变焦放大 20%?
我对以下情况感到迷失。
我在 Android 应用程序中使用 OpenLayers 6。我有大约 4000 个 geoJson 功能要显示。它只是一个包含 4000 个特征的矢量图层。
对于其中的 3000 个,我必须设置一个单独的文本(所有这些文本在属性中都有一个唯一的 ID)
当我为每个功能创建一个样式而不缓存它们时,我的应用程序会崩溃,因为内存使用量增加到超过 2GB。当我创建样式并按功能 ID 缓存它们时,我仍然需要创建 3000 个样式,并且我的应用程序也会崩溃。
现在,当我按颜色缓存样式时,我得到 2 个样式。该应用程序运行良好,但现在我无法设置单独的文本,因为文本位于样式对象中,而我只有其中两个。
如果每个功能都有单独的样式(没有缓存或按 ID 缓存),这将是我的解决方案。
map.once('postrender', function(event) {
addStyle();
});
function addStyle() {
var vectorLayer;
var layersObject = map.getLayers();
for (var i = 0; i < layersObject.array_.length; i++) {
vectorLayer = layersObject.array_[i];
break;
}
var arrFeatures = vectorLayer.getSource().getFeatures();
var i = 0;
for (i; i <= arrFeatures.length - 1; i++) {
var feat = arrFeatures[i];
var myId …Run Code Online (Sandbox Code Playgroud) openlayers-6 ×10
openlayers ×8
javascript ×3
openlayers-5 ×2
angular ×1
angular9 ×1
canvas ×1
dictionary ×1
flexbox ×1
gis ×1
here-api ×1
openlayers-3 ×1
openlayers-7 ×1
typescript ×1
uuid ×1