Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gCentroid(rgeos)R与实际质心(python中)_Python_R_Numpy_Polygon_Centroid - Fatal编程技术网

gCentroid(rgeos)R与实际质心(python中)

gCentroid(rgeos)R与实际质心(python中),python,r,numpy,polygon,centroid,Python,R,Numpy,Polygon,Centroid,总结:我认为在R中使用gCentroid将返回一组点的质心,但是我意识到,出于某种原因,它实际上返回几何平均值,而不是质心 我想复制在R中进行的质心计算: gCentroid{rgeos} 这些点的质心: 34.7573, -86.678606 38.30088, -76.520266 38.712147, -77.158616 39.704905, -84.126463 。。。使用r脚本 require(rgdal) require(rgeos) no_am_

总结:我认为在R中使用gCentroid将返回一组点的质心,但是我意识到,出于某种原因,它实际上返回几何平均值,而不是质心

我想复制在R中进行的质心计算:

gCentroid{rgeos}

这些点的质心:

34.7573,    -86.678606  
38.30088,   -76.520266  
38.712147,  -77.158616  
39.704905,  -84.126463  
。。。使用r脚本

require(rgdal)
require(rgeos)

no_am_eq_co <- "+proj=eqdc +lat_0=0 +lon_0=0 +lat_1=20 +lat_2=60 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs"
wgs84 <- "+proj=longlat +datum=WGS84"

df <- as.data.frame(list(c(34.7573, 
                           38.30088, 
                           38.712147, 
                           39.704905),
                         c(-86.678606,
                           -76.520266,
                           -77.158616, 
                           -84.126463)))

df$Name <- "points_A"
colnames(df) <- c("lat", "lon", "Name")

# FROM: Coordinates are geographic latitude/longitudes
coordinates(df) <- c("lon", "lat")
proj4string(df) <- CRS(wgs84)

# TO: Project into North America Equidistant Conic
df <- spTransform(df, CRS(no_am_eq_co))

# Get centroids
ctrs <- lapply(unique(df$Name), 
               function(x) gCentroid(SpatialPoints(df[df$Name==x,])))
ctrsout <- setNames( ctrs , unique(df$Name ) )

# Create data frame 
df <- do.call(rbind, lapply(ctrsout, data.frame, stringsAsFactors=FALSE))
coordinates(df) <- c("x", "y")
proj4string(df) <- CRS(no_am_eq_co) 
df <- as.data.frame(spTransform(df, CRS(wgs84)))
names(df) <- c("longitude", "latitude")

print(df$latitude)
print(df$longitude)  
我用python构建了以下示例—我想使用以下方法复制计算:

从中我得到:

37.72876321 -82.35113685  
不是:

通过进一步挖掘,我添加了一个函数,给出几何平均值:

Centroid calculation: [ 37.72876321 -82.35113685]
Mean calculation [ 37.94873834 -81.18378815]
我意识到,出于某种原因,gCentroid似乎在计算几何平均值,而不是特征质心(我添加了一个平均值函数,您可以看到它与R结果相匹配)

编辑:

我认为可能的原因是:因为我有一组点,而不是通过它们拟合一个随机多边形(如示例中的我),或者甚至是一个凸包,然后取其质心,如果数据类型是“点”,则该命令将默认为平均计算。所以我明确地给它传递了一个多边形:

x = readWKT(paste("POLYGON((-6424797.94257892  7164920.56353916,
                  -5582828.69570672  6739129.64644454,
                  -5583459.32266293  6808624.95123077,
                  -5855637.16642608  7316808.01148585,
                  -5941009.53089084  7067939.71641507,
                  -6424797.94257892  7164920.56353916))"))

python_cent = readWKT(paste("POINT(-5941009.53089084  7067939.71641507)"))
r_cent = gCentroid(x) 

plot(x)
plot(r_cent,add=T,col='red')
plot(python_cent, add=T,col='green')
其中python质心为:

centroid = get_polygon_centroid(np.array([[-6424797.94257892,  7164920.56353916],
                                             [-5582828.69570672,  6739129.64644454],
                                             [-5583459.32266293,  6808624.95123077],
                                             [-5855637.16642608, 7316808.01148585],
                                             [-6424797.94257892, 7164920.56353916]]))
然后以红色绘制该多边形的质心(-5875318 7010915),以绿色绘制同一多边形的质心(-5941009 7067939),以蓝色绘制简单平均值(-5974304 7038880):


结果是:如果提供了一组“点”,则该命令将自动为您提供投影坐标的平均值,而不是通过这些点猜测多边形或生成凸包

但是,如果提供多边形,则会得到一个质心(与python脚本相同)-在我的python示例中,我缺少一个坐标:

centroid = get_polygon_centroid(np.array([[-6424797.94257892,  7164920.56353916],
                                             [-5582828.69570672,  6739129.64644454],
                                             [-5583459.32266293,  6808624.95123077],
                                             [-5855637.16642608, 7316808.01148585],
                                             [-5941009.53089084,  7067939.71641507],
                                             [-6424797.94257892, 7164920.56353916]]))
#polygon closed
#[-5875317.84402261  7010915.37286505]
所以运行这个R脚本:

x = readWKT(paste("POLYGON((-6424797.94257892  7164920.56353916,
                  -5582828.69570672  6739129.64644454,
                  -5583459.32266293  6808624.95123077,
                  -5855637.16642608  7316808.01148585,
                  -5941009.53089084  7067939.71641507,
                  -6424797.94257892  7164920.56353916))"))

python_cent = readWKT(paste("POINT(-5875317.84402261  7010915.37286505)"))
r_cent = gCentroid(x) 

plot(x)
plot(r_cent,add=T,col='red', pch = 0)
plot(python_cent, add=T,col='green', pch = 1)
一切都很匹配:


如果有兴趣,我在我的网站上添加了更多的信息。

您是否检查了坐标变换的结果在这两种情况下是否相同?如果您只想调试质心计算,最好完全取消坐标变换。也使人们更容易运行您的代码:)对不起,是的,您是对的。对于编辑下面的位,我使用投影坐标,但是结果仍然相同
centroid = get_polygon_centroid(np.array([[-6424797.94257892,  7164920.56353916],
                                             [-5582828.69570672,  6739129.64644454],
                                             [-5583459.32266293,  6808624.95123077],
                                             [-5855637.16642608, 7316808.01148585],
                                             [-6424797.94257892, 7164920.56353916]]))
centroid = get_polygon_centroid(np.array([[-6424797.94257892,  7164920.56353916],
                                             [-5582828.69570672,  6739129.64644454],
                                             [-5583459.32266293,  6808624.95123077],
                                             [-5855637.16642608, 7316808.01148585],
                                             [-5941009.53089084,  7067939.71641507],
                                             [-6424797.94257892, 7164920.56353916]]))
#polygon closed
#[-5875317.84402261  7010915.37286505]
x = readWKT(paste("POLYGON((-6424797.94257892  7164920.56353916,
                  -5582828.69570672  6739129.64644454,
                  -5583459.32266293  6808624.95123077,
                  -5855637.16642608  7316808.01148585,
                  -5941009.53089084  7067939.71641507,
                  -6424797.94257892  7164920.56353916))"))

python_cent = readWKT(paste("POINT(-5875317.84402261  7010915.37286505)"))
r_cent = gCentroid(x) 

plot(x)
plot(r_cent,add=T,col='red', pch = 0)
plot(python_cent, add=T,col='green', pch = 1)