2 个版本
使用旧的 Rust 2015
0.1.1 | 2018 年 8 月 8 日 |
---|---|
0.1.0 | 2018 年 8 月 4 日 |
#6 in #cartography
28KB
284 行
street_index
此库包含用于生成街道索引的实用函数。其工作原理相当简单:您给它一个页面上的网格(目前限于矩形网格),并添加 StreetNameRect
。每个 StreetNameRect
都包含街道/道路名称的字符串以及地图上布局的字符串的范围。
Grid
负责为您的街道名称分配网格位置,例如 "Canterbury Road => A2"
。由于通常地图存在道路名称重复的问题(这在街道索引中不是您想要的),您可以创建一个 DeduplicatedRoadNames::from_streets
,这将删除所有道路名称。
通常在街道名称含糊不清时会出现问题。例如,地图上出现在两个位置的街道(例如,一个城市与相邻城市拥有相同的街道名称)。正因为如此,街道名称处理不能完全自动化,因为总会有一些奇怪的边缘情况需要担心。然而,90% 的道路都不是这样。
由于这种限制,DeduplicatedRoadNames::process()
返回两种类型的道路:ProcessedRoadName
用于只有 1 或 2 个网格单元格宽的道路(即 "Canterbury Road" => A9
,"Canterbury Road" => A9-A10
)。在这些情况下(这涵盖了 90% 的街道索引名称),映射不是模糊的。
未处理的道路名称
用于其他任何内容(例如:"坎特伯雷路" => [A9, A10, E1, E2]
. 通常这些道路需要手动审查 - 可能存在两个道路 "坎特伯雷路" => A9-10;E1-E2
,但也有可能道路实际上只有一条,只是地图上的一部分被裁剪掉了,这种情况下你将写 "坎特伯雷路" => A9-E2
。
出于制图目的,通常你希望以CSV格式输出,以便你的图形设计师可以将街道索引粘贴到InDesign / Illustrator中进行最终地图布局。 未处理的道路
和处理过的道路
都有一个简单的.to_csv
函数,便于导出。
示例
extern crate street_index;
use street_index::prelude::*;
fn main() {
// Create a grid, with the page extensions being 200 x 200 millimeter
// Each cell is 20x20 millimeter large (usually 50x50 is recommended, though)
let mut grid = Grid::new(
Bbox {
width: Millimeter(200.0),
height: Millimeter(200.0)
},
GridConfig {
cell_width: Millimeter(20.0),
cell_height: Millimeter(20.0),
});
// You will have to calculate the street name boundaries yourself, i.e.
// using FreeType or RustType. Often times this will come as a side-effect
// of your map rendering / layouting program.
//
// The position is relative to the top left of the grid.
grid.insert_street(StreetNameRect {
street_name: String::from("Canterbury Road"),
x_from_left: Millimeter(30.0),
width: Millimeter(50.0),
y_from_top: Millimeter(30.0),
height: Millimeter(8.0),
});
// We deduplicate the roads, i.e.:
//
// ```
// "Canterbury Road" => A3
// "Canterbury Road" => A4
// ```
//
// becomes:
//
// ```
// "Canterbury Road" => [A3, A4]
// ```
let deduplicated = DeduplicatedRoads::from_streets(&grid.street_names());
// As described above, we get both processed and unprocessed
// road names back
let (processed, unprocessed) = deduplicated.process();
// In this case, "Canterbury Road" spans from B1-B2, so we get a
// `ProcessedRoad` back, delimited by a TAB character.
//
// You can then write this to a CSV file if you want.
println!("processed:\r\n{}", processed.to_csv("\t"));
println!("unprocessed:\r\n{}", unprocessed.to_csv("\t"));
}
许可证
此库受MIT许可证的许可。