DrawLine(系)で太い線を描画するときのちょっとした注意点
※DrawLine系: DrawLine, DrawLines, DrawPath, ... など(実質Draw系)
津波情報の描画にGeoJSONのLineString
,MultiLineString
形式の地図データを使っていますが、なぜか欠けることがある問題が起きました。
↓上のものは後述(GraphicsPath使用時の注意点)
(よく見ると佐渡などで欠けている)
始点と終点は一致していますし、PenにLineJoin.Round
、GraphicsにSmoothingMode.AntiAlias
を設定しても変わりません。
解決方法
Point
ではなくPointF
, int
ではなくfloat
を使えば(たぶん)OK(サイズが小さいと欠けます)
(やり方と命名が変なのは置いといて)例がないのは寂しいので置いときます。.NET9, System.Text.Jsonです。
var pointsList = new List<List<PointF>>();
if ((string)json_1_geo["type"]! == "LineString")
{
var points = new List<PointF>();
foreach (var json_2 in json_1_geo["coordinates"]!.AsArray())
points.Add(new PointF(((float)json_2![0]! - 120f) * 20f, (50f - (float)json_2[1]!) * 20f));
pointsList.Add(points);
}
else
foreach (var json_2 in json_1_geo["coordinates"]!.AsArray())
{
var points = new List<PointF>();
foreach (var json_3 in json_2!.AsArray())
points.Add(new PointF(((float)json_3![0]! - 120f) * 20f, (50f - (float)json_3[1]!) * 20f));
pointsList.Add(points);
}
GraphicsPath使用時のちょっとした注意点
Multh**
形式のGeoJSONをGraphicsPathを使用して適当にやっていると、異なる地物がつながります(上の方のポストでも一部起きている)。
解決方法
GraphicsPath.Add**()
の前か後にGraphicsPath.StartFigure();
をするだけでOK。
おまけ
津波情報を表示している自作ソフト
https://github.com/Ichihai1415/QuakeMapFast 編集時点未作成