- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经使用自定义 CRS (EPSG:32633) 设置了传单 map 。该 map 通常运行良好,但每当我尝试在移动设备上使用捏合来缩放 map 时它就会卡住。
双指缩放时出现的错误是“未捕获错误:无效的 LatLng 对象:(NaN, NaN)”。
这是一个可用于重现问题的 jsfiddle:
http://jsfiddle.net/thL5bbnv/2/
这是代码(也在 jsfiddle 中使用):
// Defining the projection system
L.Projection.UTM33 = {
ZONE: 33,
R_MINOR: 6356752.3142,
R_MAJOR: 6378137,
DEG_TO_RAD: Math.PI / 180,
RAD_TO_DEG: 180 / Math.PI,
bounds: L.bounds([-2500000, 3500000], [3045984, 9045984]),
project: function(latlng) {
var latRad = latlng.lat * this.DEG_TO_RAD,
longRad = latlng.lng * this.DEG_TO_RAD,
longOriginRad = (-183 + (6 * this.ZONE)) * this.DEG_TO_RAD,
eccs = 1 - ((this.R_MINOR / this.R_MAJOR) * (this.R_MINOR / this.R_MAJOR)),
k0 = 0.9996,
eccps = eccs / (1 - eccs),
n = this.R_MAJOR / Math.sqrt(1 - eccs * Math.sin(latRad) * Math.sin(latRad)),
t = Math.tan(latRad) * Math.tan(latRad),
c = eccps * Math.cos(latRad) * Math.cos(latRad),
a = Math.cos(latRad) * (longRad - longOriginRad),
m = this.R_MAJOR * ((1 - eccs / 4 - 3 * eccs * eccs / 64 - 5 * eccs * eccs * eccs / 256) * latRad - (3 * eccs / 8 + 3 * eccs * eccs / 32 + 45 * eccs * eccs * eccs / 1024) * Math.sin(2 * latRad) + (15 * eccs * eccs / 256 + 45 * eccs * eccs * eccs / 1024) * Math.sin(4 * latRad) - (35 * eccs * eccs * eccs / 3072) * Math.sin(6 * latRad)),
x = k0 * n * (a + (1 - t + c) * a * a * a / 6 + (5 - 18 * t + t * t + 72 * c - 58 * eccps) * a * a * a * a * a / 120) + 500000.0,
y = k0 * (m + n * Math.tan(latRad) * (a * a / 2 + (5 - t + 9 * c + 4 * c * c) * a * a * a * a / 24.0 + (61.0 - 58 * t + t * t + 600.0 * c - 330.0 * eccps) * a * a * a * a * a * a / 720));
return new L.Point(x, y);
},
unproject: function(point) {
var eccs = 1 - ((this.R_MINOR / this.R_MAJOR) * (this.R_MINOR / this.R_MAJOR)),
e1 = (1 - Math.sqrt(1 - eccs)) / (1 + Math.sqrt(1 - eccs)),
k0 = 0.9996,
x = point.x - 500000,
y = point.y,
longOrigin = (this.ZONE - 1) * 6 - 180 + 3,
eccps = (eccs) / (1 - eccs),
m = y / k0,
mu = m / (this.R_MAJOR * (1 - eccs / 4 - 3 * eccs * eccs / 64 - 5 * eccs * eccs * eccs / 256)),
phi1Rad = (mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + (151 * e1 * e1 * e1 / 96) * Math.sin(6 * mu)),
n1 = this.R_MAJOR / Math.sqrt(1 - eccs * Math.sin(phi1Rad) * Math.sin(phi1Rad)),
t1 = Math.tan(phi1Rad) * Math.tan(phi1Rad),
c1 = eccps * Math.cos(phi1Rad) * Math.cos(phi1Rad),
r1 = this.R_MAJOR * (1 - eccs) / Math.pow(1 - eccs * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5),
d = x / (n1 * k0),
lng = ((longOrigin * this.DEG_TO_RAD + ((d - (1 + 2 * t1 + c1) * d * d * d / 6 + (5 - 2 * c1 + 28 * t1 - 3 * c1 * c1 + 8 * eccps + 24 * t1 * t1) * d * d * d * d * d / 120) / Math.cos(phi1Rad))) * this.RAD_TO_DEG),
lat = ((phi1Rad - (n1 * Math.tan(phi1Rad) / r1) * (d * d / 2 - (5 + 3 * t1 + 10 * c1 - 4 * c1 * c1 - 9 * eccps) * d * d * d * d / 24 + (61 + 90 * t1 + 298 * c1 + 45 * t1 * t1 - 252 * eccps - 3 * c1 * c1) * d * d * d * d * d * d / 720)) * this.RAD_TO_DEG);
return new L.LatLng(lat, lng);
}
};
// Defining the utm crs
L.CRS.EPSG32633 = L.extend({}, L.CRS.Earth, {
code: "EPSG:32633",
projection: L.Projection.UTM33,
transformation: new L.Transformation(1, 2500000, -1, 9045984),
scale: function(zoom) {
return 1 / (21664 / Math.pow(2, zoom));
}
});
// Creating map with the utm crs
var map = new L.map('map', {
crs: L.CRS.EPSG32633,
minZoom: 0,
maxZoom: 15,
zoomControl: true
}).on("load", function(e) {
// Adding utm basemap
var layer = new L.TileLayer.WMS('https://opencache.statkart.no/gatekeeper/gk/gk.open', {
layers: "topo2",
format: "image/png",
transparent: false,
attribution: "© Kartverket"
});
layer.addTo(e.target);
}).setView([65.276178, 16.683775], 3);
更新:这是我遇到的错误的堆栈跟踪:
Uncaught Error: Invalid LatLng object: (NaN, NaN)
at o.LatLng (https://unpkg.com/leaflet@1.0.2/dist/leaflet.js:5:14154)
at Object.unproject (http://fiddle.jshell.net/thL5bbnv/2/show/:105:12)
at Object.pointToLatLng (https://unpkg.com/leaflet@1.0.2/dist/leaflet.js:5:18431)
at e.unproject (https://unpkg.com/leaflet@1.0.2/dist/leaflet.js:5:30126)
at e.layerPointToLatLng (https://unpkg.com/leaflet@1.0.2/dist/leaflet.js:5:30242)
at e._fireDOMEvent (https://unpkg.com/leaflet@1.0.2/dist/leaflet.js:6:3634)
at e._handleDOMEvent (https://unpkg.com/leaflet@1.0.2/dist/leaflet.js:6:3071)
at HTMLDivElement.h (https://unpkg.com/leaflet@1.0.2/dist/leaflet.js:6:11270)
at e._simulateEvent (https://unpkg.com/leaflet@1.0.2/dist/leaflet.js:8:31479)
at e._onMove (https://unpkg.com/leaflet@1.0.2/dist/leaflet.js:8:31242)o.LatLng @ leaflet.js:5unproject @ (index):105pointToLatLng @ leaflet.js:5unproject @ leaflet.js:5layerPointToLatLng @ leaflet.js:5_fireDOMEvent @ leaflet.js:6_handleDOMEvent @ leaflet.js:6h @ leaflet.js:6_simulateEvent @ leaflet.js:8_onMove @ leaflet.js:8h @ leaflet.js:6
leaflet.js:5 Uncaught Error: Invalid LatLng object: (NaN, NaN)(…)o.LatLng @ leaflet.js:5unproject @ (index):105pointToLatLng @ leaflet.js:5unproject @ leaflet.js:5layerPointToLatLng @ leaflet.js:5_fireDOMEvent @ leaflet.js:6_handleDOMEvent @ leaflet.js:6h @ leaflet.js:6_simulateEvent @ leaflet.js:8_onMove @ leaflet.js:8h @ leaflet.js:6
我想了解为什么双指缩放失败,以及我可以做些什么来解决这个问题。有谁知道为什么在使用自定义投影时捏合缩放会导致 Invalid LatLng object: (NaN, NaN) ?
最佳答案
好的,所以我将问题追溯到对 map.getScaleZoom()
的调用:
该函数直接依赖于 map 的 CRS 的 scale
方法,您已将其定义为
scale: function(zoom) {
return 1 / (21664 / Math.pow(2, zoom));
}
现在,CRS 的scale
方法必须实现CRS 的zoom
方法的inverse。它在Leaflet API documentation for L.CRS
中这样说.
您没有在 L.CRS.EPSG32633
中定义 zoom
方法,但是...
L.CRS.EPSG32633 = L.extend({}, L.CRS.Earth, {
...您正在使用 L.CRS.Earth.zoom()
。因此,如果 scale(zoom(x))
对于 x
的任何值都不为 1,那么事情就会失败。首先,缩放级别从 1.01 跳到 -19.4。然后,LatLng
获得 1e+233
的值。然后你的投影代码接受它并开始喷出 Infinity
和 NaN
,一切都在火焰中结束。
修复L.CRS.EPSG32633
方法的scale
和zoom
,使它们是幂等的。
不管这个错误,我鼓励你使用Proj4Leaflet 而不是自己实现投影代码。它经过测试和维护,并且支持所有已知的 EPSG 预测和 CRS。
关于javascript - 为什么双指缩放在传单中的自定义 crs 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40781644/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!