标签: centroid

定位球面多边形的质心(质心)

我正在尝试找出如何最好地找到覆盖在单位球体上的任意形状的质心,其中输入是形状边界的有序(顺时针或反cw)顶点.顶点的密度沿边界是不规则的,因此它们之间的弧长通常不相等.因为形状可能非常大(半个半球),所以通常不可能简单地将顶点投影到平面并使用平面方法,如维基百科上详述的那样(抱歉,我不允许超过2个超链接作为新手).稍微好一点的方法是使用在球坐标中操纵的平面几何,但同样,对于大的多边形,这种方法失败了,这里很好地说明.在同一页上,'Cffk'强调了这篇论文,该论文描述了一种计算球面三角形质心的方法.我试图实现这种方法,但没有成功,我希望有人能发现问题?

我保留了与文章中类似的变量定义,以便于比较.输入(数据)是经度/纬度坐标列表,由代码转换为[x,y,z]坐标.对于每个三角形,我任意地将一个点固定为+ z-极,另外两个顶点由沿着多边形边界的一对相邻点组成.代码沿边界步进(从任意点开始),依次使用多边形的每个边界段作为三角形边.针对这些单独的球形三角形中的每一个确定子质心,并且根据三角形区域对它们进行加权并且将其相加以计算总多边形质心.我在运行代码时没有遇到任何错误,但返回的总质心显然是错误的(我已经运行了一些非常基本的形状,其中质心位置是明确的).我没有在返回的质心位置找到任何合理的模式......所以目前我不确定出现了什么问题,无论是数学还是代码(尽管,怀疑是数学).

如果您想尝试,下面的代码应该按原样进行复制粘贴.如果您安装了matplotlib和numpy,它将绘制结果(如果不这样,它将忽略绘图).您只需将代码下方的经度/纬度数据放入名为example.txt的文本文件中即可.

from math import *
try:
    import matplotlib as mpl
    import matplotlib.pyplot
    from mpl_toolkits.mplot3d import Axes3D
    import numpy
    plotting_enabled = True
except ImportError:
    plotting_enabled = False

def sph_car(point):
    if len(point) == 2:
        point.append(1.0)
    rlon = radians(float(point[0]))
    rlat = radians(float(point[1]))
    x = cos(rlat) * cos(rlon) * point[2]
    y = cos(rlat) * sin(rlon) * point[2]
    z = sin(rlat) * point[2]
    return [x, y, z]

def xprod(v1, v2):
    x = v1[1] * …
Run Code Online (Sandbox Code Playgroud)

python geometry centroid

38
推荐指数
2
解决办法
4749
查看次数

OpenCV 2 Centroid

我试图找到轮廓的质心,但在C++(OpenCV 2.3.1)中实现示例代码时遇到了问题.谁能帮我吗?

c++ opencv image-processing centroid

10
推荐指数
2
解决办法
3万
查看次数

比质心更好的"中心点"

我正在使用多边形的质心在地图应用程序中附加标记.这对于凸多边形非常好,对于许多凹多边形非常有用.

然而,一些多边形(香蕉,甜甜圈)显然不会产生所需的结果:在这些情况下,质心在多边形区域之外.

有没有人知道更好的方法任何多边形区域(可能包含孔!)中找到合适的点来附加标记?

在此输入图像描述

algorithm geometry center computational-geometry centroid

9
推荐指数
2
解决办法
329
查看次数

如何使用sf :: st_centroid计算多边形的质心?

我试图使用新的"sf"包来操纵R中的一些巴西人口普查数据.我能够导入数据,但是当我尝试创建原始多边形的质心时出现错误

library(sf)

#Donwload data  
filepath <- 'ftp://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_de_setores_censitarios__divisoes_intramunicipais/censo_2010/setores_censitarios_shp/ac/ac_setores_censitarios.zip'
download.file(filepath,'ac_setores_censitarios.zip')
unzip('ac_setores_censitarios.zip')
d <- st_read('12SEE250GC_SIR.shp',stringsAsFactors = F) 
Run Code Online (Sandbox Code Playgroud)

现在我尝试创建一个包含"几何体"列的质心的新几何列,但是会收到错误:

d$centroid <- st_centroid(d$geometry)
Warning message:
In st_centroid.sfc(d$geometry) :
  st_centroid does not give correct centroids for longitude/latitude data
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

r polygon centroid r-sf

8
推荐指数
1
解决办法
5264
查看次数

7
推荐指数
1
解决办法
4509
查看次数

在SpatialPolygon中计算Centroid WITHIN/INSIDE

在像ArcMap这样的软件中,可以为多边形的多边形创建质心.在如下所示的情况下,这是必要的.

R其中可以计算空间多边形的质心rgeos::gCentroid().但是,无法强制计算多边形内的质心.

library(rgdal)
library(rgeos)

x <- readWKT("POLYGON ((1441727.5096940901130438 6550163.0046194596216083, 
             1150685.2609429201111197 6669225.7427449300885201, 
             975398.4520359700545669 6603079.7771196700632572, 
             866257.6087542800232768 6401334.5819626096636057, 
             836491.9242229099618271 6106985.0349301798269153, 
             972091.1537546999752522 5835786.5758665995672345, 
             1547561.0546945100650191 5782869.8033663900569081, 
             1408654.5268814601004124 5600968.3978968998417258, 
             720736.4843787000281736 5663807.0652409195899963, 
             598366.4479719599476084 6001151.4899297598749399, 
             654590.5187534400029108 6341803.2128998702391982, 
             869564.9070355399744585 6784981.1825891500338912, 
             1451649.4045378800947219 6788288.4808704098686576, 
             1441727.5096940901130438 6550163.0046194596216083))")
plot(x)
Run Code Online (Sandbox Code Playgroud)

这是多边形 x

gCentroid()创建一个质心,在这个特定情况下,它位于多边形之外.尽管几何上是正确的,但某些应用程序需要多边形内的质心,因为它们可以由ArcMap计算.

xCent <- gCentroid(x, byid = TRUE)
points(xCent, col = "red", pch = 16)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

所需的输出(来自ArcMap)如下所示:

在此输入图像描述

是否有可能在R中生成像这样的质心?

编辑:

经过一番挖掘,结果发现ArcMap在Polygon中选择了一个随机点:

"对于输入多边形:输出点将位于多边形内."

因此问题必须是:是否有一个函数可以在多边形的任意位置创建一个点?

gis r polygon geospatial centroid

7
推荐指数
1
解决办法
1872
查看次数

如何计算质心

我正在使用地理空间形状并在这里查看质心算法,

http://en.wikipedia.org/wiki/Centroid#Centroid_of_polygon

我已经在C#中实现了这样的代码(这只是这个改编),

找到多边形的质心?

class Program
{
    static void Main(string[] args)
    {
        List<Point> vertices = new List<Point>();

        vertices.Add(new Point() { X = 1, Y = 1 });
        vertices.Add(new Point() { X = 1, Y = 10 });
        vertices.Add(new Point() { X = 2, Y = 10 });
        vertices.Add(new Point() { X = 2, Y = 2 });
        vertices.Add(new Point() { X = 10, Y = 2 });
        vertices.Add(new Point() { X = 10, Y = 1 });
        vertices.Add(new Point() { …
Run Code Online (Sandbox Code Playgroud)

c# geospatial centroid

6
推荐指数
3
解决办法
2万
查看次数

给出顶点时计算多面体的质心和体积

给定凸多面体(3D)的顶点的位置,我需要计算多面体的质心和体积.以下代码可在Mathworks网站上获得.

function C = centroid(P)
k=convhulln(P);
if length(unique(k(:)))<size(P,1)
    error('Polyhedron is not convex.');
end
T = delaunayn(P);
n = size(T,1);
W = zeros(n,1);
C=0;
for m = 1:n
    sp = P(T(m,:),:);
    [null,W(m)]=convhulln(sp);
    C = C + W(m) * mean(sp);
end
C=C./sum(W);
return
end
Run Code Online (Sandbox Code Playgroud)

代码很优雅,但速度非常慢.我需要数百次计算数千个多面体的体积和质心.在当前状态下使用此代码是不可行的.有没有人知道更好的方法,或者这个代码可以更快?我可以想到一些微小的变化,例如用mean平均值替换表达式.

performance matlab volume polyhedra centroid

6
推荐指数
1
解决办法
3682
查看次数

求和2个距离矩阵得到第三个"整体"距离矩阵(生态背景)

我是生态学家,主要使用纯素R包.

我有2个矩阵(样本x丰度)(见下面的数据):

矩阵1/nrow = 6replicates*24sites,ncol = 15种丰度(鱼)矩阵2/nrow = 3replicates*24sites,ncol = 10种丰度(无脊椎动物)

两个矩阵中的站点相同.我想在两对网站之间得到整体的bray-curtis不同(考虑两个矩阵).我看到两个选项:

选项1,平均重复(在场地规模)鱼类和大型无脊椎动物丰度,cbind两个平均丰度矩阵(nrow = 24sites,ncol = 15 + 10平均丰度)和计算bray-curtis.

选项2,对于每个组合,计算站点对之间的bray-curtis不相似性,计算站点质心之间的距离.然后总结2个距离矩阵.

如果我不清楚,我在下面的R代码中做了这两个操作.

请问,您能告诉我选项2是否正确且比选项1更合适.

先感谢您.

皮埃尔

这里是R代码的例子

生成数据

library(plyr);library(vegan)

#assemblage 1: 15 fish species, 6 replicates per site
a1.env=data.frame(
  Habitat=paste("H",gl(2,12*6),sep=""),
  Site=paste("S",gl(24,6),sep=""),
  Replicate=rep(paste("R",1:6,sep=""),24))

summary(a1.env)

a1.bio=as.data.frame(replicate(15,rpois(144,sample(1:10,1))))

names(a1.bio)=paste("F",1:15,sep="")

a1.bio[1:72,]=2*a1.bio[1:72,]

#assemblage 2: 10 taxa of macro-invertebrates, 3 replicates per site

a2.env=a1.env[a1.env$Replicate%in%c("R1","R2","R3"),]

summary(a2.env)

a2.bio=as.data.frame(replicate(10,rpois(72,sample(10:100,1))))

names(a2.bio)=paste("I",1:10,sep="")

a2.bio[1:36,]=0.5*a2.bio[1:36,]


#environmental data at the sit scale

env=unique(a1.env[,c("Habitat","Site")])

env=env[order(env$Site),]
Run Code Online (Sandbox Code Playgroud)

方案1,平均丰度和cbind

a1.bio.mean=ddply(cbind(a1.bio,a1.env),.(Habitat,Site),numcolwise(mean))

a1.bio.mean=a1.bio.mean[order(a1.bio.mean$Site),]

a2.bio.mean=ddply(cbind(a2.bio,a2.env),.(Habitat,Site),numcolwise(mean))

a2.bio.mean=a2.bio.mean[order(a2.bio.mean$Site),]

bio.mean=cbind(a1.bio.mean[,-c(1:2)],a2.bio.mean[,-c(1:2)])

dist.mean=vegdist(sqrt(bio.mean),"bray")
Run Code Online (Sandbox Code Playgroud)

选项2,计算质心之间的每个组合距离并对2个距离矩阵求和

a1.dist=vegdist(sqrt(a1.bio),"bray")

a1.coord.centroid=betadisper(a1.dist,a1.env$Site)$centroids

a1.dist.centroid=vegdist(a1.coord.centroid,"eucl")

a2.dist=vegdist(sqrt(a2.bio),"bray")

a2.coord.centroid=betadisper(a2.dist,a2.env$Site)$centroids …
Run Code Online (Sandbox Code Playgroud)

r distance matrix centroid vegan

6
推荐指数
1
解决办法
2160
查看次数

K-Means 聚类中距质心最近的 M 个点

我实现了一个函数,用于查找运行 K 均值聚类算法后计算出的每个质心最近的数据点。我想知道是否有一个sklearn函数可以让我找到距离每个质心最近的M个点。

python cluster-analysis k-means centroid scikit-learn

5
推荐指数
1
解决办法
3684
查看次数