Geolocation 将GIS点与ESRI图形文件中的多边形匹配

Geolocation 将GIS点与ESRI图形文件中的多边形匹配,geolocation,gis,geocoding,geospatial,esri,Geolocation,Gis,Geocoding,Geospatial,Esri,我有一个ESRI形状文件,其中包含一个由大约150个相邻地理区域(多边形)组成的库,这些区域共同构成一个地理区域。我还有一个csv文件,其中包含60000个事件,每个事件都有一组唯一的x、y点坐标。csv文件中的每个事件都发生在形状文件中150个多边形中的一个(并且只有一个)内,但我不知道要将哪个多边形与每个记录关联。因此,我需要编写一个算法,找出60000个事件中每个事件发生的多边形的标识。我需要编写的算法的输出将使我能够随后计算统计数据,例如特定多边形(地理区域)内发生特定类型事件的可能性

我有一个ESRI形状文件,其中包含一个由大约150个相邻地理区域(多边形)组成的库,这些区域共同构成一个地理区域。我还有一个csv文件,其中包含60000个事件,每个事件都有一组唯一的x、y点坐标。csv文件中的每个事件都发生在形状文件中150个多边形中的一个(并且只有一个)内,但我不知道要将哪个多边形与每个记录关联。因此,我需要编写一个算法,找出60000个事件中每个事件发生的多边形的标识。我需要编写的算法的输出将使我能够随后计算统计数据,例如特定多边形(地理区域)内发生特定类型事件的可能性

(当然,形状文件不仅仅是一个文件。它是一个包含8个文件的目录,文件扩展名包括.dbf、.prj、.qix、.sbn、.sbx、.shp、.xml和.shx。)

我没有ArcGIS许可证。我在中找到了Geodatabase API文件,但我不确定它是否是正确的工具集,而且我在查找示例代码时也遇到了问题

有人能给我看一些代码来查找大量点(来自外部数据源,如csv文件)中的每个点属于哪个多边形(来自形状文件)?

此外,我需要指定我需要能够为每个事件的csv记录添加相关多边形标识的特定代码。因此,仅仅在地图上绘制点来可视化包含事件的多边形是不够的。我根本不需要将这些数据可视化。相反,我需要的是能够为csv文件中的每个事件记录标记一个多边形id,以便我可以进行本质上不可见的后续数值分析

我们也非常感谢您提供有关此主题的文章、教程和其他资源的链接。我想这是一个人们每天都在解决的问题,所以如果一个人知道如何寻找它,那么一定有一个已建立的代码库。我每天都用Java编写代码,所以首选Java解决方案。但是,如果您有一个用不同语言编写的好代码示例,我可以从另一种语言移植一些东西


*编辑:
根据Spacedman的建议,我尝试了以下R代码,得到了以下错误消息:

> myCSV <- read.csv(file="myCSVFile.csv",head=TRUE,sep=",")  
> pts = SpatialPoints(myCSV)  
> ZipCodes = readShapeSpatial("path/myshapefile.shp")  
> overlay(myCSV,ZipCodes)  
Error in function (classes, fdef, mtable)  : unable to find an inherited method for function "overlay", for signature "data.frame", "SpatialPolygonsDataFrame"  
> 

查找包含邮政编码的字段的名称。在我运行summary(ZipCodes)之前,脚本只是列出每个邮政编码的索引,而不是邮政编码本身。

用于执行点/多边形操作的java库是JTS:

您可能需要其他内容来阅读shapefile,可能是:

或者可能是OGR和GDAL的java绑定:

然而。。你可能只需要一个开源的GIS软件包就可以做到这一点:Quantum GIS是我最喜欢的,但是如果你想要一个基于Java的软件包,有几个——OpenJump,gvSIG(www.osgeo.org,关于这些东西的一切)

在R中,如果已将点坐标读入矩阵或数据帧:

> xy
            [,1]       [,2]
 [1,]  15.224275  -0.840066
 [2,]  -1.207046   7.959644
 [3,]   9.397658  17.426323
 [4,]  28.242840 -29.581008
 [5,]  18.664603  15.361146
 [6,]   0.975846   8.534910
 [7,] -10.941825  10.438541
 [8,] -10.331097  20.260005
 [9,]   8.105570   9.595169
[10,] -14.468177  14.366980
然后,使用maptools包及其依赖项:

> require(maptools)
首先根据坐标创建一个SpatialPoints对象:

> pts = SpatialPoints(xy)
然后在shapefile中阅读:

> africa=readShapeSpatial("/path/to/africa.shp")
现在覆盖:

> overlay(pts,africa)
 [1] 12 20 39 27 10 55 22 33 40 45
这是shapefile中的行号向量。您可以很容易地在shapefile中查找属性:

> africa$CNTRY_NAME[overlay(pts,africa)]
 [1] Congo      Ghana      Niger      Lesotho    Chad       Togo      
 [7] Guinea     Mauritania Nigeria    Senegal   
61 Levels: Algeria Angola Benin Botswana Burkina Faso Burundi ... Zimbabwe
然后,如果要将向量写入CSV文件

> write.csv(africa$CNTRY_NAME[overlay(pts,africa)],file="out.csv")
产生:

"","x"
"1","Congo"
"2","Ghana"
"3","Niger"
"4","Lesotho"
"5","Chad"
"6","Togo"
"7","Guinea"
"8","Mauritania"
"9","Nigeria"
"10","Senegal"
逗号分隔,带引号,标题为“x”。这些东西可以通过其他选项进行调整以写入.csv

如果您的任何点落在多边形之外,则返回覆盖向量将为“NA”值,您可能需要测试:

> if(any(is.na(overlay(pts,africa)))){stop("splash!")}
Error: splash!

Nuff?

对于不进行编程的GUI解决方案,您可以看看软件

它将加载您的多边形形状文件没有任何问题,也可以处理

这里不应该有60k点的问题——我在笔记本电脑上使用过更大的数据集

然后,获取多边形的属性就如同在两个数据集上执行一个操作一样简单

此操作的结果将是与输入数据加上已连接多边形的属性相等的点图层

如果涉及太多的点击,或者如果您需要经常重复此类分析,您可以考虑使用脚本编写此过程


对于其他解决方案,请查看GIS SE站点上的问题。

我认为用R编写代码并不太难。R是可接受的解决方案吗?@RomanLuštrik,R可以工作。我想看看示例代码+谢谢你试图帮助我。你是在ZipCodes上覆盖myCSV,而不是“pts”空间点对象!错误消息是“我不知道如何将数据帧覆盖到空间多边形数据帧上”。叠加(pts,ZipCodes)应该可以使用。@Spacedman,谢谢。我发布了我最终使用的工作代码。但我有一个问题。该代码的输出是一个与我的输入csv文件长度完全相同的csv文件,并且在输入的x、y坐标为零的每个记录处都包含NA。因此,我觉得手动将输出作为缺少此数据的原始电子表格中的新列插入就可以了。您认为我应该做更多的事情来验证每个输出代码与原始数据中每一行的对应关系吗?如果是,我还能做什么?我只是假设输出和输入的顺序相同。是的,overlay的输出与输入中的“pts”的顺序相同,这与myData.csv的顺序相同。谢谢+谢谢你帮我解决这个问题。我以前用R编码过。我可以再次下载并研究它,如果你认为它会使编码变得那么容易的话。我知道如何将.csv数据输入到R中,而且我可能很容易将您的“匹配项”输出到.csv中。但是你愿意发布一个更完整的版本吗
"","x"
"1","Congo"
"2","Ghana"
"3","Niger"
"4","Lesotho"
"5","Chad"
"6","Togo"
"7","Guinea"
"8","Mauritania"
"9","Nigeria"
"10","Senegal"
> if(any(is.na(overlay(pts,africa)))){stop("splash!")}
Error: splash!