24小时热门版块排行榜    

查看: 1802  |  回复: 10

zzahkj

木虫 (著名写手)


[交流] Vb.net+ArcEngine生成点状图层的速度太慢了该怎么办?

Vb.net+ArcEngine生成点状图层的速度太慢了该怎么办?由于我做的是预警预报系统,速度尽可能短,现在生成全部点要好几天,这也太慢了,根本就不适用,请问有什么好的办法解决吗?我的代码如下:
CODE:
Public Sub dianshengcheng()
        Dim filePath As String = My.Computer.FileSystem.CurrentDirectory & "\ResultsFileName"
        If System.IO.File.Exists(filePath & "\点.shp") Then
            MessageBox.Show("点文件已存在")
            Main.AxMapControl1.AddShapeFile(filePath, "点")
        Else
            Dim pShpWksFact As IWorkspaceFactory = New ShapefileWorkspaceFactory()
            Dim pFeatWks As IFeatureWorkspace
            pFeatWks = CType(pShpWksFact.OpenFromFile(filePath, 0), IFeatureWorkspace)
            Const strShapeFieldName As String = "shape"
            Dim pFields1 As IFields
            Dim pFieldsEdit1 As IFieldsEdit
            pFields1 = New FieldsClass()
            pFieldsEdit1 = CType(pFields1, IFieldsEdit)
            Dim pField1 As IField = New FieldClass()
            Dim pFieldEdit1 As IFieldEdit = New FieldClass()
            pFieldEdit1.Name_2 = strShapeFieldName
            pFieldEdit1.Type_2 = esriFieldType.esriFieldTypeGeometry
            pField1 = CType(pFieldEdit1, IField)
            Dim pGeomDef1 As IGeometryDef = New GeometryDefClass()
            Dim pGeomDefEdit1 As IGeometryDefEdit = New GeometryDefClass()
            pGeomDefEdit1 = CType(pGeomDef1, IGeometryDefEdit)
            pGeomDefEdit1.GeometryType_2 = esriGeometryType.esriGeometryPoint
            pGeomDefEdit1.SpatialReference_2 = Main.AxMapControl1.Map.SpatialReference
            'pGeomDefEdit1.HasZ_2 = True
            pFieldEdit1.GeometryDef_2 = pGeomDef1

            pFieldsEdit1.AddField(pField1)
            pFields1 = CType(pFieldsEdit1, IFields)

            pField1 = New Field
            pFieldEdit1 = pField1
            With pFieldEdit1
                pFieldEdit1.Length_2 = 10
                pFieldEdit1.Name_2 = "温度"
                pFieldEdit1.Type_2 = esriFieldType.esriFieldTypeDouble
            End With
            pFieldsEdit1.AddField(pField1)
            pField1 = New Field
            pFieldEdit1 = pField1
            With pFieldEdit1
                pFieldEdit1.Length_2 = 10
                pFieldEdit1.Name_2 = "盐度"
                pFieldEdit1.Type_2 = esriFieldType.esriFieldTypeDouble
            End With
            pFieldsEdit1.AddField(pField1)
            pField1 = New Field
            pFieldEdit1 = pField1
            With pFieldEdit1
                pFieldEdit1.Length_2 = 10
                pFieldEdit1.Name_2 = "水质指标"
                pFieldEdit1.Type_2 = esriFieldType.esriFieldTypeDouble
            End With
            pFieldsEdit1.AddField(pField1)
            Dim pFeatureClass1 As IFeatureClass
            pFeatureClass1 = pFeatWks.CreateFeatureClass("点", pFields1, Nothing, Nothing, esriFeatureType.esriFTSimple, strShapeFieldName, "")
            Dim pPointCol As IPointCollection = New MultipointClass()
            Dim sr As StreamReader = New StreamReader(My.Computer.FileSystem.CurrentDirectory & "\shu\dianceng.txt")
            Dim str As String = sr.ReadLine()
            While str IsNot Nothing
                Dim strs() As String = Regex.Split(str, "        ")
                Dim x As Double = Convert.ToDouble(strs(0))
                Dim y As Double = Convert.ToDouble(strs(1))
                Dim t As Double = Convert.ToDouble(strs(2))
                Dim s As Double = Convert.ToDouble(strs(3))
                Dim c As Double = Convert.ToDouble(strs(4))
                Dim pPoint As IPoint = New PointClass()
                pPoint.X = x
                pPoint.Y = y
                Dim missing As Object = Type.Missing
                pPointCol.AddPoint(pPoint, missing, missing)
                str = sr.ReadLine()
                Dim i As Integer
                For i = 0 To pPointCol.PointCount - 1 Step 1
                    Dim newFeature As IFeature = pFeatureClass1.CreateFeature
                    newFeature.Shape = pPointCol.Point(i)
                    newFeature.Value(newFeature.Fields.FindField("温度")) = t
                    newFeature.Value(newFeature.Fields.FindField("盐度")) = s
                    newFeature.Value(newFeature.Fields.FindField("水质指标")) = c
                    newFeature.Store()
                Next
            End While
            Main.AxMapControl1.Refresh()
            Main.AxMapControl1.AddShapeFile(filePath, "点")
            MessageBox.Show("文件创建成功")
        End If
    End Sub

[ Last edited by zzahkj on 2011-5-6 at 15:36 ]
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

efeng522

木虫 (初入文坛)



小木虫(金币+0.5):给个红包,谢谢回帖
这个要看你数据量的大小,如果数据量不大,那么这个效率肯定是不正常的;如果数据量确实有这么大,你就要考虑是否有必要一次性生成这么多数据,或者在这么大的空间范围内生成数据。
VB不熟,所以代码没细看,只是泛泛而谈,抛砖引玉
2楼2011-05-06 16:07:05
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zzahkj

木虫 (著名写手)


引用回帖:
Originally posted by efeng522 at 2011-05-06 16:07:05:
这个要看你数据量的大小,如果数据量不大,那么这个效率肯定是不正常的;如果数据量确实有这么大,你就要考虑是否有必要一次性生成这么多数据,或者在这么大的空间范围内生成数据。
VB不熟,所以代码没细看,只是 ...

数据量还是非常大的,必须得一次性生成这么多数据!我也觉得这个效率不正常,可没有很好的办法解决?
3楼2011-05-06 16:25:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiangling1

金虫 (正式写手)



小木虫(金币+0.5):给个红包,谢谢回帖
zzahkj(金币+10): 2011-05-07 15:43:13
后面的循环可以优化,你把For循环提出来

你把三个属性封装一下,循环一次,把三个属性赋进去值

你这样做出来的点的属性值是不对的

你多写几个函数,把这段代码分解开一定不要循环里面再有循环

速度会增加的
4楼2011-05-06 21:31:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zzahkj

木虫 (著名写手)


引用回帖:
Originally posted by xiangling1 at 2011-05-06 21:31:46:
后面的循环可以优化,你把For循环提出来

你把三个属性封装一下,循环一次,把三个属性赋进去值

你这样做出来的点的属性值是不对的

你多写几个函数,把这段代码分解开一定不要循环里面再有循环

速度会 ...

谢谢你啊!我去掉了里面一个循环,6000多个点生成要二十几分钟,这个速度是不是还慢呢?我听说一秒钟就可以生成上万个点才是正常的?
5楼2011-05-07 10:15:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiangling1

金虫 (正式写手)



小木虫(金币+0.5):给个红包,谢谢回帖
恩,还是有些慢,6000个点对于计算机来说是小事一桩

如果你的计算机配置可以,瞬间就可以完成的

我以前用c#,5秒左右可以完成,不过没有这么多点

你先再优化一下,如果不行,你可以发给我,我给你调一下
6楼2011-05-07 13:29:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiangling1

金虫 (正式写手)



小木虫(金币+0.5):给个红包,谢谢回帖
这要是这儿用到的是文件流的,所以速度稍稍有点慢
7楼2011-05-07 13:31:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zzahkj

木虫 (著名写手)


引用回帖:
Originally posted by xiangling1 at 2011-05-07 13:31:30:
这要是这儿用到的是文件流的,所以速度稍稍有点慢

那还有没有办法提高速度?
8楼2011-05-07 15:42:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

雷小雨

银虫 (著名写手)



小木虫(金币+0.5):给个红包,谢谢回帖
没有运行环境,读了一下代码
在while循环里面,第1次for循环生成pPointCol的第1个点
第2次for循环生成pPointCol的第1~2个点
第3次for循环生成pPointCol的第1~3个点
第N次for循环生成pPointCol的第1~N个点

也就说,第i个点生成了N-i+1次,所以并不是生成了N个点,而是生成了N(N+1)/2个点,时间从O(N)上升到了O(N^2),不知道我理解得对不对

[ Last edited by 雷小雨 on 2011-5-8 at 11:38 ]
9楼2011-05-08 11:37:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zzahkj

木虫 (著名写手)


引用回帖:
Originally posted by 雷小雨 at 2011-05-08 11:37:00:
没有运行环境,读了一下代码
在while循环里面,第1次for循环生成pPointCol的第1个点
第2次for循环生成pPointCol的第1~2个点
第3次for循环生成pPointCol的第1~3个点
第N次for循环生成pPointCol的第1~N个点

...

呵呵 是啊  我搞错了  我现在把for循环去掉  速度大概是6000多个点完全生成要二十多分钟,这个速度是快是慢呢,由于我做的是预警系统,十分钟别人都嫌慢,不知还有没有提高速度的方法?
10楼2011-05-08 12:46:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

雷小雨

银虫 (著名写手)



小木虫(金币+0.5):给个红包,谢谢回帖
我去看了一下我以前程序的运行记录,60595个点,1小时52分钟,跟你这个速度差不多,算法跟你一样的

[ Last edited by 雷小雨 on 2011-5-8 at 14:56 ]
11楼2011-05-08 14:50:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zzahkj 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见