===App.xaml.cs=== using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Threading.Tasks; using System.Windows; namespace IndexRasterLayerSample { /// /// Interaction logic for App.xaml /// public partial class App : Application { } } ===MainWindow.xaml.cs=== using System.IO; using System.Windows; using System.Windows.Forms; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.WpfDesktopEdition; namespace IndexRasterLayerSample { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { map.MapUnit = GeographyUnit.Meter; } private void LoadButtonClick(object sender, RoutedEventArgs e) { FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog(); if (folderBrowserDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { tbFolder.Text = folderBrowserDialog.SelectedPath; } if (!string.IsNullOrEmpty(tbFolder.Text)) { IndexRasterLayer indexRasterLayer = new IndexRasterLayer(@"..\..\index.idx"); string[] files = Directory.GetFiles(tbFolder.Text); foreach (var file in files) { indexRasterLayer.RasterLayers.Add(new MrSidRasterLayer(file)); } LayerOverlay layerOverlay = new LayerOverlay(); layerOverlay.Layers.Add(indexRasterLayer); map.Overlays.Add(layerOverlay); indexRasterLayer.Open(); map.CurrentExtent = indexRasterLayer.GetBoundingBox(); map.Refresh(); } } } } ===IndexRasterLayer.cs=== using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; namespace ThinkGeo.MapSuite.Core { public class IndexRasterLayer : RasterLayer { private bool isOpen; private string idxPathFileName; private RtreeSpatialIndex rTreeIndex; private Collection rasterLayers; public IndexRasterLayer() : this(new Collection(), string.Empty) { } public IndexRasterLayer(string idxPathFileNam) : this(new Collection(), idxPathFileNam) { } public IndexRasterLayer(IEnumerable rasterLayers) : this(rasterLayers, string.Empty) { } public IndexRasterLayer(IEnumerable rasterLayers, string idxPathFileName) : base() { this.idxPathFileName = idxPathFileName; this.rasterLayers = new Collection(); foreach (var layer in rasterLayers) { this.rasterLayers.Add(layer); } } public string IndexFilePath { set { this.idxPathFileName = value; } get { return this.idxPathFileName; } } public Collection RasterLayers { set { this.rasterLayers = value; } get { return this.rasterLayers; } } public override bool HasBoundingBox { get { return true; } } protected override bool IsOpenCore { get { return isOpen; } } protected override void OpenCore() { if (!IsOpenCore) { isOpen = true; if (!File.Exists(idxPathFileName)) { RtreeSpatialIndex.CreateRectangleSpatialIndex(idxPathFileName, RtreeSpatialIndexPageSize.EightKilobytes, RtreeSpatialIndexDataFormat.Float); rTreeIndex = new RtreeSpatialIndex(idxPathFileName, RtreeSpatialIndexReadWriteMode.ReadWrite); rTreeIndex.Open(); foreach (var rasterLayer in rasterLayers) { rasterLayer.Open(); RectangleShape boudingBox = rasterLayer.GetBoundingBox(); Feature feature = new Feature(boudingBox); feature.Id = rasterLayer.PathFilename; rTreeIndex.Add(feature); } } else { rTreeIndex = new RtreeSpatialIndex(idxPathFileName, RtreeSpatialIndexReadWriteMode.ReadOnly); rTreeIndex.Open(); } } } protected override void DrawCore(GeoCanvas canvas, Collection labelsInAllLayers) { Collection ids = rTreeIndex.GetFeatureIdsIntersectingBoundingBox(canvas.CurrentWorldExtent); var layers = rasterLayers.Where(a => ids.Contains(a.PathFilename)); foreach (var layer in layers) { layer.Open(); layer.Draw(canvas, labelsInAllLayers); } } protected override RectangleShape GetBoundingBoxCore() { Collection boundingBoxs = new Collection(); foreach (var rasterLayer in rasterLayers) { rasterLayer.Open(); boundingBoxs.Add(rasterLayer.GetBoundingBox()); } return ExtentHelper.GetBoundingBoxOfItems(boundingBoxs); } } } ===AssemblyInfo.cs=== using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Windows; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("IndexRasterLayerSample")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("IndexRasterLayerSample")] [assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] //In order to begin building localizable applications, set //CultureYouAreCodingWith in your .csproj file //inside a . For example, if you are using US english //in your source files, set the to en-US. Then uncomment //the NeutralResourceLanguage attribute below. Update the "en-US" in //the line below to match the UICulture setting in the project file. //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] [assembly: ThemeInfo( ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located //(used if a resource is not found in the page, // or application resource dictionaries) ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located //(used if a resource is not found in the page, // app, or any theme specific resource dictionaries) )] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ===Resources.Designer.cs=== //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace IndexRasterLayerSample.Properties { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("IndexRasterLayerSample.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } } } ===Settings.Designer.cs=== //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace IndexRasterLayerSample.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); public static Settings Default { get { return defaultInstance; } } } }