小编nuc*_*eon的帖子

如何在两组不规则数据之间插入点?

对于这个有点令人困惑的标题我很抱歉,但我不知道如何更清楚地总结这一点.

我有两组X,Y数据,每组都对应一般的整体值.它们是从原始数据中相当密集地采样的.我正在寻找的是一种为任何给定Y找到插值X的方法,用于我已经拥有的集合之间的值.

该图表使这一点更加清晰:

点图

在这种情况下,红线来自对应于100的集合,黄线来自对应于50的集合.

我希望能够说,假设这些集合对应于一个值的梯度(即使它们显然由离散的X,Y测量值组成),我如何找到,例如,如果Y为500,X将在何处对于一个相当于75的值的集合?

在这里的例子中,我希望我想要的点在这附近:

带插值点的点图

我不需要这个功能过于花哨 - 它可以是数据点的简单线性插值.我只是在思考它时遇到了麻烦.

注意,两组的Xs和Ys都不完全重叠.然而,说"这些集合中最接近的X点在哪里"或"这些集合中最接近的Y点在哪里"是相当微不足道的.

我已经在已知值之间使用了简单的插值(例如,对于设置"50"和"100",找到相应Y的X,然后将它们平均得到"75"),我最终会看到如下所示:

插值不太好

很明显我在这里做错了.显然,在这种情况下,对于Y高于"最低"集的最大Y的所有情况,X(正确地)返回0.事情开始很好,但是当一个人开始接近最低Y时,它开始变得干扰.

我很容易理解为什么我的错了.这是另一种查看问题的方法:

插图

在"正确"的版本中,X应该是大约250.相反,我正在做的基本上是平均400和0,所以X是200.在这种情况下如何解决X?我当时认为双线性插值可能会得到答案,但是我已经能够找到的任何内容都清楚地说明了我是如何去做这类事情的,因为它们似乎都是针对不同的问题而构建的.

谢谢您的帮助.请注意,虽然我已经在R中明显地绘制了上述数据,以便于查看我正在谈论的内容,但最终的工作是在Javascript和PHP中.我不是在找重物; 简单就是更好.

interpolation linear-interpolation

10
推荐指数
1
解决办法
6900
查看次数

使用墨西哥地图与D3.js,Leaflet或Mapbox包装大圆圈

问题,简而言之:如何使用Google Maps API之外的其他东西在Mercator中准确地投影包裹大圆半径?

问题,长期:

所以我有一个难题.我运行了一个地图应用程序,它使用谷歌地图API将巨大的圆圈投射到墨卡托地图上 - 它试图显示非常大的,准确的半径,比如大约13,000公里.但我不想再使用谷歌地图API,因为谷歌的新定价方案是疯了.所以我试图将代码转换为Leaflet,Mapbox或任何非谷歌,并且没有任何东西可以正确处理这些圈子.

以下是Google Maps API处理非洲北部中心13,000公里半径的测地圆的方法: Google Maps API很棒

这看起来很直观,但是是正确的.波浪形图案是由环绕地球的圆圈引起的.

D3.js可以在正交投影中正确渲染.所以这是在地球上用d3.geo.circle()在D3.js中渲染的相同圆圈,两次旋转:

D3.js在正交v1上的大圆圈D3.js在正交v2上的大圆

这使2D-"波浪"图案更有意义,对吧?对.我喜欢它.完全符合我的科学传播目的和所有这些.

但是当我将我的代码转换为Leaflet时,它根本不起作用.为什么?因为Leaflet的圆圈类不是一个很棒的圆圈.相反,它似乎只是一个椭圆,它与纬度有点扭曲,但不是真正的测地线.相同的圆,相同的半径,相同的原点,我们得到这个:

Leaflet试图在13000公里的圈子

太错了,错了!除了看起来完全不现实之外,它只是不正确 - 澳大利亚不会在这样的圆形范围内.这对我的申请很重要!这不可能.

好吧,我想,也许诀窍就是尝试实现我自己的大圆圈课程.我采用的方法是迭代圆点作为距离原点的距离,但是使用这个非常有用的网站上的"目标点给定距离和从起点承载"计算距离,然后将它们投影为多边形.传单.这就是我得到的结果:

在Leaflet中尝试Great Circle实现

这看起来很糟糕但实际上更接近于准确!我们得到了波浪效应,这是正确的.像我一样,你可能会问,"这里到底发生了什么?" 所以我做了一个允许我突出显示每个迭代点的版本:

使用积分在Leaflet中尝试Great Circle实现

你可以非常清楚地看到它正确地渲染了圆圈,但是多边形错误地连接了它.它该做什么(人们可能天真地想到)是围绕墨卡托地图投影的多个实例包裹该波形图,而不是天真地将它们连接在顶部,而是将它们球形地连接起来.像这样粗糙的Photoshop渲染:

Leaflet的Photoshop版本

然后多边形将以一种方式"关闭",表明多边形上方的所有东西都包含在其中.

我不知道如何在Leaflet中实现这样的东西.或其他任何事情.也许我必须以某种方式自己处理原始SVG,考虑到缩放状态?或者其他的东西?在我走进那些奸诈的杂草之前,我想我会要求任何建议/想法/等等.也许有一些更明显的方法.

哦,我尝试了另外一件事:使用相同的d3.geo.circle构造函数,该构造函数在墨卡托/ Leaflet投影的正交投影中运行良好.它产生或多或少与我的"天真"Leaflet大圆实现相同的结果:

墨卡托的D3.js大圆

我想这是有希望的.但是,如果移动原点的经度,则D3.js版本以更奇怪的方式包装(D3.js为红色,我的Leaflet类为绿松石):

D3.js vs Leaflet在不同的经度

如果在D3.js中有某种方式可以改变其工作方式,我不会感到惊讶,但我没有完全放下D3.js兔子洞.我希望D3.js会让这个"更容易"(因为它是比Leaflet更完整的制图工具),所以我会继续研究这个.

我还没有尝试在Mapbox-gl中这样做(我想这是"尝试"列表中的下一个).

无论如何.谢谢阅读.重申一个问题:如何使用Google Maps API之外的其他内容准确地在Mercator中投影包裹大圆半径?

great-circle map-projections mercator d3.js leaflet

7
推荐指数
2
解决办法
1293
查看次数

Fortran 指数运算顺序

我正在将一些 Fortran 翻译成 Javascript,对于特定类别的方程,指数的运算顺序对我来说非常不透明。

下面是 Fortran 方程的一个例子:

x = 1+a*b**c*c**d
Run Code Online (Sandbox Code Playgroud)

Fortran 中的指数用 ** 运算符指定。这个页面给出了一些提示:

算术表达式根据以下优先级规则进行计算:

  • 首先执行所有求幂;从右到左执行连续的求幂。
  • 接下来执行所有乘法和除法,按照它们从左到右出现的顺序进行。

所以我觉得把它翻译成 Python,你最终会得到类似的东西:

x = 1+a*pow(b,c)*pow(c,d)
Run Code Online (Sandbox Code Playgroud)

但这并没有让我得到我期望的答案,所以我想检查这是否合理(因为即使在最好的情况下,操作顺序也不是我的强项,当然不是语言我不是很熟悉)。

这是另一个谜题:

x = a*(1-(1-a)**b)+(1-a)*(a)**(1/b)
Run Code Online (Sandbox Code Playgroud)

哎呀!这让我头疼。(把那个单独的 (a) 放在括号里重要吗?)至少这个有括号,这表明:

x = a*(1-pow(1-a,b))+(1-a)*pow(a,1/b)
Run Code Online (Sandbox Code Playgroud)

但我仍然不确定我是否理解这一点。

fortran operator-precedence

2
推荐指数
1
解决办法
424
查看次数