首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

SharpMap 學習筆記(三):自定義專題圖、標籤層與動態字體縮放

     編輯:關於.NET

本篇目標

掌握 SharpMap 進階客製化:依屬性值著色、自訂標籤內容與多欄位顯示、標籤字體隨縮放層級動態調整。

一、自定義專題圖:依屬性動態著色

使用 CustomTheme 配合委托方法:

SharpMap.Rendering.Thematics.CustomTheme iTheme = 
    new SharpMap.Rendering.Thematics.CustomTheme(GetMyStyle);

委托實作:

private static SharpMap.Styles.VectorStyle GetMyStyle(SharpMap.Data.FeatureDataRow row) {
    var style = new SharpMap.Styles.VectorStyle();
    switch (row["Status"].ToString().ToLower()) {
        case "available":
            style.Fill = Brushes.Yellow;  // 可用→黃色
            break;
        default:
            style.Fill = Brushes.Green;   // 其他→綠色
            break;
    }
    return style;
}

效果圖:

專題圖著色效果

二、自定義標籤層:多欄位、換行顯示

SharpMap.Layers.LabelLayer myLabel = new SharpMap.Layers.LabelLayer("labels");
myLabel.DataSource = myLayer.DataSource;
myLabel.LabelStringDelegate = new SharpMap.Layers.LabelLayer.GetLabelMethod(GetLabelString);

委托實作:

public static string GetLabelString(FeatureDataRow dr) {
    string field1 = dr["HouseNumber"]?.ToString() ?? "";
    string field2 = dr["HostName"]?.ToString() ?? "";
    string field3 = dr["Memo"]?.ToString() ?? "";
    return $"{field1}: {field2}\r\n{field3}";
}

注意:換行需用 \r\n,不支援 HTML 標籤。

三、標籤字體隨縮放層級動態縮放

public void ChangeFontSize(double Zoom, SharpMap.Layers.ILayer iLayer) {
    var labelLayer = (SharpMap.Layers.LabelLayer)iLayer;
    if (Zoom < 800 && Zoom > 400)      labelLayer.Style.Font = new Font(FontFamily.GenericSerif, 6);
    else if (Zoom < 400 && Zoom > 140) labelLayer.Style.Font = new Font(FontFamily.GenericSerif, 8);
    else if (Zoom < 140 && Zoom > 20)  labelLayer.Style.Font = new Font(FontFamily.GenericSerif, 16);
    else if (Zoom < 20)                  labelLayer.Style.Font = new Font(FontFamily.GenericSerif, 48);
    else                                 labelLayer.Style.Font = new Font(FontFamily.GenericSerif, 70);
}

前端 AJAX 控件的 zoomAmount 屬性記錄縮放倍數,Handler 中取得 Zoom 參數並呼叫:

ChangeFontSize(Zoom, map.GetLayerByName("mylabels"));

進階:標籤內容隨縮放動態切換

將 LabelStringDelegate 指派放入對應的 if-else 區塊即可實現不同縮放層級顯示不同詳細度的標籤內容。

小結

透過 CustomTheme、LabelStringDelegate 與縮放事件處理,實現了專業 GIS 應用中常見的:分級著色、豐富標籤、自適應字體三大核心視覺化需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved