Zh-hans:Key:boundary/statistics

From OpenStreetMap Wiki
Jump to navigation Jump to search

在 trac 工单 1332 的讨论之后,我想针对不同缩放级别统计各类对象(闭合路径,以及其中的路径可以被排列成一条大路径的关系)的大小。完成之后,我希望把结果与他人分享。

获取数据

为获取所需数据,我使用 Xapi,并通过下面这段小 shell 脚本下载了相关数据:

for i in $(seq 1 10); do
   wget -O admin_level_$i.osm "http://osmxapi.hypercube.telascience.org/api/0.5/*%5Badmin_level=$i%5D";
done

计算路径面积

为了计算面积,我编写了一个 shell 脚本,它解析 osm 文件并处理两种情况。

闭合路径

对于闭合路径,我使用来自 维基百科的多边形面积公式来计算大小。

“闭合”关系

对于关系,我会尝试对路径排序,使路径 i+1 的第一个节点正好是路径 i 的最后一个节点,而最后一条路径的终点与第一条路径的起点是同一个点。如果满足这一情况,我就称该关系是“闭合”的。对于这样的关系,我会通过拼接各条路径的节点创建一条临时路径,然后用与上面相同的公式计算面积。

代码

代码本身部分抄自 osmarender/perl,可从 http://www.petschge.de/osm/stats/areastats.pl 获取。原始输出(求平均之前)位于 http://www.petschge.de/osm/stats/admin_level_results.tar.bz2。

求平均

上面讨论的代码会为每一个闭合路径和关系输出一行。为了让数据更有用,我用下面这段简短的 perl 脚本计算了每个行政级别的面积平均值和标准差:

#!/usr/bin/perl
my $areasum = 0;
my $areasquaresum = 0;
my $linecount = 0;
while (<STDIN>) {
        $areasum += $_;
        $areasquaresum += $_ * $_;
        $linecount++;
}
my $average = $areasum / $linecount;
my $s = sqrt($areasquaresum / $linecount - $average * $average);
print "average is $average, stddev is $s\n";

结果

admin_level 闭合路径的数量 闭合关系的数量 平均面积 面积标准差
1 3 0 0.0069 0.0098
2 124 62 0.1 1.3
3 2 0 0.0079 0.0079
4 95 16 0.17 0.93
5 1 3 0.215 0.039
6 696 114 0.004 0.016
7 7 2 0.030 0.078
8 26206 1581 0.0004 0.0085
9 12 6 0.00038 0.00064
10 36 26 0.0008 0.0027

所有面积均以平方弧度为单位。

讨论

从数据中可以看出几个明显的点

闭合对象很少

尤其在较低的缩放级别下,闭合的对象很少。这可能与尚未解决的海洋边界问题有关。如果为每个低行政级别的对象建立一个关系,把所有构成该边界线的路径都收集起来,将会大有帮助

为什么不帮忙解决 Maritime borders 的问题,这样我们就能得到更多的闭合对象? --Skippern 16:02, 23 February 2009 (UTC)
boundary=maritime
本页面由 AI 从英文页面翻译而来,内容需要人工复核。
可了解更多关于海洋边界的信息,包括领海边界。 --Skippern 02:13, 16 August 2009 (UTC)

偶数与奇数的差异

偶数行政级别比奇数值常用得多

标准差偏高

可能是因为闭合对象的数量太少,或者我的代码里存在某个 bug,标准差相当高。