[Leaflet] Map CRS origin wijzigen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • MrDummy
  • Registratie: April 2000
  • Laatst online: 25-07 12:00

MrDummy

Nog steeds gek op anime...

Topicstarter
Hallo,

Ik heb diverse examples bekeken hoe ik CRS origin kan aanpassen bij een andere map.
Helaas ben ik niet goed uitgekomen met Leaflet. Wel heb ik gevoel dat ik Project4Leaflet moet gebruiken, want met stukje code center:[x,y] werkt niet.

Ik leg even uit met plaatjes:
Afbeeldingslocatie: https://i.imgur.com/qCnihQr.png
Wat je ziet is uitkomst als je van map wisselt. De 0,0 punt blijft op dezelfde plek, en map begint ook linksonder. Dat zie je als je markers gebruikt. Het blijft aan de linkerkant staan.

Maar de map image#2 overzicht is niet hetzelfde als map image #1. Het is zelf groter maar gebied is wel opgeschoven (meer toegevoegd aan linkerkant en bovenkant dus)

Afbeeldingslocatie: https://i.imgur.com/ZWQOtSH.png
De juiste positie tov gebieden in beide mappen is hier afgebeeld. De groene map image #1 staat ongeveer waar map image #2 ook toont qua gebied. Omdat map image#2 eigenlijk opschuift ten opzichte van map image #1 dient de 0,0 punt, de origin van CRS, ook opgeschoven worden.

Met pixels correctie kan ik doen met map.project en map.unproject uitwisseling.

Van een site heb ik code voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var customCRS = new L.Proj.CRS.TMS('EPSG:900913',
    '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0' + 
    '+x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs', 
    [6422198.546, -851225.043, 196550.197, 9691950.164], 
    {
        origin: [-851225.043, 6422198.546],
        resolutions: [6386.233628906251,
            3193.1168144531257,
            1596.5584072265628,
            798.2792036132814,
            399.1396018066407,
            199.56980090332036,
            99.78490045166018,
            49.89245022583009
        ]
    }
);

var ljs_map = new L.Map('ljs_map', {
    crs: customCRS
});

var layer = new L.Proj.TileLayer.TMS('http://url.to.the/layer/{z}/{x}/{y}.png', customCRS, {
    maxZoom: 7,
    minZoom: 0,
    tileSize: 512
});

ljs_map.addLayer(layer);
ljs_map.setView([51, 0], 7);


De eerste regel ziet er echter niet simpel uit, er moeten juiste waarden ingevuld worden. Ook merk ik op dat waarden bij elke zoom ingesteld moet worden. Misschien zijn het dezelfde resolutie waarden voor elke zoom level. Hoe kan ik uitrekenen? De CRS in map image#1 is ongewijzigd en dat mag dus overgenomen worden voor correctie van map image#2 gebruik.
Ik heb zelf zoomlevel 2 tot 7. De map verhoudingen zijn exact, er is alleen meer gebied toegevoegd in map image#2.

Zelf heb ik deze voor map #1
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
var map = new L.map('right');
var bdoUrl = 'images/map/{z}/{x}/{y}.png';
var bdo = new L.TileLayer(
            bdoUrl, {
            tms: true,
            // crs: L.CRS.Simple,
            continuousWorld: false,
            maxZoom: 7,
            minZoom: 3
            }
        );
map.addLayer(bdo);
map.setView(new L.LatLng(-39.3683,-67.5), 3);


Wie kan me helpen wat de juiste code om boel weer goed te zetten met image#2? Ik weet ongeveer waar ik moet zijn, maar goed uitrekenen weet ik niet zo zeker, en ik ben dus bang dat ik veel tijd ga prutsen (heb al vroeger gedaan en dat wil ik niet weer meemaken).
Ook juiste EPSG is nodig want er zijn meerdere verdelingen mogelijk. Wat gebruikt standaard CRS zelf?

Er zijn voorbeelden maar niet eentje die goed uitlegt. Zeker niet als het om map wissel gaat.
Dus ik zit beetje vast op dit moment. Ik heb even goede hint nodig maar code example is ook nuttig zodat ik kan testen of er resultaat is. Dan kan ik verder verbeteren en optimaal afstemmen.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 12:10
De standaard EPSG code die gebruikt wordt is Web Mercator, wat een afgeleidde is van WGS84.

Voor een alternatieve projectie of CRS kun je het beste Proj4 gebruiken met de juiste definitie. Die kan eventueel afgeleid worden van een andere projectie, maar dan met aan nieuw origin. In dit antwoord zie je een voorbeeld van het Britse Kadaster wat nagenoeg hetzelfde doet als jij wilt bereiken.

Zoals je ook in het voorbeeld/antwoord ziet kun je cs2cs gebruiken vanuit GDAL om het e.e.a. te controleren. Maar dat kan natuurlijk ook met een Javascript reload.

Met betrekking tot de zoom levels, ook de resoluties zijn uit te rekenen, maar maakt het er niet eenvoudiger op. Mocht je tile source gewoon WGS84 serveren, dan zou ik gewoon de standaard resoluties aanhouden.

Zoek ook even of je eventueel gewoon een standaard CRS kunt gebruiken, dat maakt het er vaak een stuk gemakkelijker op.

[small]
De door jouw gebruikte EPSG:900913 is hetzelfde als EPSG:3857, maar gebruikt een verouderde, onofficiële EPSG-code.

Acties:
  • 0 Henk 'm!

  • MrDummy
  • Registratie: April 2000
  • Laatst online: 25-07 12:00

MrDummy

Nog steeds gek op anime...

Topicstarter
Bedankt voor uitleg, maar het is nog niet eenvoudiger op.

De CRS is gewoon hetzelfde op beide mappen, dus zoomlevels en schaal zijn identiek. Vanwege extra map delen in 2e map is het groter geworden. Dit heeft als gevolg dat origin punt van CRS op de verkeerde plek staat. Dus dat moet opgeschoven worden, een offset, meer is er niet nodig.

Dat er zoveel werk is voor alleen 0,0 opschuiven verbaast me wel. Zit het niet gewoon in Leaflet script? Map opschuiven is toch bekende voorbeeld.
Bijvoorbeeld dat 0,0 in linker bovenhoek punt moet staan of precies in het midden. Of op de gewenste punt in de map. Bij mijn geval moet het op exacte punt staan in de map, op een vaste locatie.

De code bovenaan is een voorbeeld van site, want dit wordt ook aantal keren aangegeven in aantal examples. Maar latlng moet wel gelijk zijn aan eerste map met standaard CRS opzet.

[ Voor 11% gewijzigd door MrDummy op 14-01-2017 21:11 ]


Acties:
  • 0 Henk 'm!

  • Nico Klus
  • Registratie: November 2003
  • Laatst online: 10:20
Volg je eerste voorbeeld en pas +x_0 +y_0 voor je 2de kaart.
Dat zou moeten werken. Het gaat zo ingewikkeld omdat de verschuiving niet op de platte kaart gaat, maar op de gemodelleerde bol/ellips van de aarde.

Aan dit bericht kunnen geen rechten ontleend worden.