Zoom issue between OpenLayers 6.4.3 and AGM (Angular Google Maps)

520 views Asked by At

Before my update to OpenLayers 6.4.3 AGM (Angular Google Maps) and OpenLayers stayed in sync through loading, zooming, and panning...now the layers are operating out of sync with the OpenLayers vector layer moving faster than the AGM layer.

SHARED VALUES:

 export class MapValues {
 public static view: any = null;
 public static googleLat = 0;
 public static googleLng = 0;
 public static googleZoom = 5;
 public static map: olMap = null;
 };
     

CREATE MAP:

createMap() {
    MapValues.view = new View({
        center: [MapValues.googleLng, MapValues.googleLat],
        zoom: MapValues.googleZoom,
        projection: 'EPSG:3857',
        maxZoom: 20,
        minZoom: 5
    });
    let map = new olMap({
        interactions: defaultInteractions({
        doubleClickZoom: false,
        dragPan: false,
        altShiftDragRotate: false,
        shiftDragZoom: false
        }),
        target: 'map',
        view: MapValues.view,
        controls:[]
       });
      }
  

ALIGN MAP:

  alignMap() {
     MapValues.view.on('change:center', function () {
     MapValues.mapCenter = transform(MapValues.view.getCenter(), 'EPSG:3857', 'EPSG:4326');
     MapValues.googleLat = MapValues.mapCenter[1];
     MapValues.googleLng = MapValues.mapCenter[0];
     });
     MapValues.view.on('change:resolution', function () {
     MapValues.googleZoom = MapValues.view.getZoom();
     });
  }

So whenever the map is panned or zoomed "alignMap" is called and before OpenLayers 6.4.3 all vector objects were perfectly aligned after...no vector objects are aligned...

UPDATE:

Seems like "Transform" may not be working as it did previously...the more I look at this problem the more apparent that there is a projection conflict here between OpenLayers and AGM.

UPDATE:

The issue is definitely a zoom problem where the further away from a whole integer you get the worse the misalignment is.

I've created a StackBlitz here to demostrate the problem. Just use the "Draw" button and the top to trace one of the fields. Click "Stop Drawing" and pan the map.

https://stackblitz.com/edit/angular-openlayer-play-n5brr8?file=src%2Fapp%2Fapp.component.ts

Any help is greatly appreciated.

1

There are 1 answers

0
Funn_Bobby On BEST ANSWER

So for those looking for a solution to this...

When creating the map add these parameters.

constrainResolution: true,
smoothResolutionConstraint: false,

So it would look like this.

createMap() {
MapValues.view = new View({
    center: [MapValues.googleLng, MapValues.googleLat],
    zoom: MapValues.googleZoom,
    projection: 'EPSG:3857',
    maxZoom: 20,
    minZoom: 5,
    constrainResolution: true,
    smoothResolutionConstraint: false,
});
let map = new olMap({
    interactions: defaultInteractions({
    doubleClickZoom: false,
    dragPan: false,
    altShiftDragRotate: false,
    shiftDragZoom: false
    }),
    target: 'map',
    view: MapValues.view,
    controls:[]
   });
  }

Try it in the stack blitz listed above and see the fix.