问题描述
我正在尝试制作一个转换 Longitude
和 Latitude
的应用程序,并将使用 VB.NET
在墨卡托投影地图上提供一个相对点。但是,与其他示例不同的是,我的代码必须考虑到 SVG 的缩放,并且还仅使用地图的特定部分。
我知道我可以使用此代码将全球墨卡托投影地图转换为带有 (X,Y)
的点 VB.NET
,但此示例未考虑特定区域或缩放级别。
这是从 SO (View Here) 上的这个答案中提取的“伪代码”类型示例。
latitude = 41.145556; // (φ)
longitude = -73.995; // (λ)
mapWidth = 200;
mapHeight = 100;
// get x value
x = (longitude+180)*(mapWidth/360)
// convert from degrees to radians
laTrad = latitude*PI/180;
// get y value
mercN = ln(tan((PI/4)+(laTrad/2)));
y = (mapHeight/2)-(mapWidth*mercN/(2*PI));
我花了一些时间将其实现到 VB.NET
中,并且在给定整个世界的大型墨卡托投影时效果很好。
但是,我使用的墨卡托地图只包含世界全球墨卡托地图的一小部分,并且是一个SVG
文件。 (Download it here)
我知道地图的 width
是 450,height
是 530。我还知道,当完全没有缩放时,地图的左经度是 123.658963
,其最高纬度是 { {1}},其右侧经度为 45.523885
,底部纬度为 145.820743
。此信息包含在我下载 SVG 地图的源中。
我的地图应用程序基本上将 24.217586
地图呈现为 SVG
(使用 svg-net 库)并将其加载到 bitmap
中,同时考虑按比例因子进行缩放。
最终,我想获得一个函数,当提供一个 long/lat 时,将输出 PictureBox
呈现 PictureBox
的相对点。这就是缩放很重要的原因。
上面的函数伪代码只考虑了在全球墨卡托投影上获取相对 (x,y) 的问题,根本不考虑缩放和特定区域。
此代码用于通过缩放(如果需要)渲染 SVG
地图:
SVG
是否有任何函数可以在提供区域的经度和纬度以及缩放因子时能够返回 Dim SF As String = 1 'Zoom/Scale Factor
'Use Scrollbar to Zoom PictureBox2 which contains the loaded bitmap
Private Sub PictureBox2_MouseWheel(sender As Object,e As MouseEventArgs) Handles PictureBox2.MouseWheel
If e.Delta > 0 Then
SF = SF + 0.1
Dim svgDocument = Svg.SvgDocument.Open("C:\users\admin\Pictures\doc.svg")
svgDocument.ShapeRendering = SvgShapeRendering.Auto
PictureBox2.Size = New Size(CInt(650 * SF),CInt(700 * SF))
Dim bmp As Bitmap = svgDocument.Draw(PictureBox2.Size.Width,PictureBox2.Size.Height)
PictureBox2.Image = bmp
Else
SF = SF - 0.1
Dim svgDocument = Svg.SvgDocument.Open("C:\users\admin\Pictures\doc.svg")
svgDocument.ShapeRendering = SvgShapeRendering.Auto
PictureBox2.Size = New Size(CInt(650 * SF),PictureBox2.Size.Height)
PictureBox2.Image = bmp
End If
End Sub
地图的相对 (X,Y)
坐标?
我一直在尝试解决这个问题,但一直没有找到好的结果。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)