在 R 中使用 Google Earth 绘制高尔夫球场

📅 发布时间:2026/7/10 21:01:38 👁️ 浏览次数:
在 R 中使用 Google Earth 绘制高尔夫球场
原文towardsdatascience.com/plotting-golf-courses-in-r-with-google-earth-8ee8aa6f6293?sourcecollection_archive---------5-----------------------#2024-05-06一份关于如何在 Google Earth 中绘制高尔夫球场并将其在 R 中呈现的用户指南。https://medium.com/adam.c.beaudet?sourcepost_page---byline--8ee8aa6f6293--------------------------------https://towardsdatascience.com/?sourcepost_page---byline--8ee8aa6f6293-------------------------------- Adam Beaudet·发表于 Towards Data Science ·阅读时间 7 分钟·2024 年 5 月 6 日–在数据可视化的世界里我们常常被条形图、折线图和饼图淹没。但事实并不一定非得如此——在本文中我将展示如何绘制高尔夫球场。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/64d7018ea587cf6c48482bb7237bb72b.png图片由作者提供介绍全球大约有 40,000 个高尔夫球场。如果你像我一样热衷于高尔夫和数据那么这篇文章就是为你准备的。在绘制一个球场后我们还可以做一些很酷的事情将击球数据叠加到球场地图上——这可以通过使用 Plotly 包进行一些操作或者通过从 Google Earth 下载单独的高尔夫球击打“位置标记”并将其作为点绘制到地图上。对于你第一次打破 90 杆、80 杆、70 杆等的时刻这可能是一个不错的纪念方式。计算球场指标——一般来说大家都知道 Pebble Beach 的果岭很小被称为“小邮票果岭”。或者 Whistling Straits 有很多沙坑。通过描绘球场元素的多边形另一个附带的好处是可以计算每个元素的面积。这使我们能够为我们绘制的任何球场推导出平均果岭大小、沙坑数量、球道平均宽度等信息。上述要点并不是一个全面的列表但它为项目提供了一个未来扩展的路线图。目录我将首先介绍项目的步骤然后详细讲解每一步在 Google Earth 中描绘高尔夫球场的多边形代表高尔夫球场的各个元素发球台、球道、沙坑、果岭、水域、障碍物从 Google Earth 下载多边形为 KML 文件读取 KML 数据到 R 中并进行一些轻度的数据清洗/操作使用 ggplot2 绘制高尔夫球场在 Google Earth 中绘制多边形首先让我们前往 Google Earth选择一个我们想要绘制的高尔夫球场。我们将以位于威斯康星州的 Erin Hills 为例。通常熟悉球场布局或提前打开一张球场地图有助于通过卫星影像更容易地识别每个洞的具体位置。我们需要通过点击左上角的蓝色“ 新建”按钮来创建一个新项目。接下来我们将使用本地的 KML 文件并点击“创建”。最后为项目命名通常可以直接使用所绘制课程的名称。项目的名称将是我们完成后下载的 KML 文件的名称。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0f0199f76494e9b19a4662505077abf1.png来自 Google Earth 的图片由作者编辑现在我们的项目文件夹已经设置好可以开始绘制了。免责声明Erin Hills 有 138 个沙坑我是通过亲身体验发现绘制它们有些繁琐……不过还是让我们先前往第一个发球台开始绘制吧。到达第一个发球台后首先识别该洞的关键元素。Erin Hills 的第一个洞有水障碍和一个位于果岭左侧的危险区果岭有一个左转的狗腿几处沙坑等等。要开始绘制请点击“添加路径或多边形”这是位于顶部工具栏中第二个从左边开始的图标图标形状为一条连接的点线。这将初始化一个类似铅笔的工具我们可以用它来进行绘制。附加说明你可以通过同时按住 Shift 键并按左箭头或右箭头来旋转屏幕。我通常从发球台开始然后向果岭方向绘制。要求每个绘制的多边形都必须形成一个闭合的形状这意味着你需要回到原始的起点。完成一个多边形后将其保存到项目中并为其命名。为每个多边形命名时使用一致的命名规范也非常重要例如course_hole_element在这种情况下可以翻译为erin_hills_hole_1_tee或者erin_hills_hole_5_fairway等等。我们稍后会在 R 代码中使用字符串匹配来提取每个多边形名称中的这些关键信息。这将帮助我们创建一个多边形元素到颜色的映射也就是告诉 ggplot2 如何为每个多边形上色。因此如果“沙坑”是元素那么我们希望将其着色为棕黄色。如果“水障碍”是元素它应该是蓝色的。这样也可以帮助我们提取课程名称和洞号从而提供更多的绘图功能。下图是 Erin Hills 的第 15 洞我在这里打球时最喜欢的洞。左侧是原始的 Google Earth 图像中间是我们绘制过后的图像右侧是使用 ggplot2 渲染后的图像。我选择不绘制球场的长草区、树木、球车道等元素。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a6c3a72c26da37453e5cfbf44c9bd968.pnghttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a5f8a89ee3d185e97d27035f465c1423.pnghttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/89e91b1153ebf02adcb95b20b2caa32c.png(左) 来自 Google Earth 的照片(中) 来自 Google Earth 的照片由作者编辑(右) 作者提供的图片一旦我们完成了球洞或球场的绘制就该把所有辛苦工作的成果导出为 KML 文件了。可以通过点击屏幕左侧项目所在位置的三个竖点来完成此操作。该项目与 geoJSON 数据最为兼容我们可以在接下来的步骤中轻松地将 KML 文件转换为 geoJSON 格式。现在我们准备好进入 R 了。在 R 中绘图我们需要准备的包有sf用于处理地理空间数据、tidyverse用于数据清理和绘图、stringr用于字符串匹配和geojsonsf用于将 KML 转换为 geoJSON。我们的第一步是读取 KML 文件这可以通过**st_read()**函数来实现。# load librarieslibrary(sf)library(tidyverse)library(stringr)library(geojsonsf)kml_df-st_read(/Users/adambeaudet/Downloads/erin_hills.kml)太好了现在我们应该已经在 R 中获取了高尔夫球场的 KML 数据。数据框应该有两列Name项目名称或者在我们这个案例中是球场名称和geometry一个包含所有构成我们描绘的多边形的单个点的列表。如前所述让我们将 KML 数据转换为 geoJSON并提取球场名称和洞号。# convert from KML to geoJSONgeojson_df-st_as_sf(kml_df,POLYGON)# extracting course name and hole number from polygon name# assuming course_hole_element naming convention is used for polygonsgeojson_df$course_name-str_match(geojson_df$Name,“^(.)_hole”)[,2]geojson_df$hole_num-gsub(“.*_hole_(\\d)_.*”,“\\1”,geojson_df$Name)为了使我们的地图指向正北方我们需要以一种保持方向性的方式进行投影。我们可以使用**st_transform()**函数来做到这一点。# define a CRS so map always points due northcrs-projlcc lat_133 lat_245 lat_039 lon_0-96 x_00 y_00 datumWGS84 unitsm no_defs# transform data to CRSgeojson_df-st_transform(geojson_df,crs)我们几乎准备好绘制了但首先我们需要告诉 ggplot2 如何为每个多边形上色。下面是我的项目使用的调色板您也可以根据需要自定义。可选在此步骤中我们还可以使用**st_centroid()**函数计算我们的多边形的重心这样我们就可以将洞号叠加到每个果岭上。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/577b95d109ebd41ce97372c44f0a77d7.png图片由作者提供geojson_df-geojson_df%%mutate(colorcase_when(grepl(“_tee$”,Name)~“#57B740”,grepl(“_bunker$”,Name)~“#EDE6D3”,grepl(“_water$”,Name)~“#2243b6”,grepl(“_fairway$”,Name)~“#57B740”,grepl(“_green$”,Name)~“#86D14A”,grepl(“_hazard$”,Name)~“#094d1d”))%%mutate(centroidst_centroid(geometry))我们正式准备好绘图了。我们可以结合使用geom_sf()、geom_text()如果想要更花哨一点还可以使用**geom_point()**来绘制地图上的击球位置。我通常会去掉网格线、坐标轴标签和图例以保持界面的简洁。ggplot()geom_sf(datageojson_df,aes(fillcolor),colorblack)geom_text(datafilter(geojson_df,grepl(_green$,Name)),aes(xst_coordinates(centroid)[,1],yst_coordinates(centroid)[,2],labelhole_num),size3,colorblack,fontfacebold,hjust0.5,vjust0.5)scale_fill_identity()theme_minimal()theme(axis.title.xelement_blank(),axis.title.yelement_blank(),axis.text.xelement_blank(),axis.text.yelement_blank(),plot.titleelement_text(size16),panel.grid.majorelement_blank(),panel.grid.minorelement_blank())theme(legend.positionnone)labs(titleErin Hills | Hartford, WI)就这样——在 R 中绘制的高尔夫球场真是个好主意要查看我在撰写本文时所绘制的其他课程您可以访问我的 Shiny 应用abodesy14.shinyapps.io/golfMapsR/如果您跟随本教程并且玩得开心或者感兴趣的话欢迎尝试绘制您最喜欢的高尔夫球场并为我维护的golfMapsR仓库创建一个 Pull Requestgithub.com/abodesy14/golfMapsR通过一些共同的努力我们可以创建一个关于全球高尔夫球场的可绘制数据库