自动地图标记应该算是GIS中最复杂的问题之一吧(属于NP复杂度问题,所以通常不能找到最优解,只能找到较优解),已经有不少的文章讨论过相关算法。跟解决其他NP问题一样,大部分算法的思路都是提供一个启发(heuristic)给算法作为下一步执行的依据。
常见的算法大致可分为这么几类(或者是他们的结合):
基于规则的算法(rule-based algorithms):给算法预先拟定一些规则(这些规则的好坏会在很大程度上影响结果的好坏),按照这些规则执行算法。比如对地名的标注:首先标注且不冲突重要城市的标注;尽量标注在城市的上方,如果遇到冲突则再依次尝试右左下。其他规则还可以描述诸如标注的方向,边缘处如何解决等等。
局部优化算法(local optimization algorithms):依次摆放标注尽量使之不出现冲突,直到某一处标记所有潜在的位置都会出现冲突时,则选择冲突最少(例如给标注拟定一个轮廓,选择重合面积最少的)的一处摆放。这个方法通常结果不会太好,但速度很快。
分而治之算法(divide-and-conquer algorithms):这既可以作为一种策略,也可以作为一种算法的思路。作为策略,比如很有可能在有些地方标注比较稀疏(例如沙漠地区城市较少),可以将那些地方隔离,用快速简单的算法得到令人满意的结果,这在很大程度上能够提高整体的效率(如果地地图很大标注很多,运算时间可能会很长);而在那些标注密集的地方采用更复杂的算法。作为算法,将地图内容分成小块进行标注,小块再分成更小的小块(递归地),当集合小到可以进行较好的标注(比如分到只对两个地名进行不冲突标注),然后再考虑他们的结合。这种算法分割和结合的方法对结果影响比较大。
我觉得除非你自己就是想研究/比较各种算法或者想提出新算法,或者对标注结果有特别或较高的要求,不然没有必要自己去实现这些算法(感觉要花点时间)。ArcGIS QGIS这些平台工具一般都包含地图标记工具。
QGIS: 2. Lesson: The Label Tool
ArcGIS: ArcGIS Help 10.1
好像没听过离线切图,不好发表意见。