MIF格式转SHP格式方法总结

MIF是mapinfo的数据文件,SHP是arcGIS的数据文件, 由MIF格式转成SHP格式,需要注意一点: MIF格式文件所在的目录不能太深,否则mapinfo9.5说转换不正确:

     MIF格式转SHP格式方法总结 - maoxp9 - 牛角尖---毛小平的空间

具体错误信息为: Unbalanced quotation marks encountered on line 1 of file G:\DOCUME~1\mao\LOCALS~1\Temp\ut_parm.txt -- line was `CFGenerate MIF SHAPE "C:\Temp\11\MapInfo交换格式\园分布图\" "G:\DOCUME~1\mao\LOCALS~1\Temp\fme72.tmp" LOG_STANDARDOUT YES +ID "队界" '

另外,有的MIF文件,特别的数据量大的线条文件被破坏掉, 不知是什么原因, 如线条文件,出现怪字符,这时需要手工将它们清掉,或采用程序, 后面附了其IDL程序,来读取MIF文件(注意, 只对线条文件pline arc region等,其它未做过多测试),并转换成正确的MIF文件,再准备由mapinfo9.5转;

打开mapinfo9.5,选择工具/通用转换工具/通用转换工具, 英文是Tools/Universal Translator/Universal Translator,弹出如下菜单,source选择mapinfo mid/mif,Destination选择ESRI.就OK

MIF格式转SHP格式方法总结 - maoxp9 - 牛角尖---毛小平的空间

IDL程序

pro mif_2_mif
 files = DIALOG_PICKFILE(/READ, FILTER = '*.mif',/MULTIPLE_FILES,/MUST_EXIST)

 for j=0,n_elements(files)-1 do begin
  file=files[j]
  v=str_sep(file,'.')
  nv=n_elements(v)
  if nv eq 1 then return
  midfile=strjoin(v[0:nv-2],'.')+'.mid'

  fileshp=strjoin(v[0:nv-2],'.')+'_a.mif'
  filemid=strjoin(v[0:nv-2],'.')+'_a.mid'

  openr,fp,file,/get_lun
  openr,midin,midfile,/get_lun
  version=''
  readf,fp,version
  v=str_sep(version,' ')
  if v[1] ne '450' then begin
   prom=dialog_message('MIF格式不是450版',title='转换出错')
   return
  endif
  openw,lun,fileshp,/get_lun
  openw,mid,filemid,/get_lun
  printf,lun,'Version 300'
  str=''
  str1=''
  readf,fp,str ;Charset
  printf,lun,str
  readf,fp,str ;Delimiter
  printf,lun,str
  for k=0,4 do begin
   readf,fp,str
   printf,lun,str
  endfor
 ; printf,lun,strmid(str,1)  ;坐标系统CoordSys
  readf,fp,str ;Columns
  printf,lun,str
  v=str_sep(str,string(9b))
  ncol=fix(v[1])
  for k=0,ncol-1 do begin
   readf,fp,str
   printf,lun,str
  endfor
  readf,fp,str ;Data
  printf,lun,str
  readf,fp,str ;''
  printf,lun,''
  ID=0L
  sum=0L
  err_num=0L
  while not eof(fp) do begin
   readf,fp,str ;Pline  186
markpline:
   u=str_sep(str,' ')
   if n_elements(u) eq 1 then u=str_sep(str,string(9b))
   ind=where(strlen(u) ne 0,count)
   if count eq 0 then continue   ;空行
   u=u[ind]
   type=u[0]
   case type of
   'Pline': begin
     n=long(u[1])
     p=dblarr(2,n)
     CATCH, Error_status
     IF Error_status NE 0 THEN BEGIN
      err_num=err_num+1
      print,'err=',sum
      while not eof(fp) do begin
       readf,fp,str
       if strpos(str,'Region') ge 0 then goto,markpline
       if strpos(str,'Pline') ge 0 then goto,markpline
       if strpos(str,'Text') ge 0 then goto,markpline
       if strpos(str,'Arc') ge 0 then goto,markpline
      endwhile
      break
     endif
     printf,lun,str
     readf,fp,p
     readf,midin,str
     printf,mid,str
     for k=0,n-1 do $
      printf,lun,p[*,k],format='(d0,1x,d0)'
     sum=sum+n
     ID=ID+1
    end
    'Text':begin
     printf,lun,str  ;'Text'
     readf,fp,str
     printf,lun,str  ;94942.38 1439....
     readf,midin,str
     printf,mid,str
    end
    'None':begin
     printf,lun,str  ;'Text'
     readf,fp,str
     printf,lun,str  ;94942.38 1439....
     readf,midin,str
     printf,mid,str
    end
    'Arc':begin
     printf,lun,str
     readf,midin,str
     printf,mid,str
    end
    'Region':begin
     readf,fp,str1
     n=long(str1)
     p=dblarr(2,n)
     CATCH, Error_status
     IF Error_status NE 0 THEN BEGIN
      err_num=err_num+1
      print,'err=',sum
      while not eof(fp) do begin
       readf,fp,str
       if strpos(str,'Region') ge 0 then goto,markpline
       if strpos(str,'Pline') ge 0 then goto,markpline
       if strpos(str,'Text') ge 0 then goto,markpline
       if strpos(str,'Arc') ge 0 then goto,markpline
      endwhile
      break
     endif
     printf,lun,str
     printf,lun,str1
     readf,fp,p
     for k=0,n-1 do $
      printf,lun,p[*,k],format='(d0,1x,d0)'
     readf,midin,str
     printf,mid,str
     sum=sum+n
     ID=ID+1    
    end
   else:begin
    if strmid(type,0,1) lt '0' or strmid(type,0,1) gt '9' then begin
     prom=dialog_message(file+'有不识别的类型'+type+',是否退出?',/question)
     if prom eq 'Yes' then goto,endall
    endif else begin      ;遇到填充子区时,中间是一个数字
     printf,lun,str
     while not eof(fp) do begin
      readf,fp,str
      if strpos(str,'Region') ge 0 then goto,markpline
      if strpos(str,'Pline') ge 0 then goto,markpline
      if strpos(str,'Text') ge 0 then goto,markpline
      if strpos(str,'Arc') ge 0 then goto,markpline
      printf,lun,str
     endwhile
    endelse
   end
   endcase
  endwhile
endall:
  free_lun,fp
  free_lun,midin
  free_lun,lun
  free_lun,mid
  print,'ID=',ID

 endfor

end

 

 

http://maoxp9.blog.163.com/blog/static/12265342009222819589/

 

.

展开阅读全文

没有更多推荐了,返回首页