Zh-hans:Key:boundary/statistics
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)
本页面由 AI 从英文页面翻译而来,内容需要人工复核。
可了解更多关于海洋边界的信息,包括领海边界。 --Skippern 02:13, 16 August 2009 (UTC)
偶数与奇数的差异
偶数行政级别比奇数值常用得多
标准差偏高
可能是因为闭合对象的数量太少,或者我的代码里存在某个 bug,标准差相当高。