Openlayers 如何下载地图选定部分的OSM磁贴

Openlayers 如何下载地图选定部分的OSM磁贴,openlayers,openstreetmap,openlayers-5,angular-openlayers,Openlayers,Openstreetmap,Openlayers 5,Angular Openlayers,我想使用Openlayer OSM layer以单缩放级别离线下载地图的选定部分。我得到了地图的四个角,即地图的显示部分 但是需要得到所有瓷砖的图像或这四个角之间的瓷砖。我回顾了一些例子: 但我需要下载客户按钮点击瓷砖。任何人都可以帮助我。这里有一个简单的示例,可以将磁贴保存为数据URL以供以后使用。如果需要保存的互动程序在关闭并重新打开浏览器后保持可用,请将sessionStorage替换为localStorage // load OSM zoom level 8 tiles for Sw

我想使用Openlayer OSM layer以单缩放级别离线下载地图的选定部分。我得到了地图的四个角,即地图的显示部分

但是需要得到所有瓷砖的图像或这四个角之间的瓷砖。我回顾了一些例子:


但我需要下载客户按钮点击瓷砖。任何人都可以帮助我。

这里有一个简单的示例,可以将磁贴保存为数据URL以供以后使用。如果需要保存的互动程序在关闭并重新打开浏览器后保持可用,请将sessionStorage替换为localStorage

// load OSM zoom level 8 tiles for Switzerland to data urls

var extent = ol.proj.transformExtent([5.9,45.8,10.55,47.85],'EPSG:4326','EPSG:3857');
var zoom = 8;

var source = new ol.source.OSM();

source.getTileGrid().forEachTileCoord(extent, zoom, function(tileCoord) {
    var img = document.createElement("img");
    img.onload = function() {
        var canvas = document.createElement("canvas");
        canvas.width = source.getTileGrid().getTileSize(zoom);
        canvas.height = source.getTileGrid().getTileSize(zoom);
        var ctx = canvas.getContext("2d");
        ctx.drawImage(img, 0, 0);
        sessionStorage.setItem('OSM_' + tileCoord[0] + '_' + tileCoord[1] + '_' + (-tileCoord[2]-1), canvas.toDataURL());
        img.remove();
        canvas.remove();
    };
    img.crossOrigin = "Anonymous";
    img.src = source.getTileUrlFunction()(tileCoord);
});

// wait a few seconds to ensure data urls are ready, then create a map to use them

setTimeout(function(){

    map = new ol.Map({
        target: 'map',
        layers: [
            new ol.layer.Tile({
                extent: extent,
                source: new ol.source.XYZ({
                    attributions: ol.source.OSM.ATTRIBUTION,
                    maxZoom: 8,
                    minZoom: 8,
                    tileUrlFunction: function(tileCoord) {
                        return sessionStorage.getItem('OSM_' + tileCoord[0] + '_' + tileCoord[1] + '_' + (-tileCoord[2]-1));
                    }
                }),
            })
        ],
        view: new ol.View({
            center: ol.extent.getCenter(extent),
            zoom: 8
        }),
        controls: ol.control.defaults({
            attributionOptions: { collapsible: false },
        })
    });

}, 3000);

您可以在C上编写简单的web客户端# 例如:

static void Main(string[] args)
        {
double[] latitudes= new double[] { 38.822591, 40.979898, 43.068888, 45.089036, 47.040182, 48.922499, 50.736455, 52.48278, 54.162434, 55.776573, 57.326521, 58.813742, 60.239811, 61.606397, 62.915233, 64.168107, 65.366837, 66.51326, 67.60922, 68.656555, 69.657086, 70.612614, 71.524909, 72.395706, 73.2267, 74.019543, 74.775843, 75.497157, 76.184995, 76.840817, 77.466029, 78.061989, 78.630006, 79.171334, 79.687184, 80.178713, 80.647035, 81.093214, 81.518272, 81.923187, 82.308893, 82.676285, 83.026219, 83.359512, 83.676943, 83.979259, 84.267172 };// see netzwolf.info kashebrowser
for (int kk = 0; kk < 45; kk++)
            {
                string currentToken = "546882";//osm token, you can view it in cookies
                String lat1 = "," + latitudes[kk] + ",";
                String lat2 = "," + latitudes[kk + 1];
                double long1= 18.671225;
                double deltaLong1 = 5.0104;// you can get in v
                for (i = 32; i < 48; i++)
                {

                    try
                    {
                        using (WebClient client = new WebClient())
                        {

                            String currentUrl = "https://render.openstreetmap.org/cgi-bin/export?bbox=" + long1.ToString() + lat1+ (long1+ deltaLat1).ToString() + lat2+ "&scale=4000000&format=svg";//format and scale
                            Console.WriteLine(currentUrl);
                            Uri url = new Uri(currentUrl);
                            client.Headers.Add(HttpRequestHeader.Authorization, "render.openstreetmap.org");
                            client.Headers.Add("method", "GET");
                            client.Headers.Add("scheme", "https");
                            client.Headers.Add(HttpRequestHeader.Accept, "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
                            //client.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
                            client.Headers.Add(HttpRequestHeader.AcceptLanguage, "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7");
                            client.Headers.Add(HttpRequestHeader.Cookie, "_osm_totp_token=" + currentToken);
                            client.Headers.Add("sec-ch-ua", "\"Chromium\";v=\"88\", \"Google Chrome\";v=\"88\", \"; Not A Brand\";v=\"99\"");
                            client.Headers.Add(HttpRequestHeader.Referer, "https://www.openstreetmap.org/");
                            client.Headers.Add("sec-fetch-dest", "document");
                            client.Headers.Add("sec-fetch-mode", "navigate");
                            client.Headers.Add("sec-fetch-site", "same-site");
                            client.Headers.Add("sec-fetch-user", "?1");
                            client.Headers.Add("upgrade-insecure-requests", "1");
                            client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36");
                            client.QueryString.Add("format", "svg");
                            Console.WriteLine(i);
                            client.DownloadFile(url, i.ToString() + "_" + kk.ToString() + ".svg");
                            long1+= deltaLong;

                        }
                    }
//if server drop, it wait 5 sec get token  again and get back one iteration
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                        System.Threading.Thread.Sleep(5000);
                        String currentUrl = "https://www.openstreetmap.org/#map=8/41.8368/104.5450&layers=N";
                        HttpWebRequest tQ = (HttpWebRequest)HttpWebRequest.Create(currentUrl);
                        tQ.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
                        tQ.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.41 YaBrowser/21.2.0.1097 Yowser/2.5 Safari/537.36";
                        tQ.ContentType = "text/html; charset=utf-8";
                        tQ.Referer = currentUrl;
                        HttpWebResponse tS = (HttpWebResponse)tQ.GetResponse();
                        string tC = tS.Headers["Set-Cookie"];
                        var cc = tC.IndexOf("_osm_totp_token=");
                        currentToken = tC.Substring(cc + "_osm_totp_token=".Length, 6);
                        //string num = tC.Trim(, 2);
                        Console.WriteLine(tC);
                        i = i - 1;
                    }

                    Console.WriteLine("i=" + i.ToString());
                }

            }
}
            
static void Main(字符串[]args)
{
双[]纬度=新双[]{ 38.822591, 40.979898, 43.068888, 45.089036, 47.040182, 48.922499, 50.736455, 52.48278, 54.162434, 55.776573, 57.326521, 58.813742, 60.239811, 61.606397, 62.915233, 64.168107, 65.366837, 66.51326, 67.60922, 68.656555, 69.657086, 70.612614, 71.524909, 72.395706, 73.2267, 74.019543, 74.775843, 75.497157, 76.184995, 76.840817, 77.466029, 78.061989, 78.630006、79.171334、79.687184、80.178713、80.647035、81.093214、81.518272、81.923187、82.308893、82.676285、83.026219、83.359512、83.676943、83.979259、84.267172};//参见netzwolf.info Kashbrowser
对于(int kk=0;kk<45;kk++)
{
string currentToken=“546882”//osm令牌,您可以在cookies中查看它
字符串lat1=“,”+纬度[kk]+“,”;
字符串lat2=“,”+纬度[kk+1];
双长1=18.671225;
double deltaLong1=5.0104;//您可以进入v
对于(i=32;i<48;i++)
{
尝试
{
使用(WebClient=newWebClient())
{
字符串currentUrl=”https://render.openstreetmap.org/cgi-bin/export?bbox=“+long1.ToString()+lat1+(long1+deltaLat1.ToString()+lat2+”&scale=4000000&format=svg;//格式和比例
Console.WriteLine(当前URL);
Uri url=新Uri(当前url);
client.Headers.Add(HttpRequestHeader.Authorization,“render.openstreetmap.org”);
client.Headers.Add(“方法”、“获取”);
client.Headers.Add(“scheme”、“https”);
client.Headers.Add(HttpRequestHeader.Accept,“text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed exchange;v=b3;q=0.9”);
//Add(HttpRequestHeader.AcceptEncoding,“gzip,deflate,br”);
client.Headers.Add(HttpRequestHeader.AcceptLanguage,“ru-ru,ru;q=0.9,en-US;q=0.8,en;q=0.7”);
client.Headers.Add(HttpRequestHeader.Cookie,“\u osm\u totp\u token=“+currentToken”);
client.Headers.Add(“sec ch ua”,“Chromium\”v=“88\”,“Google Chrome\”,v=“88\”,“非品牌”,v=“99\”);
client.Headers.Add(HttpRequestHeader.Referer,“https://www.openstreetmap.org/");
client.Headers.Add(“sec fetch dest”、“document”);
client.Headers.Add(“secfetchmode”、“导航”);
client.Headers.Add(“sec获取站点”、“相同站点”);
client.Headers.Add(“sec fetch user”,“1”);
client.Headers.Add(“升级不安全请求”,“1”);
client.Headers.Add(HttpRequestHeader.UserAgent,“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/88.0.4324.190 Safari/537.36”);
client.QueryString.Add(“格式”、“svg”);
控制台写入线(i);
client.DownloadFile(url,i.ToString()+“”+kk.ToString()+”.svg);
long1+=德尔塔隆;
}
}
//若服务器断开,它将等待5秒再次获取令牌并返回一次迭代
捕获(例外e)
{
控制台写入线(e);
系统线程线程睡眠(5000);
字符串currentUrl=”https://www.openstreetmap.org/#map=8/41.8368/104.5450&layers=N";
HttpWebRequest tQ=(HttpWebRequest)HttpWebRequest.Create(currentUrl);
tQ.Accept=“text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed exchange;v=b3;q=0.9”;
tQ.UserAgent=“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/88.0.4324.41 YaBrowser/21.2.0.1097 Yowser/2.5 Safari/537.36”;
tQ.ContentType=“text/html;charset=utf-8”;
tQ.Referer=currentUrl;
HttpWebResponse tS=(HttpWebResponse)tQ.GetResponse();
字符串tC=tS.Headers[“设置Cookie”];
var cc=tC.IndexOf(“\u osm\u totp\u token=”);
currentToken=tC.子字符串(cc+“_osm_totp_token=“.Length,6);
//字符串编号=tC.Trim(,2);
控制台写入线(tC);
i=i-1;
}
Console.WriteLine(“i=“+i.ToString());
}
}
}

互联网上已经有各种类似的问题和答案。为此,我使用了leadflet离线地图。