標準OSMでは、土手(man_made=embankment)は下図に示すように、土手の上部に当たるところに実線を 引き、そこから下に向かう短い線を書きならべる。
C# では別の方法でもこのような描画ができるが、 Android Javaにはラインの進行方向(垂直方向)に向かって非対称な線を描く方法が見当たらない。
このため、あえて、C#の高度な機能は使用せず、実線と破線の組み合わせでこれを実現している。 破線の中心は土手から下に向かって、太さの1/2をずらしている。
下のプログラムで width が線の幅(太さ)、次の width/2 が中心線の移動量、 破線は 黒:白を 0.2 : 3 としている。これに線の太さをかけた値が実際の長さとなる。 これにより、細い線を描いたように見える。
ラインの中心をずらすのは二重境界線と同じメソッドを使用している。
osm.DrawLine(g, 0xff555555, 0.5f, tile); // 太さ0.5の実線 osm.DrawDashLine(g, 0xff333333, width, width/2, new float[]{0.2f,3}, tile);
正確には平行移動とは少し違う。多角形で考えると分かりやすい。縮小か拡大方向への移動である。 対応する線分同士は全て平行であり、垂直距離は同じである。線分の長さが異なる。 縮小の場合は短くなり、拡大では長くなる。ただし、ねじれ(自己交差)のある閉ループの場合、 この通りではないかも知れない。
二重境界線と土手のレンダリングでは、同じメソッドを使って、この平行移動を行っているが、 テーマパーク・動物園のレンダリングではヒゲが出ることがある。 同じ二重境界線の保護区域でも、ヒゲが観測された。 土手のレンダリングでは今のところ異常はない。
ラインの平行移動に問題があるのではなく、別の原因でヒゲが出るのかも知れない。