如何使用 R 或 QGIS 在不规则曲线内查找直线段

How to find straight segments within an irregular curved line using R or QGIS

提问人:Pamela Lattanzi 提问时间:8/23/2023 最后编辑:marguslPamela Lattanzi 更新时间:8/23/2023 访问量:55

问:

我有一个 shapefile (EPSG:4326 - WGS 84),其中包含许多具有线串几何形状的特征,我真的很想将每条线(如上传的图片中所示的那条,要使用的线串几何示例)分成几个段,每次线的“形状”发生变化时。 可能可以使用连接 2 个连续点的线创建的角度(也许方位角变化量应该是最合适的测量),但我不确定。不同段的方向可能是完全随机的,所以我建议不要考虑这个参数。 最终目标应该是识别以蓝色圈出的直线段,这些线段应平行于其他形状文件(表示海里限制)的线串几何。 这个问题可以使用R或QGIS解决吗?

我已经在QGIS中尝试了一些算法,例如“分解线”,或者在R定义函数中编写一些代码,以根据角度阈值检查线段是否是直的,但没有任何效果。

我需要找到我不规则曲线的“直线”。我应该获取的线段没有固定的长度,并且 shapefile 的每个线要素中的线段数可以是可变的。

dput(first_line_feature)
structure(list(trip = 1, geometry = structure(list(structure(c(12.9020599, 
12.9020599, 12.9020599, 12.9020599, 12.9022016, 12.9045633, 12.9061516, 
12.9052416, 12.9053599, 12.9056833, 12.9059316, 12.9063283, 12.9062733, 
12.905615, 12.905855, 12.906235, 12.9062583, 12.90638, 12.9065916, 
12.9060383, 12.9058183, 12.9055433, 12.9053866, 12.9051033, 12.9051016, 
12.905165, 12.90482, 12.9049416, 12.9047516, 12.9059549, 12.9061616, 
12.9061416, 12.9060399, 12.9062516, 12.9057933, 12.90571, 12.9057549, 
12.9056499, 12.9067083, 12.9080516, 12.9093633, 12.9094066, 12.90986, 
12.910375, 12.9109949, 12.9115833, 12.9119733, 12.9125083, 12.9127283, 
12.9132166, 12.913825, 12.9144183, 12.9148533, 12.9153899, 12.9156733, 
12.916255, 12.9168266, 12.91731, 12.9178383, 12.91856, 12.9185183, 
12.9188983, 12.9193783, 12.9199349, 12.920255, 12.92044, 12.9205666, 
12.921435, 12.92136, 12.921875, 12.922405, 12.9230383, 12.9236083, 
12.924, 12.924475, 12.9244299, 12.9245349, 12.9247583, 12.9251483, 
12.9257533, 12.9261616, 12.92675, 12.92672, 12.9266, 12.9264849, 
12.9260966, 12.9260183, 12.9260183, 12.9262533, 12.9264666, 12.9270266, 
12.9274933, 12.9281333, 12.9286, 12.9290233, 12.9290783, 12.929265, 
12.9295499, 12.9299483, 12.9305066, 12.9310733, 12.9315483, 12.9320083, 
12.9321533, 12.9327683, 12.9333033, 12.9338683, 12.9342516, 12.9346133, 
12.9344783, 12.9318816, 12.9292883, 12.9261816, 12.92308, 12.9198833, 
12.91663, 12.9134816, 12.9110283, 12.9089816, 12.9069299, 12.9047116, 
12.9027549, 12.9021899, 12.8996883, 12.8975133, 12.8953933, 12.8931466, 
12.8915216, 12.8914083, 12.893865, 12.8962466, 12.8985033, 12.9008299, 
12.9024716, 12.9046849, 12.9064816, 12.9080816, 12.9099666, 12.9118183, 
12.9136383, 12.9156849, 12.9169916, 12.9189016, 12.9206683, 12.9224499, 
12.9243616, 12.92617, 12.928005, 12.9301099, 12.9318383, 12.93356, 
12.9353816, 12.9368116, 12.9388066, 12.94018, 12.94197, 12.9438783, 
12.945815, 12.94785, 12.9501516, 12.9520483, 12.954225, 12.9560366, 
12.9552816, 12.95755, 12.9599316, 12.9601916, 12.960565, 12.961085, 
12.9615733, 12.96205, 12.962435, 12.962585, 12.9624283, 12.96048, 
12.9598716, 12.9592766, 12.9581283, 12.9576583, 12.9564333, 12.9553016, 
12.954985, 12.9545766, 12.9513483, 12.9497183, 12.9484983, 12.948355, 
12.948055, 12.9460666, 12.9453583, 12.944425, 12.942445, 12.9417316, 
12.9436916, 12.9456783, 12.9476833, 12.9497, 12.9515466, 12.9535766, 
12.95558, 12.95756, 12.9593766, 12.9612, 12.9630616, 12.96481, 
12.9664749, 12.9680933, 12.9699316, 12.9719266, 12.9736766, 12.9720583, 
12.96976, 12.9677666, 12.965725, 12.96351, 12.961285, 12.9590983, 
12.95682, 12.9545833, 12.9523416, 12.9501116, 12.947765, 12.9456333, 
12.9436233, 12.9410133, 12.93828, 12.935435, 12.9322966, 12.9292733, 
12.9261366, 12.9230599, 12.9197466, 12.9165949, 12.913525, 12.9101733, 
12.9068183, 12.9048516, 12.9059399, 12.9037366, 12.9021333, 12.9021333, 
12.9021333, 12.9021333, 12.9021333, 12.9021333, 12.9021333, 12.9021333, 
43.9249449, 43.9249449, 43.9249449, 43.9249449, 43.9249266, 43.9246083, 
43.9255916, 43.927285, 43.9289666, 43.93096, 43.9328333, 43.9346733, 
43.9365433, 43.9382616, 43.9401199, 43.9419349, 43.9438366, 43.9460533, 
43.9482966, 43.9503816, 43.9526616, 43.9549083, 43.9571699, 43.9594416, 
43.961675, 43.9639366, 43.9661849, 43.9684633, 43.9706983, 43.972825, 
43.9750583, 43.9773333, 43.9796166, 43.9819516, 43.9842083, 43.9863933, 
43.9886983, 43.9910233, 43.9932033, 43.9953499, 43.996345, 43.9961766, 
43.9958899, 43.9956666, 43.995335, 43.9950433, 43.9948483, 43.99455, 
43.9944183, 43.9942316, 43.99394, 43.9936666, 43.993505, 43.9932166, 
43.9930816, 43.9927799, 43.9924866, 43.9922833, 43.9919866, 43.9901, 
43.9899633, 43.9897683, 43.9895816, 43.9893249, 43.9891016, 43.98895, 
43.9888999, 43.9885583, 43.9885199, 43.98826, 43.9880316, 43.987725, 
43.987465, 43.9872666, 43.98692, 43.9869349, 43.9868733, 43.9867483, 
43.9865766, 43.986265, 43.9860666, 43.98578, 43.9857166, 43.98568, 
43.9843783, 43.9820733, 43.9811516, 43.9811516, 43.9810433, 43.9809316, 
43.9806516, 43.9803616, 43.9800483, 43.9798466, 43.9795433, 43.9794516, 
43.9793033, 43.9793433, 43.9792, 43.9788883, 43.9786699, 43.9784299, 
43.9781116, 43.97806, 43.9778233, 43.9776033, 43.9773216, 43.9771333, 
43.9769533, 43.9760483, 43.9762716, 43.9755566, 43.9751166, 43.9746983, 
43.9744166, 43.9745416, 43.9749583, 43.9759, 43.9768333, 43.9777699, 
43.9787583, 43.9796983, 43.981825, 43.9828366, 43.98386, 43.9847816, 
43.9858133, 43.9842033, 43.9823916, 43.9812833, 43.980195, 43.9791933, 
43.9780133, 43.9758016, 43.9739183, 43.9718016, 43.969615, 43.9674633, 
43.9654316, 43.9632916, 43.96127, 43.9589883, 43.9568916, 43.9546983, 
43.9524933, 43.95045, 43.9482616, 43.94606, 43.9440399, 43.9418983, 
43.9396766, 43.937485, 43.93524, 43.933175, 43.9308533, 43.9287516, 
43.9266399, 43.9244816, 43.9223383, 43.9204166, 43.9183566, 43.9163183, 
43.9142433, 43.9130833, 43.912075, 43.9108583, 43.91037, 43.9100533, 
43.9096066, 43.9092683, 43.9089183, 43.9086966, 43.90829, 43.9087516, 
43.9102049, 43.9112399, 43.9120566, 43.9124766, 43.9135166, 43.9136566, 
43.9139383, 43.91502, 43.9161266, 43.9183933, 43.9196333, 43.9207999, 
43.9217899, 43.922865, 43.9223016, 43.9212283, 43.9202133, 43.91886, 
43.917355, 43.9159966, 43.9146433, 43.9133016, 43.9118933, 43.910445, 
43.9091, 43.9077233, 43.9063066, 43.9049766, 43.9036233, 43.9022733, 
43.9008716, 43.899415, 43.898005, 43.8966233, 43.8962633, 43.8959199, 
43.89772, 43.89943, 43.90121, 43.9030166, 43.9046983, 43.9063483, 
43.9079816, 43.9095883, 43.9111649, 43.9127966, 43.9144816, 43.9160166, 
43.9176783, 43.919075, 43.920125, 43.9210799, 43.9220283, 43.922985, 
43.9239633, 43.9247833, 43.92573, 43.9264366, 43.9272633, 43.9281449, 
43.9288283, 43.9291383, 43.927565, 43.9252733, 43.9248983, 43.924955, 
43.924955, 43.924955, 43.924955, 43.924955, 43.924955, 43.924955, 
43.924955), dim = c(247L, 2L), class = c("XY", "LINESTRING", 
"sfg"))), class = c("sfc_LINESTRING", "sfc"), precision = 0, bbox = structure(c(xmin = 12.8914083, 
ymin = 43.8959199, xmax = 12.9736766, ymax = 43.996345), class = "bbox"), crs = structure(list(
    input = "EPSG:4326", wkt = "GEOGCRS[\"WGS 84\",\n    ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n        MEMBER[\"World Geodetic System 1984 (Transit)\"],\n        MEMBER[\"World Geodetic System 1984 (G730)\"],\n        MEMBER[\"World Geodetic System 1984 (G873)\"],\n        MEMBER[\"World Geodetic System 1984 (G1150)\"],\n        MEMBER[\"World Geodetic System 1984 (G1674)\"],\n        MEMBER[\"World Geodetic System 1984 (G1762)\"],\n        MEMBER[\"World Geodetic System 1984 (G2139)\"],\n        ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n            LENGTHUNIT[\"metre\",1]],\n        ENSEMBLEACCURACY[2.0]],\n    PRIMEM[\"Greenwich\",0,\n        ANGLEUNIT[\"degree\",0.0174532925199433]],\n    CS[ellipsoidal,2],\n        AXIS[\"geodetic latitude (Lat)\",north,\n            ORDER[1],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n        AXIS[\"geodetic longitude (Lon)\",east,\n            ORDER[2],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n    USAGE[\n        SCOPE[\"Horizontal component of 3D system.\"],\n        AREA[\"World.\"],\n        BBOX[-90,-180,90,180]],\n    ID[\"EPSG\",4326]]"), class = "crs"), n_empty = 0L)), row.names = 1L, sf_column = "geometry", agr = structure(c(trip = NA_integer_), levels = c("constant", 
"aggregate", "identity"), class = "factor"), class = c("sf", 
"tbl_df", "tbl", "data.frame"))
R QGIS 多线串 直线检测

评论

0赞 margusl 8/23/2023
欢迎来到 SO!请分享一些输入数据中的样本,例如 对象或几何列的输出,以及您当前的尝试。链接图像上还有许多其他或多或少的直线部分,是什么定义了您所追求的部分?恒定方位角(即 45 度,+/-)?方位角变化量?最小长度?距离公差?方向是否重要(对于 45 度的路段,包括西北、东南或两者)?球体上的这些几何形状还是平面上的投影几何形状(球体上的 2 个南北段仅在赤道上平行),这应该重要吗?dput()sf
1赞 Pamela Lattanzi 8/23/2023
@margusl 我刚刚试图回复您的评论,修改问题正文,添加一些有助于解决问题的细节

答: 暂无答案