生成地图瓦片
QCAD 附带两个命令行工具,用于创建地图瓦片,供 Leaflet 等在线地图显示使用。Leaflet 是一个用于在浏览器中处理交互式地图的 JavaScript 库。
在线呈现图形
Section titled “在线呈现图形”在线地图最简单的用例是为网站访客提供一个可交互、可缩放的图形视图。
下面这个示例为任意给定的图形文件生成地图瓦片:
dwg2maptiles -z 0-6 -c -b white -hq-postfix=@2x -a -o path/to/output/directory drawing.dxf-z 开关指定要生成的缩放级别,此处为从缩放级别 0 到缩放级别 6。这意味着从级别 0(整幅图形或自动缩放)开始,用户最多可以放大 6 次,直到达到上限。用户每放大一次,图形就放大 2 倍,因此在 6 个缩放级别下,用户最多可以放大 2^6(=64)倍。生成更多的缩放级别需要更多的时间和磁盘空间。每增加一个缩放级别,通常需要比上一级别多四倍的时间和磁盘空间来生成。
瓦片会在给定的输出目录(-o)中生成,采用地图瓦片的标准目录结构和文件命名(z/x/y.png)。
在上面的示例中,我们希望图形渲染在白色背景上(-b white)。白色线条应被校正为黑色,以确保所有线条都可见(-c)。
-hq-postfix=@2x 参数告诉 dwg2maptiles 在生成 256x256px 标准分辨率瓦片的同时,生成 512x512px 的高质量(hq、高分辨率、视网膜)瓦片。
为了进一步提高质量,我们还使用 -a 开关启用抗锯齿。
生成地理参考地图瓦片
Section titled “生成地理参考地图瓦片”dwg2maptiles 也可用于生成世界地图的精确叠加层。为此,通常需要将图形从局部坐标系转换为在线地图常用的 Web 墨卡托(Web Mercator)坐标。
QCAD Professional 附带一个独立的命令行工具,用于将图形从一个坐标参照系(CRS)转换到另一个:dwgmapconvert。
dwgmapconvert 通常用于将给定图形文件中的所有坐标从已知的局部坐标系转换到 EPSG:3857(有时称为 “Web Mercator”)坐标系。这是大多数在线地图(例如 Google 地图或 mapbox)所使用的坐标系。要将图形用作 dwg2maptiles 的输入并生成地理参考地图瓦片,图形需要采用 EPSG:3857 坐标系。
在 EPSG:3857 坐标系中,整幅世界地图在缩放级别 0 时正好落入一个 20037508.3427892m 的正方形内。如果将图形转换到此坐标系,图形会被变换为恰好落入该世界正方形,并且位于正确的投影世界坐标处。
例如,如果某图形是在 EPSG:2056(也称 LV95,瑞士局部坐标系)中创建的,则可以使用 dwgmapconvert 将其转换为 EPSG:3857,方法如下:
dwgmapconvert -segment-length=0.5 -crs-in=EPSG:2056 -crs-out=EPSG:3857 -f -o drawing_epsg3857.dxf drawing_epsg2056.dxf由于地图投影通常是非线性的,曲线和较长的直线需要被拆分为小线段,然后才能以非线性方式进行投影。如果提供了 -segment-length 开关,dwgmapconvert 会使用给定的分段长度自动进行分段。分段长度以原始图形的图形单位指定(此处为米)。
-crs-in 用于指定输入坐标系,此处为 EPSG:2056。
-crs-out 用于指定输出坐标系,如果输出稍后要用于 dwg2maptiles,则必须为 EPSG:3857。
dwgmapconvert 支持将 LV95 作为输入、将 WebMercator 作为输出。
其他坐标系将在未来版本中添加,或者可由用户添加。
要添加对新坐标系的支持,必须提供两个方程,用于将坐标从新坐标系转换到 WGS84(经度/纬度,类似于 GPS 坐标)。
新坐标系可以添加到名为 CRS.json 的 JSON 配置文件中,该文件位于所使用的 QCAD 安装的 “scripts” 文件夹内。下面是一个配置了 LV95 坐标系的 CRS.json 文件示例。为了能够将 LV95 用作 dwgmapconvert 工具的输入,我们需要在 “toWgs84” 部分提供 x 和 y 坐标转换的方程。此处我们还使用了两个辅助变量 x_ 和 y_,它们必须在 x 方程中初始化,以便在两个方程中都可访问。
我们也可以提供一个 “fromWgs84” 部分,以允许从其他坐标系转换到 LV95。这两个部分都是可选的,取决于你想支持的转换方向。
{ "CRS" : [ { "id" : "EPSG:2056 CH1903+ / LV95", "toWgs84" : { "x": "x_ = (y-1200000)/1000000; y_ = (x-2600000)/1000000; (2.6779094 + 4.728982*y_ + 0.791484*y_*x_ + 0.1306*y_*x_*x_ - 0.0436*y_*y_*y_) * 100 / 3", "y": "(16.9023892 + 3.238272*x_ - 0.270978*y_*y_ - 0.002528*x_*x_ - 0.0447*y_*y_*x_ - 0.0140*x_*x_*x_) * 100 / 36" }, "aliases" : [ "LV95", "Swiss" ] } ]}生成地图瓦片
Section titled “生成地图瓦片”将图形转换为 EPSG:3857 坐标后,我们就可以使用 dwg2maptiles 为 leaflet 中的叠加图层生成瓦片:
dwg2maptiles -web-mercator -skip-empty -hq-postfix=@2x -z 22 -b transparent -o path/to/output/directory drawing_epsg3857.dxf请注意,我们需要向 dwg2maptiles 传递 -web-mercator 开关,以告知它不应执行自动缩放,而应按照文件中现有的精确 EPSG:3857 坐标生成地图叠加层。
-skip-empty 告诉 dwg2maptiles 不要生成不包含任何图形部分的瓦片。若不使用此开关,每个缩放级别将生成 2^zoomLevel 个瓦片。对于缩放级别 22,那将是 4’194’304 个瓦片。由于叠加图形很可能只覆盖世界地图的极小一部分,因此在创建叠加地图时应始终使用此开关。
-b transparent 将背景设为透明,这样地图就可以用作现有世界地图(例如 Google 地图、mapbox 等)的叠加层。为了控制黑色或白色线条的显示颜色,可以分别使用 -b "#00ffffff"(白色透明背景,黑色线条)或 -b "#00000000"(黑色透明背景,白色线条)将背景设为黑色透明或白色透明。在这种情况下,请务必同时传递 -c 开关以强制自动颜色校正。
参数 -hq-postfix=@2x 可用于在生成常规 256px 瓦片的同时生成高分辨率瓦片(512px)。推荐使用 “@2x” 这一值,它被广泛用于高分辨率瓦片,在 leaflet 中也是如此。使用此开关后,对于每个低分辨率瓦片 “N.png”,都会创建一个高分辨率瓦片 “[email protected]”。
使用多个进程(和 CPU 核心)
Section titled “使用多个进程(和 CPU 核心)”生成地图瓦片可能是一项 CPU 密集型任务,具体取决于缩放级别、图形复杂度和其他设置。
为了更快地生成地图瓦片,你可以将任务分配到多个可用的 CPU 核心上。为此,dwg2maptiles 提供了 -s 开关,只生成所需瓦片的一个切片。-s 开关需要两个以逗号分隔的参数:要生成的切片以及所用切片的总数。例如 -s 1,4 将生成总共四个切片中的第一个切片。要使用四个 CPU 核心生成上述示例的所有瓦片,可以运行:
dwg2maptiles -web-mercator -skip-empty -hq-postfix=@2x -z 22 -s 1,4 -b transparent -o path/to/output/directory drawing_epsg3857.dxf &dwg2maptiles -web-mercator -skip-empty -hq-postfix=@2x -z 22 -s 2,4 -b transparent -o path/to/output/directory drawing_epsg3857.dxf &dwg2maptiles -web-mercator -skip-empty -hq-postfix=@2x -z 22 -s 3,4 -b transparent -o path/to/output/directory drawing_epsg3857.dxf &dwg2maptiles -web-mercator -skip-empty -hq-postfix=@2x -z 22 -s 4,4 -b transparent -o path/to/output/directory drawing_epsg3857.dxf &wait当然,你也可以按缩放级别划分任务,或者仅对更高的缩放级别使用切片,而用单个进程处理所有较低(成本较低)的缩放级别,等等。
一个交互式示例为瑞士苏黎世州的地图提供了两个叠加图层:受保护的森林区域和野生动物走廊。原始数据采用 EPSG:2056(LV95)坐标,并使用 dwgmapconvert 转换为 EPSG:3857。