- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
简短版本:如何将 SVG 路径添加到 Leaflet map ,以便在 map 坐标更改时(例如缩放更改或滑动时)路径会更新?
长版:你好,我有一个地形image包含建筑轮廓。对图像进行地理校正后,我使用 Photoshop 将栅格数据转换为 SVG .我知道描述 SVG 周边的边界框的地理坐标,并且知道 SVG 路径元素的内部坐标。我想知道现在将上面 SVG 的路径元素中描述的建筑物添加到 Leaflet map 的最佳方法。
这是一个 fiddle ,它以红色显示 SVG 图像的边界框,以蓝色显示建筑物:http://jsfiddle.net/duhaime/4vL925Lj/如您所见,建筑物尚未根据边界框正确定向。
我最初对齐建筑物的计划是使用一次性脚本将路径元素从 SVG 坐标系转换为纬度、经度坐标,然后使用我用来绘制的折线函数在 map 上绘制建筑物边界框:
var polyline = L.polyline(
[upperLeft, upperRight, lowerRight, lowerLeft, upperLeft],
{color: 'red', className: 'bounding-box', weight: 2}
).addTo(map);
这种方法的问题在于 Leaflet 折线无法绘制贝塞尔曲线,而贝塞尔曲线出现在上面的 SVG 路径元素中。作为一种解决方法,我认为我可以对贝塞尔曲线使用线性近似值,尽管这可能需要大量工作。
最终我意识到上面 fiddle 中边界框的 SVG 使用贝塞尔曲线,这让我想到我可以使用矩阵变换将建筑 SVG 的坐标空间转置到 Leaflet 坐标空间中。上面的 fiddle 使用示例矩阵变换 css 规则来变换建筑层。
在深入这个兔子洞之前,我想问:其他人认为将上面 SVG 中描述建筑物的路径添加到 fiddle 中的 Leaflet map 的最佳方法是什么?如果其他人可以就此问题提供任何建议,我将不胜感激!
进展:我决定简化这个问题并弄清楚如何使用矩阵变换将一个 div(“A”)转换为另一个 div(“B”)的纵横比。在这样做的过程中,我做了一个小 Python script它将输入 div A 的像素坐标和所需的输出 div B 的像素坐标作为输入。此脚本生成变换矩阵 X,使得 AX=B。该脚本在内部记录,并附有 fiddle .
我还做了一个gist导出变换矩阵以将 SVG 空间中的点投影到适当的经纬度坐标中。最坏的情况是,我可以划分 SVG 路径元素,将每个点与变换矩阵进行点积,然后用传单绘制多段线来绘制建筑物。但是,这将失去贝塞尔曲线......
最佳答案
这花了很多时间,但我找到了解决方案。
阅读之后,我意识到可以通过识别变换矩阵将点从一个坐标空间(例如 SVG 坐标空间)转置到另一个坐标空间(例如纬度/经度坐标空间),然后乘以通过该变换矩阵输入空间(SVG)。此操作会将给定点转置到 map 中的适当位置。
我写了this script计算所需的变换矩阵。该脚本将 SVG 的边界框坐标和从中提取 SVG 元素的地理校正 geotiff 的边界框坐标作为参数。该脚本生成变换矩阵并展示如何将 SVG 空间中的点乘以该矩阵以找到它们合适的纬度/经度坐标。
有一个问题——需要在没有任何 CSS 转换的情况下表示 SVG 中的点。为了直接表示 SVG 点在 SVG 中的位置,我使用 this tool 将 SVG 中的路径元素转换为多边形元素。 , 为此 source是公开可用的。
如果其他人需要完成类似的任务,这里是我使用的完整工作流程:
<rect>
或您保存的 SVG 中的其他几何形状,将它们转换为路径并重新保存。gdalinfo {your-geotiff-file.tif}
从 GDAL 获得。 <polygon>
的数组元素,并且对于每个元素,将多边形拆分为点数组。将每个点乘以变换矩阵以找到该点的纬度/经度位置。就其值(value)而言,我用于生成矩阵变换和转置的脚本 <polygon>
元素指向纬度/经度空间是 here .请注意脚本中的某些路径需要根据您的情况进行更新——例如该脚本将输出 geojson 推送到我的实验室管理的 S3 存储桶:)
我希望这对发现自己面临这项任务的其他人有所帮助!坦率地说,我很惊讶这需要付出如此多的努力,并且我很确定必须有一个更优雅的工作流程......
关于javascript - 矩阵变换 : Converting SVG path coordinates to Leaflet coordinate system,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38155854/
我正在尝试实现类似于 Leaflet.buffer 的缓冲区在我的 map 上。然而,Leaflet.buffer 似乎只适用于 Leaflet.Draw。 我正在使用 Leaflet Editabl
我正试图摆脱 Google map ,因为我受够了他们现在的速度有多慢!我决定试一试 Leaflet,这似乎是个不错的选择。下面是我的代码: initMap(); function initMap()
在 Leaflet 中,是否可以使用 {clickable:false} 定义标记或折线,以便点击传递到下方的任何内容 - 无论是 map 还是可点击的几何对象? 目前我通过使标记/折线可点击并自己传
我正在结合 Leaflet 使用 HTML map 进行一些测试。 .服务器端我有一个 Ruby Sinatra 应用程序,它提供由 MySQL 表获取的 json 标记。使用 2k-5k 和可能更多
我无法使用Leaflet(0.7.7)/Leaflet.Draw(latest)将Layer属性转换为GEOJson对象的属性。我的工作流程是: 1创建 map :var map = L.map('#
我正在使用使用传单 api 的应用程序。 简介 我需要绘制不同类型的围栏,使用装饰器我可以在一定程度上为折线应用良好的视觉效果,但不多。 问题 我愿意显示双绞线而不是破折号、点或普通线,我知道双绞线将
我在我的应用程序中使用 WebView 来显示 Leaflet map 。 在 HTML 文件中,我有以下信用和链接: L.tileLayer('https://api.tiles.mapbox.co
我正在使用https://github.com/Leaflet/Leaflet.draw插件,并且试图检索已编辑图层的图层类型。 在draw:created事件中,我有layer和layerType,
我的左下角有缩放控件和比例尺。 我遇到的问题是,当我的 map 在移动设备上旋转时,它们与左上角的自定义控制面板重叠。 那么如何使比例尺水平位于缩放控件旁边? 最佳答案 您可以通过更改比例控件的 CS
我想计算标记的高度,但我在传单中没有找到任何解决方案。我找到了海拔插件,它允许在 map 上绘制海拔剖面图,但我不需要它。你知道如何计算高度吗?谢谢。 最佳答案 编辑:一个不错的选择 为任何可能需要它
我明白我可以使用通用Leaflet layer ,以及更高级的 map 框 featureLayer ,它提供了作为过滤器的有用功能。但是,我不明白两者之间的区别 marker = L.Marker
我正在尝试在 Render mapbox vector tiles inside react-leaflet? 中描述此实现工作,除了我使用的是 TypeScript。 所以我的文件看起来像这样: i
我正在尝试将我的点在 map 上的正确位置作为 Latlng: let point = L.point(0,0) // x=0,y=0 let latlng = map.unproject(point
我正在使用 Leaflet.VectorGrid用于在传单 map 上加载 pbf 矢量切片的插件。我检索矢量切片的 API 需要传递授权 header 。在 Mapbox GL js 中,这可以通过
我们有一张 map ,在某个缩放级别,我们开始对标记进行聚类。 现在我希望能够删除某些标记。我可以删除不参与集群的标记,但集群中的标记不会被删除,因为代码不会遍历它们。 我会发布代码,但它无处不在,而
我仅在同一位置的标记上进行聚类(即 maxClusterRadius = 0)。单击集群时,我希望它以特定的缩放级别(不是最大缩放)居中并放大,然后立即 spiderfy。使用以下代码,spiderf
使用 Leaflet javascript。我希望我的“清除按钮”能做两件事... 1) 取消选中所有 L.Control 层2) 从 map 中移除当前叠加层 我可以使用这段代码轻松完成第一个: v
我正在开发一个包含大量标记的应用程序,并希望将它们聚类。我找到了 Leaflet.markercluster,它做得很好。但是,我想自定义标记的聚类。具体来说,我想根据标记所在的国家/地区对我的标记进
有点奇怪,希望有人能帮忙。 在传单中,一旦用户输入了纬度/经度并向 map 添加了一个点,我希望能够在该点周围添加一个 10 公里的正方形。 我已经尝试四处寻找计算以找到 x 公里外的正方形的角,但没
我在 leaflet.js 中创建了一个具有多个图层的 map ,但无法弄清楚如何切换一个图层以最初显示在 map 上。 Here is the link 我确信它相当简单,但就是无法弄清楚。 最佳答
我是一名优秀的程序员,十分优秀!