3

I am working on a solution to download map tiles based on given location:(latitude, longitude) and zoom level

Followed https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

The key concept is to convert (latitude, longitude) to tile reference, eg. javascript code:

function long2tileX(lon,zoom) { return (Math.floor((lon+180)/360*Math.pow(2,zoom))); }

function lat2tileY(lat,zoom) { return (Math.floor((1-Math.log(Math.tan(lat*Math.PI/180) + 1/Math.cos(lat*Math.PI/180))/Math.PI)/2 *Math.pow(2,zoom))); }

For sample location (63.433772, 10.393456) and zoom level (17) this formulas return (69320, 35421) which is exactly what's needed to get the tile:

https://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom=17&x=69320&y=35421

Now I am struggling to achieve the same with ArcGIS maps. The following CRS object is supplied:

{ "Name":"Geocache Basis", "Crs":{ "Resolutions":[ 21674.7100160867, 10837.355008043351, 5418.6775040216753, 2709.3387520108377, 1354.6693760054188, 677.33468800270941, 338.66734400135471, 169.33367200067735, 84.666836000338677, 42.333418000169338, 21.166709000084669, 10.583354500042335, 5.2916772500211673, 2.6458386250105836, 1.3229193125052918, 0.66145965625264591, 0.33072982812632296, 0.16536491406316148 ], "OriginX":-2500000.0, "OriginY":9045984.0, "Srid":"EPSG:32633", "Definition":"+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs" }, "Attribution":"Kartverket, Geovekst og kommuner - Geodata AS", "MapProvider":"arcgis" }

Tried to use proj4 and define EPSG:32633 with 'Definition' field value, then do a projection, but that didn't get me anywhere close to calculating the respective tile coordinates, which I experimentally determined to be (47333, 65439) https://services.geodataonline.no/arcgis/rest/services/Geocache_UTM33_WGS84/GeocacheBasis/MapServer/tile/17/47333/65439

I'd appreciate any hint on what mathematical formula I can apply to follow the same scenario and get the accurate result.

Kishan Patel
  • 778
  • 11
  • 26
  • 1
    Did you find a solution to your question? I am running in the same problem. – theDrifter Oct 08 '19 at 13:43
  • 2
    The solution i figured out is to use built-in leaflet methods. If you create new map instance with georefrence (CRS) then you can use `mapInstance.options.crs.latLngToPoint` method to convert lat lon to points. Then using this points you can create bounds also with leaflet's `new Bounds()` method. Then with these bounds you ccarry on the same way as with OSM – Irek Zuchowski Oct 11 '19 at 12:07

0 Answers0