Openlayers 如何下载地图选定部分的OSM磁贴
我想使用Openlayer OSM layer以单缩放级别离线下载地图的选定部分。我得到了地图的四个角,即地图的显示部分 但是需要得到所有瓷砖的图像或这四个角之间的瓷砖。我回顾了一些例子: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
但我需要下载客户按钮点击瓷砖。任何人都可以帮助我。这里有一个简单的示例,可以将磁贴保存为数据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离线地图。