#index #map #gis #cartography #csv

street_index

street_index 是一个用于处理道路名称/街道索引的实用程序包,适用于制图目的

2 个版本

使用旧的 Rust 2015

0.1.1 2018 年 8 月 8 日
0.1.0 2018 年 8 月 4 日

#6 in #cartography

MIT 许可证

28KB
284

street_index

LICENSE Build Status Linux / macOS Build status Windows Rust Compiler Version

此库包含用于生成街道索引的实用函数。其工作原理相当简单:您给它一个页面上的网格(目前限于矩形网格),并添加 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许可证的许可。

无运行时依赖