DotSpatial shapefile

时间:2016-02-12 07:06:13

标签: c# shapefile dotspatial

我试图读取特定shapefile中的所有要素数据。在这种情况下,我使用DotSpatial打开文件,并且我正在迭代这些功能。这个特殊的shapefile大小只有9mb,而dbf文件是14mb。循环大约有75k个功能。

请注意,这是通过控制台应用程序以编程方式进行的,因此不会呈现任何渲染或任何内容。

加载形状文件时,我重新投影,然后迭代。加载重新投影非常快。但是,一旦代码到达我的foreach块,加载数据需要将近2分钟,并且在VisualStudio中调试时使用大约2GB的内存。对于一个相当小的数据文件来说,这似乎非常非常过分。

我在命令行之外运行了Visual Studio之外的相同代码,但是时间仍然大约为2分钟,并且该进程的内存大约为1.3GB。

无论如何还要加快速度吗?

以下是我的代码:

// Load the shape file and project to GDA94
Shapefile indexMapFile = Shapefile.OpenFile(shapeFilePath);
indexMapFile.Reproject(KnownCoordinateSystems.Geographic.Australia.GeocentricDatumofAustralia1994);

// Get's slow here and takes forever to get to the first item
foreach(IFeature feature in indexMapFile.Features)
{
    // Once inside the loop, it's blazingly quick.
}

有趣的是,当我使用VS立即窗口时,它超级超级快,没有任何延迟......

2 个答案:

答案 0 :(得分:4)

我已成功解决这个问题......

出于某种原因,在功能上调用foreach非常缓慢。

但是,由于这些文件具有1-1的功能映射 - 数据行(每个功能都有一个相关的数据行),我稍微修改了以下内容。它现在非常快......启动迭代不到一秒钟。

// Load the shape file and project to GDA94
Shapefile indexMapFile = Shapefile.OpenFile(shapeFilePath);
indexMapFile.Reproject(KnownCoordinateSystems.Geographic.Australia.GeocentricDatumofAustralia1994);

// Get the map index from the Feature data
for(int i = 0; i < indexMapFile.DataTable.Rows.Count; i++)
{

    // Get the feature
    IFeature feature = indexMapFile.Features.ElementAt(i);

    // Now it's very quick to iterate through and work with the feature.
}

我想知道为什么会这样。我想我需要查看IFeatureList实现上的迭代器。

干杯, 贾斯汀

答案 1 :(得分:1)

这对于非常大的文件(1.2百万个功能)也有同样的问题,填充.Features集合永远不会结束。

但是如果你要求这个功能,你没有内存或延迟开销。

        int lRows = fs.NumRows();
        for (int i = 0; i < lRows; i++)
        {

            // Get the feature
            IFeature pFeat = fs.GetFeature(i); 

            StringBuilder sb = new StringBuilder();
            {
                sb.Append(Guid.NewGuid().ToString());
                sb.Append("|");
                sb.Append(pFeat.DataRow["MAPA"]);
                sb.Append("|");
                sb.Append(pFeat.BasicGeometry.ToString());
            }
            pLinesList.Add(sb.ToString());
            lCnt++;

            if (lCnt % 10 == 0)
            {
                pOld = Console.ForegroundColor;
                Console.ForegroundColor = ConsoleColor.DarkGreen;
                Console.Write("\r{0} de {1} ({2}%)", lCnt.ToString(), lRows.ToString(), (100.0 * ((float)lCnt / (float)lRows)).ToString());
                Console.ForegroundColor = pOld;
            }

        }

查找GetFeature方法。