这是改进居中县名称 ggplot 和地图以及地图上 ggplot 居中名称的扩展。这不仅仅是一个理论问题,我在回答How merge certain states Together by group with one label in ggplot2 in R? 时遇到了这种特殊情况。。在这里,我发现有一个L形的“网格”通向多边形外部的中点位置。另请参阅 Henrik 的链接线程Calculate Centroid Within / INSIDE a SpatialPolygon。。
我想知道是否有办法强制标签进入多边形,以获得“更直观”的中点。“直观地”可能意味着“多边形内距离任何边界最远的点”(相关线程的答案建议使用一个函数来计算它,但这个函数似乎没有给出与rgeos::gCentroid我的示例中不同的结果)。
任何建议都应该是完全自动化的,理想情况下适用于任何(ir-)正多边形,并且也独立于坐标投影(即坐标纵横比不重要) 校正:理想情况下它应该取决于坐标投影,因为这可能会将文本移动到边框的尴尬位置。因此,理想的解决方案可能应该在绘制时计算标签位置。
非常相关的是https://gis.stackexchange.com/questions/29278/finding-point-in-country-furthest-from-boundary和https://mathoverflow.net/questions/161494/get-a-point- in-polygon-maximize-the-distance-from-borders,但我不知道如何在 R / grid / ggplot2 中实现这一点。
suppressMessages({library(ggh4x)
library(sf)
library(dplyr)
library(patchwork)
})
poly_foo <- data.frame(x = c(0:1, rep(2,4), rep(1.5,3), 0), y = c(rep(0,3), 1:3, 3:1, 1))
p <- …Run Code Online (Sandbox Code Playgroud) 在像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中选择了一个随机点:
"对于输入多边形:输出点将位于多边形内."
因此问题必须是:是否有一个函数可以在多边形的任意位置创建一个点?