You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinBUGS导入美国县界SPlus文件时出现Index Out of Range错误求助

美国县界Shapefile转WinBUGS SPlus格式失败:索引越界问题

问题描述

我使用以下R代码将ArcGIS美国县界Shapefile转换为WinBUGS兼容的SPlus格式:

library(maptools)
library(sp)
usa_counties <- readShapePoly("E:\\USA_Counties.shp", IDvar = "CNTY_FIPS")
# 转换为WinBUGS S-Plus格式
splus_data <- sp2WB(as(usa_counties, "SpatialPolygons"), filename = "E:\\USA_Counties.txt")

此前已成功将美国州界文件导入WinBUGS,但导入县界SPlus文件时失败,系统提示索引越界(index out of range),完整错误堆栈如下:

index out of range

         MapsSplus.Import   [00000569H] 
.centreX    REAL    0.0
.centreY    REAL    0.0
.i  INTEGER 10000
.id INTEGER 3221
.map    MapsMap.Map [029B0F80H] 
.name   ARRAY 80 OF CHAR    "area20"   ...
.numReg INTEGER 3221
.ok BOOLEAN TRUE
.polygon    MapsMap.Polygon [02BAB8B0H] 
.pos    INTEGER 19
.region MapsMap.Region  [02A0CAB0H] 
.s  TextMappers.Scanner Fields
.string ARRAY 80 OF CHAR    "area20"   ...
.x  ARRAY 10000 OF REAL Elements
.xScale REAL    1.0
.y  ARRAY 10000 OF REAL Elements
.yScale REAL    1.0
      MapsImporter.Import   [00000164H] 
.f  Files.File  NIL
.fileName   Files.Name  ""   ...
.item   Meta.Item   Fields
.loc    Files.Locator   NIL
.m  Models.Model    [029910F0H] 
.map    MapsMap.Map [029B0F80H] 
.ok BOOLEAN TRUE
.pos    INTEGER 0
.protocol   ARRAY 256 OF CHAR   "MapsSplus"
.res    INTEGER 0
.s  TextMappers.Scanner Fields
.string ARRAY 120 OF CHAR   "MapsSplus.Import"
.text   TextModels.Model    [029910F0H] 
.v  MapsImporter.RECORD Fields
.wr Stores.Writer   Fields
    StdInterpreter.CallProc   [0000047AH] 
.a  BOOLEAN FALSE
.b  BOOLEAN FALSE
.c  BOOLEAN FALSE
.i  Meta.Item   Fields
.imported   ARRAY 256 OF CHAR   ""   ...
.importing  ARRAY 256 OF CHAR   ""   ...
.mn Meta.Name   "MapsImporter"
.mod    StdInterpreter.Ident    "MapsImporter"
.object ARRAY 256 OF CHAR   ""   ...
.ok BOOLEAN TRUE
.parType    INTEGER 3
.pn Meta.Name   "Import"
.proc   StdInterpreter.Ident    "Import"   ...
.res    INTEGER 0
.v  StdInterpreter.ProcVal  Fields
.vi StdInterpreter.ProcIVal Fields
.vii    StdInterpreter.ProcIIVal    Fields
.vr StdInterpreter.ProcRVal Fields
.vri    StdInterpreter.ProcRIVal    Fields
.vrii   StdInterpreter.ProcRIIVal   Fields
.vrr    StdInterpreter.ProcRRVal    Fields
.vrri   StdInterpreter.ProcRRIVal   Fields
.vrrii  StdInterpreter.ProcRRIIVal  Fields
.vrs    StdInterpreter.ProcRSVal    Fields
.vrsi   StdInterpreter.ProcRSIVal   Fields
.vrsii  StdInterpreter.ProcRSIIVal  Fields
.vs StdInterpreter.ProcSVal Fields
.vsi    StdInterpreter.ProcSIVal    Fields
.vsii   StdInterpreter.ProcSIIVal   Fields
.vsr    StdInterpreter.ProcSRVal    Fields
.vsri   StdInterpreter.ProcSRIVal   Fields
.vsrii  StdInterpreter.ProcSRIIVal  Fields
.vss    StdInterpreter.ProcSSVal Fields
.vssi   StdInterpreter.ProcSSIVal   Fields
.vssii  StdInterpreter.ProcSSIIVal  Fields
      StdInterpreter.Command   [0000131CH] 
.left   StdInterpreter.Ident    "MapsImporter"
.ptype  INTEGER 3
.right  StdInterpreter.Ident    "Import"   ...
    StdInterpreter.CallHook.Call   [00001441H] 
.ch CHAR    0X
.e  ARRAY 64 OF CHAR    ""   ...
.errorMsg   ARRAY 2 OF CHAR " "
.f  ARRAY 64 OF CHAR    ""   ...
.g  ARRAY 64 OF CHAR    ""   ...
.hook   StdInterpreter.CallHook [029F0050H] 
.i  INTEGER 33
.i0 INTEGER 0
.i1 INTEGER 0
.id StdInterpreter.Ident    "Import"   ...
.par0   Dialog.String   ""   ...
.par1   Views.Title ""   ...
.proc   ARRAY 33 OF CHAR    "MapsImporter.Import('MapsSplus')"   ...
.res    INTEGER 0
.s0 Dialog.String   "MapsSplus"
.s1 Dialog.String   ""   ...
.type   INTEGER 3
.x  INTEGER 0
        Dialog.Call   [00002FC8H] 
.errorMsg   ARRAY 2 OF CHAR " "
.proc   ARRAY 33 OF CHAR    "MapsImporter.Import('MapsSplus')"   ...
.res    INTEGER 0
     StdDialog.HandleItem   [0000084BH] 
.i  StdDialog.Item  [02AC0020H] 
.res    INTEGER 0
     HostMenus.HandleCustomMenu   [0000209EH] 
.i  StdDialog.Item  [02AC0020H] 
.id INTEGER 410
.m  HostMenus.Menu  [02ABF6C0H] 
   HostMenus.MenuCommand   [0000221AH] 
.id INTEGER 410
.lParam INTEGER 0
.old    INTEGER 65539
.res    INTEGER 0
.wParam INTEGER 410
.wnd    INTEGER 1116432
    Kernel.Try   [00003A61H] 
.a  INTEGER 1116432
.b  INTEGER 410
.c  INTEGER 0
.h  PROCEDURE   HostMenus.MenuCommand
   HostMenus.ApplWinHandler   [0000378AH] 
.Proc   PROCEDURE   NIL
.hit    BOOLEAN FALSE
.lParam INTEGER 0
.message    INTEGER 273
.res    INTEGER 0
.s  ARRAY 256 OF SHORTCHAR  2X   ...
.w  INTEGER 0
.wParam INTEGER 410
.wnd    INTEGER 1116432
 &lt;system&gt;   (pc=776E2E52H,  fp=0061FA94H)
  &lt;system&gt;   (pc=776D3C25H,  fp=0061FB8CH)
 &lt;system&gt;   (pc=776D24E4H,  fp=0061FC08H)
   &lt;system&gt;   (pc=77746D0FH,  fp=0061FC10H)
   HostMenus.Loop   [00003BDEH] 
.done   BOOLEAN FALSE
.f  SET {0..5}
.n  INTEGER 1
.res    INTEGER 0
.w  HostWindows.Window  NIL
 Kernel.Start   [00002B8CH] 
.code   PROCEDURE   HostMenus.Loop

排查与解决方向

  • WinBUGS坐标点上限触发:从错误堆栈里的.x ARRAY 10000 OF REAL Elements和.y ARRAY 10000 OF REAL Elements可以看出,WinBUGS对SPlus地图的单文件坐标点总数存在限制,县界的坐标点远多于州界,超出上限导致索引越界。
    • 简化Shapefile:用rgeos包的gSimplify函数删除冗余坐标点,降低总点数后再转换
    • 拆分文件:将县界按区域拆分为多个小文件,分别导入WinBUGS
  • sp2WB转换异常:sp2WB对复杂多边形(如带洞的县界)处理可能存在缺陷,导致转换后的文件不完整。
    • 修复Shapefile拓扑:先检查并修复无效多边形,再进行转换
    • 更换读取方式:用rgdal包读取Shapefile,转换为SpatialPolygons对象后再调用sp2WB
  • 版本兼容性问题:旧版WinBUGS对大型地图支持不足,尝试升级到最新稳定版本

内容的提问来源于stack exchange,提问作者Sorif Hossain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:34:56