zhangzhibin3619
路人甲
路人甲
  • 注册日期2007-02-05
  • 发帖数23
  • QQ
  • 铜币229枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1950回复:5

生成shp文件时,往shp中增加记录时速度很慢

楼主#
更多 发布于:2007-06-06 09:54
<P> while not UDM.cdsMaster.Eof do<BR>  begin<BR>    FrmSchedule.ProgressBar.Position := i;<BR>    Lon := UDM.cdsMaster.FieldByName('LONGTITUDE').AsFloat;<BR>    Lat := UDM.cdsMaster.FieldByName('LATITUDE').AsFloat;<BR>    PoliceMan := UDM.cdsMaster.FieldByName('NAME').AsString;<BR>    HandSet := UDM.cdsMaster.FieldByName('LOGIN_NAME').AsString;<BR>    DeptName := UDM.cdsMaster.FieldByName('GROUPID').AsString;</P>
<P>    X:=0;<BR>    Y:=0;<BR>    C:=114.0;<BR>    L:=Lon;<BR>    B:=Lat;<BR>    SgMidServ := TsgMidServ.Create(NIL);<BR>    SgMidServ.sgGPSCvtBL2XY(B,L,C,1,Y,X);<BR>    Pt.X := X;<BR>    Pt.Y := Y;</P>
<P>    Recs:=IMoMapLayer(MainForm.MostMap.layers.item('警员位置')).Records;<BR>    Recs.AddNew;<BR>    Recs.fields.item('shape').value:=pt;<BR>    Recs.fields.item('NAME').value:=PoliceMan;<BR>    Recs.fields.item('LOGIN_NAME').value:=HandSet;<BR>    Recs.fields.item('GROUPID').value:=DeptName;<BR>    Recs.fields.item('X').value:=X;<BR>    Recs.fields.item('Y').value:=Y;<BR>    Recs.update;<BR>    Recs.stopediting;</P>
<P>    UDM.cdsMaster.Next;<BR>    i := i+1;<BR>  end;<BR>  UDM.cdsMaster.Close;</P>

<P>主要是这段代码很慢:</P>
<P>    Recs.AddNew;<BR>    Recs.fields.item('shape').value:=pt;<BR>    Recs.fields.item('NAME').value:=PoliceMan;<BR>    Recs.fields.item('LOGIN_NAME').value:=HandSet;<BR>    Recs.fields.item('GROUPID').value:=DeptName;<BR>    Recs.fields.item('X').value:=X;<BR>    Recs.fields.item('Y').value:=Y;<BR>    Recs.update;<BR>    Recs.stopediting;</P>
<P>哪个兄弟有没有好的建议?</P>
喜欢0 评分0
wrorig
路人甲
路人甲
  • 注册日期2006-05-10
  • 发帖数4
  • QQ
  • 铜币123枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2007-06-16 10:53
<P>可以用事务的方式:</P>
<P>//获取记录集,启动事务</P>
<P>   function THHUGIS.openRsForHugeAdd(ln:string):boolean;<BR>var<BR>   index:integer;<BR>   wddl : IMoMapLayer;   <BR>begin<BR>   result:=false;</P>
<P>   index:=getLayerIndex(ln);<BR>   if (index<0) then exit;</P>
<P>   wddl := getLayerObject(ln);<BR>   rsForHugeAdd := IMoRecordset(wddl.Records);<BR>   rsForHugeAdd.AutoFlush := false;<BR>   rsForHugeAdd.StartTransaction();<BR>   <BR>   result:=true;<BR>end;</P>

<P>反复增加记录</P>
<P>function THHUGIS.addElementToRsForHugeAdd(id:integer; x, y:double; d:double):boolean;<BR>var<BR>    p:IMoPoint;<BR>    field:IMoField;<BR>begin<BR>   p := IMoPoint(CreateOleObject('MapObjects2.Point'));<BR>   p.X := X;<BR>   p.Y := Y;<BR>   RsForHugeAdd.AddNew();<BR>   if  (RsForHugeAdd.EditMode = moEditAdd) then<BR>   begin</P>
<P>      field:= IMoField(RsForHugeAdd.Fields.Item('ID'));<BR>      field.Value := id ;<BR>      field:= IMoField(RsForHugeAdd.Fields.Item('Shape'));<BR>      field.Value := p;<BR>      field:= IMoField(RsForHugeAdd.Fields.Item('prop'));<BR>      field.Value := d;<BR>      RsForHugeAdd.Update();<BR>   end;<BR>   result:=true;<BR>end;</P>

<P>//提交失误</P>
<P>function THHUGIS.closeRsForHugeAdd():boolean;<BR>begin<BR>   rsForHugeAdd.CommitTransaction();<BR>   rsForHugeAdd.AutoFlush := true;<BR>   <BR>end;</P>

<P>我用的20几万个点很快就加载完毕</P>
举报 回复(0) 喜欢(0)     评分
zhangzhibin3619
路人甲
路人甲
  • 注册日期2007-02-05
  • 发帖数23
  • QQ
  • 铜币229枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2007-07-30 17:07
<P>现在的问题不是读数据慢,而是生成shp文件时很慢</P>
举报 回复(0) 喜欢(0)     评分
whmwxhanshan123
路人甲
路人甲
  • 注册日期2006-06-17
  • 发帖数3108
  • QQ
  • 铜币6445枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2007-07-31 13:22
<img src="images/post/smile/dvbbs/em05.gif" />
举报 回复(0) 喜欢(0)     评分
cafecat
路人甲
路人甲
  • 注册日期2003-07-29
  • 发帖数375
  • QQ
  • 铜币894枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2007-10-07 10:23
<P>recordset.autoflush=false</P>
<P>插入数据</P>
<P>recordset.autoflush=true</P>
http://3s2go.blogspot.com/
举报 回复(0) 喜欢(0)     评分
cafecat
路人甲
路人甲
  • 注册日期2003-07-29
  • 发帖数375
  • QQ
  • 铜币894枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2007-10-07 10:25
<P>二楼说的是对的,关键不是启用事务,而是启用批提交</P>
http://3s2go.blogspot.com/
举报 回复(0) 喜欢(0)     评分
游客

返回顶部