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 <system> (pc=776E2E52H, fp=0061FA94H) <system> (pc=776D3C25H, fp=0061FB8CH) <system> (pc=776D24E4H, fp=0061FC08H) <system> (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
- 简化Shapefile:用
- sp2WB转换异常:
sp2WB对复杂多边形(如带洞的县界)处理可能存在缺陷,导致转换后的文件不完整。- 修复Shapefile拓扑:先检查并修复无效多边形,再进行转换
- 更换读取方式:用
rgdal包读取Shapefile,转换为SpatialPolygons对象后再调用sp2WB
- 版本兼容性问题:旧版WinBUGS对大型地图支持不足,尝试升级到最新稳定版本
内容的提问来源于stack exchange,提问作者Sorif Hossain
相关产品推荐
相关产品推荐

