[{"data":1,"prerenderedAt":1650},["ShallowReactive",2],{"doc:\u002Fpyqgis-cartography-visualization\u002Fsymbol-layers-and-advanced-symbology\u002Fmarker-line-and-interval-symbols-pyqgis":3},{"id":4,"title":5,"body":6,"description":1639,"extension":1640,"meta":1641,"navigation":193,"path":1646,"seo":1647,"stem":1648,"__hash__":1649},"docs\u002Fpyqgis-cartography-visualization\u002Fsymbol-layers-and-advanced-symbology\u002Fmarker-line-and-interval-symbols-pyqgis\u002Findex.md","Use Marker Line and Interval Symbols in PyQGIS",{"type":7,"value":8,"toc":1625},"minimark",[9,13,17,26,132,137,147,151,154,369,388,392,395,638,647,651,654,701,858,870,874,877,1025,1038,1042,1045,1252,1257,1261,1264,1301,1486,1495,1499,1522,1526,1552,1556,1559,1563,1569,1575,1581,1587,1591,1621],[10,11,5],"h1",{"id":12},"use-marker-line-and-interval-symbols-in-pyqgis",[14,15,16],"p",{},"Many classic map line styles are not lines at all but markers placed along lines: the cross-ties of a railway, the dots of a footpath, the triangles of a cliff edge, the arrows of a one-way street, the symbols at the start and end of a pipe. QGIS builds them with two symbol layers. The marker line places any marker symbol at intervals, at vertices or at specific points along a line. The hashed line draws short line segments across the line at intervals — the ties of a railway, the ticks of a boundary. Stacked with ordinary line layers, they produce the full range of cartographic line styles.",[14,18,19,20,25],{},"This recipe belongs to ",[21,22,24],"a",{"href":23},"\u002Fpyqgis-cartography-visualization\u002Fsymbol-layers-and-advanced-symbology\u002F","Symbol Layers & Advanced Symbology",". It places markers at intervals and at specific positions, offsets and rotates them, builds hashed lines, combines both into classic map symbols, and controls behaviour at line ends and corners.",[14,27,28],{},[29,30,35,39,43,50,59,67,74,77,80,83,86,93,98,103,107,111,116,118,122,124,127],"svg",{"viewBox":31,"role":32,"ariaLabel":33,"xmlns":34},"0 0 760 248","img","Marker placement options along a line: fixed interval, every vertex, first and last vertex, and the centre point","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg",[36,37,38],"title",{},"Where markers can go",[40,41,42],"desc",{},"Placement options for marker lines along a single line: at a fixed interval, for example every 10 millimetres; on every vertex; on the first and last vertex only; on the central point of the line; and on every curve point. Interval markers can be offset along the line so the first one does not sit on the start.",[44,45],"rect",{"x":46,"y":46,"width":47,"height":48,"fill":49},"0","760","248","#f6f3ea",[51,52,58],"text",{"x":53,"y":54,"style":55,"fill":56,"textAnchor":57},"380","28","text-anchor:middle;font-size:14px;font-family:sans-serif;font-weight:bold","#17211d","middle","Interval, vertices, ends, centre",[60,61],"line",{"x1":62,"y1":63,"x2":64,"y2":63,"stroke":65,"style":66},"60","70","700","#59645f","stroke-width:2",[68,69],"circle",{"cx":70,"cy":63,"r":71,"fill":72,"stroke":56,"style":73},"100","5","#2563eb","stroke-width:1",[68,75],{"cx":76,"cy":63,"r":71,"fill":72,"stroke":56,"style":73},"220",[68,78],{"cx":79,"cy":63,"r":71,"fill":72,"stroke":56,"style":73},"340",[68,81],{"cx":82,"cy":63,"r":71,"fill":72,"stroke":56,"style":73},"460",[68,84],{"cx":85,"cy":63,"r":71,"fill":72,"stroke":56,"style":73},"580",[51,87,92],{"x":88,"y":89,"style":90,"fill":72,"textAnchor":91},"720","74","text-anchor:end;font-size:10.0px;font-family:sans-serif","end","interval",[94,95],"polyline",{"points":96,"fill":97,"stroke":65,"style":66},"60,130 200,110 330,140 470,115 700,130","none",[68,99],{"cx":100,"cy":101,"r":71,"fill":102,"stroke":56,"style":73},"200","110","#15803d",[68,104],{"cx":105,"cy":106,"r":71,"fill":102,"stroke":56,"style":73},"330","140",[68,108],{"cx":109,"cy":110,"r":71,"fill":102,"stroke":56,"style":73},"470","115",[51,112,115],{"x":88,"y":113,"style":90,"fill":114,"textAnchor":91},"160","#166534","vertices",[60,117],{"x1":62,"y1":100,"x2":64,"y2":100,"stroke":65,"style":66},[68,119],{"cx":62,"cy":100,"r":120,"fill":121,"stroke":56,"style":73},"6","#b45309",[68,123],{"cx":64,"cy":100,"r":120,"fill":121,"stroke":56,"style":73},[68,125],{"cx":53,"cy":100,"r":120,"fill":126,"stroke":56,"style":73},"#b91c1c",[51,128,131],{"x":53,"y":129,"style":130,"fill":121,"textAnchor":57},"228","text-anchor:middle;font-size:10.5px;font-family:sans-serif","first · centre · last",[133,134,136],"h2",{"id":135},"prerequisites","Prerequisites",[138,139,140,144],"ul",{},[141,142,143],"li",{},"QGIS 3.34 LTR or newer, or the QGIS 4 series.",[141,145,146],{},"A line layer: railways, paths, administrative boundaries, pipes.",[133,148,150],{"id":149},"place-markers-at-a-fixed-interval","Place markers at a fixed interval",[14,152,153],{},"The marker line symbol layer takes a rotation flag, an interval and a marker sub-symbol. Stacked over a thin line, it gives dotted or symbol-studded lines.",[155,156,161],"pre",{"className":157,"code":158,"language":159,"meta":160,"style":160},"language-python shiki shiki-themes github-dark","from qgis.core import (QgsProject, QgsLineSymbol, QgsMarkerLineSymbolLayer, QgsMarkerSymbol,\n                       QgsSingleSymbolRenderer, QgsUnitTypes, Qgis)\n\npaths = QgsProject.instance().mapLayersByName(\"footpaths\")[0]\n\ndots = QgsMarkerLineSymbolLayer(True, 3.0)           # rotate with line, every 3 mm\ndots.setPlacements(Qgis.MarkerLinePlacement.Interval)\ndots.setIntervalUnit(QgsUnitTypes.RenderMillimeters)\ndots.setOffsetAlongLine(1.5)\ndots.setSubSymbol(QgsMarkerSymbol.createSimple(\n    {\"name\": \"circle\", \"color\": \"#b45309\", \"size\": \"0.9\", \"outline_style\": \"no\"}))\n\nsymbol = QgsLineSymbol()\nsymbol.changeSymbolLayer(0, dots)\npaths.setRenderer(QgsSingleSymbolRenderer(symbol))\npaths.triggerRepaint()\n","python","",[162,163,164,182,188,195,220,225,252,258,264,276,282,330,335,346,357,363],"code",{"__ignoreMap":160},[165,166,168,172,176,179],"span",{"class":60,"line":167},1,[165,169,171],{"class":170},"snl16","from",[165,173,175],{"class":174},"s95oV"," qgis.core ",[165,177,178],{"class":170},"import",[165,180,181],{"class":174}," (QgsProject, QgsLineSymbol, QgsMarkerLineSymbolLayer, QgsMarkerSymbol,\n",[165,183,185],{"class":60,"line":184},2,[165,186,187],{"class":174},"                       QgsSingleSymbolRenderer, QgsUnitTypes, Qgis)\n",[165,189,191],{"class":60,"line":190},3,[165,192,194],{"emptyLinePlaceholder":193},true,"\n",[165,196,198,201,204,207,211,214,217],{"class":60,"line":197},4,[165,199,200],{"class":174},"paths ",[165,202,203],{"class":170},"=",[165,205,206],{"class":174}," QgsProject.instance().mapLayersByName(",[165,208,210],{"class":209},"sU2Wk","\"footpaths\"",[165,212,213],{"class":174},")[",[165,215,46],{"class":216},"sDLfK",[165,218,219],{"class":174},"]\n",[165,221,223],{"class":60,"line":222},5,[165,224,194],{"emptyLinePlaceholder":193},[165,226,228,231,233,236,239,242,245,248],{"class":60,"line":227},6,[165,229,230],{"class":174},"dots ",[165,232,203],{"class":170},[165,234,235],{"class":174}," QgsMarkerLineSymbolLayer(",[165,237,238],{"class":216},"True",[165,240,241],{"class":174},", ",[165,243,244],{"class":216},"3.0",[165,246,247],{"class":174},")           ",[165,249,251],{"class":250},"sjoCn","# rotate with line, every 3 mm\n",[165,253,255],{"class":60,"line":254},7,[165,256,257],{"class":174},"dots.setPlacements(Qgis.MarkerLinePlacement.Interval)\n",[165,259,261],{"class":60,"line":260},8,[165,262,263],{"class":174},"dots.setIntervalUnit(QgsUnitTypes.RenderMillimeters)\n",[165,265,267,270,273],{"class":60,"line":266},9,[165,268,269],{"class":174},"dots.setOffsetAlongLine(",[165,271,272],{"class":216},"1.5",[165,274,275],{"class":174},")\n",[165,277,279],{"class":60,"line":278},10,[165,280,281],{"class":174},"dots.setSubSymbol(QgsMarkerSymbol.createSimple(\n",[165,283,285,288,291,294,297,299,302,304,307,309,312,314,317,319,322,324,327],{"class":60,"line":284},11,[165,286,287],{"class":174},"    {",[165,289,290],{"class":209},"\"name\"",[165,292,293],{"class":174},": ",[165,295,296],{"class":209},"\"circle\"",[165,298,241],{"class":174},[165,300,301],{"class":209},"\"color\"",[165,303,293],{"class":174},[165,305,306],{"class":209},"\"#b45309\"",[165,308,241],{"class":174},[165,310,311],{"class":209},"\"size\"",[165,313,293],{"class":174},[165,315,316],{"class":209},"\"0.9\"",[165,318,241],{"class":174},[165,320,321],{"class":209},"\"outline_style\"",[165,323,293],{"class":174},[165,325,326],{"class":209},"\"no\"",[165,328,329],{"class":174},"}))\n",[165,331,333],{"class":60,"line":332},12,[165,334,194],{"emptyLinePlaceholder":193},[165,336,338,341,343],{"class":60,"line":337},13,[165,339,340],{"class":174},"symbol ",[165,342,203],{"class":170},[165,344,345],{"class":174}," QgsLineSymbol()\n",[165,347,349,352,354],{"class":60,"line":348},14,[165,350,351],{"class":174},"symbol.changeSymbolLayer(",[165,353,46],{"class":216},[165,355,356],{"class":174},", dots)\n",[165,358,360],{"class":60,"line":359},15,[165,361,362],{"class":174},"paths.setRenderer(QgsSingleSymbolRenderer(symbol))\n",[165,364,366],{"class":60,"line":365},16,[165,367,368],{"class":174},"paths.triggerRepaint()\n",[14,370,371,375,376,379,380,383,384,387],{},[372,373,374],"strong",{},"Breakdown:"," The interval is the distance between markers along the line, here 3 mm on the page, so the pattern looks the same at every scale. ",[162,377,378],{},"setOffsetAlongLine"," shifts the first marker away from the line's start by half the interval, which centres the pattern and avoids a marker sitting exactly on junctions. Replacing the default simple line with the marker line gives a pure dotted line; appending it to a symbol instead draws the dots on top of a solid line. ",[162,381,382],{},"setPlacements"," (QGIS 3.24+) accepts combinations of placements as flags; older code uses ",[162,385,386],{},"setPlacement",".",[133,389,391],{"id":390},"place-markers-at-vertices-ends-and-the-centre","Place markers at vertices, ends and the centre",[14,393,394],{},"Interval markers decorate; positional markers carry meaning — a valve at each end of a pipe, a station at each vertex of a transit line, a direction arrow at the centre of each segment.",[155,396,398],{"className":157,"code":397,"language":159,"meta":160,"style":160},"from qgis.core import QgsSimpleLineSymbolLayer\n\npipes = QgsProject.instance().mapLayersByName(\"water_mains\")[0]\nbase = QgsSimpleLineSymbolLayer.create({\"line_color\": \"#2563eb\", \"line_width\": \"0.6\"})\n\nends = QgsMarkerLineSymbolLayer(True, 0)\nends.setPlacements(Qgis.MarkerLinePlacement.FirstVertex | Qgis.MarkerLinePlacement.LastVertex)\nends.setSubSymbol(QgsMarkerSymbol.createSimple(\n    {\"name\": \"square\", \"color\": \"#fffdf7\", \"size\": \"1.6\", \"outline_color\": \"#2563eb\", \"outline_width\": \"0.3\"}))\n\ncentre = QgsMarkerLineSymbolLayer(True, 0)\ncentre.setPlacements(Qgis.MarkerLinePlacement.CentralPoint)\ncentre.setSubSymbol(QgsMarkerSymbol.createSimple(\n    {\"name\": \"arrowhead\", \"color\": \"#2563eb\", \"size\": \"1.8\"}))\n\npipe_symbol = QgsLineSymbol([base, ends, centre])\npipes.setRenderer(QgsSingleSymbolRenderer(pipe_symbol))\npipes.triggerRepaint()\n",[162,399,400,411,415,433,464,468,485,496,501,551,555,572,577,582,612,616,626,632],{"__ignoreMap":160},[165,401,402,404,406,408],{"class":60,"line":167},[165,403,171],{"class":170},[165,405,175],{"class":174},[165,407,178],{"class":170},[165,409,410],{"class":174}," QgsSimpleLineSymbolLayer\n",[165,412,413],{"class":60,"line":184},[165,414,194],{"emptyLinePlaceholder":193},[165,416,417,420,422,424,427,429,431],{"class":60,"line":190},[165,418,419],{"class":174},"pipes ",[165,421,203],{"class":170},[165,423,206],{"class":174},[165,425,426],{"class":209},"\"water_mains\"",[165,428,213],{"class":174},[165,430,46],{"class":216},[165,432,219],{"class":174},[165,434,435,438,440,443,446,448,451,453,456,458,461],{"class":60,"line":197},[165,436,437],{"class":174},"base ",[165,439,203],{"class":170},[165,441,442],{"class":174}," QgsSimpleLineSymbolLayer.create({",[165,444,445],{"class":209},"\"line_color\"",[165,447,293],{"class":174},[165,449,450],{"class":209},"\"#2563eb\"",[165,452,241],{"class":174},[165,454,455],{"class":209},"\"line_width\"",[165,457,293],{"class":174},[165,459,460],{"class":209},"\"0.6\"",[165,462,463],{"class":174},"})\n",[165,465,466],{"class":60,"line":222},[165,467,194],{"emptyLinePlaceholder":193},[165,469,470,473,475,477,479,481,483],{"class":60,"line":227},[165,471,472],{"class":174},"ends ",[165,474,203],{"class":170},[165,476,235],{"class":174},[165,478,238],{"class":216},[165,480,241],{"class":174},[165,482,46],{"class":216},[165,484,275],{"class":174},[165,486,487,490,493],{"class":60,"line":254},[165,488,489],{"class":174},"ends.setPlacements(Qgis.MarkerLinePlacement.FirstVertex ",[165,491,492],{"class":170},"|",[165,494,495],{"class":174}," Qgis.MarkerLinePlacement.LastVertex)\n",[165,497,498],{"class":60,"line":260},[165,499,500],{"class":174},"ends.setSubSymbol(QgsMarkerSymbol.createSimple(\n",[165,502,503,505,507,509,512,514,516,518,521,523,525,527,530,532,535,537,539,541,544,546,549],{"class":60,"line":266},[165,504,287],{"class":174},[165,506,290],{"class":209},[165,508,293],{"class":174},[165,510,511],{"class":209},"\"square\"",[165,513,241],{"class":174},[165,515,301],{"class":209},[165,517,293],{"class":174},[165,519,520],{"class":209},"\"#fffdf7\"",[165,522,241],{"class":174},[165,524,311],{"class":209},[165,526,293],{"class":174},[165,528,529],{"class":209},"\"1.6\"",[165,531,241],{"class":174},[165,533,534],{"class":209},"\"outline_color\"",[165,536,293],{"class":174},[165,538,450],{"class":209},[165,540,241],{"class":174},[165,542,543],{"class":209},"\"outline_width\"",[165,545,293],{"class":174},[165,547,548],{"class":209},"\"0.3\"",[165,550,329],{"class":174},[165,552,553],{"class":60,"line":278},[165,554,194],{"emptyLinePlaceholder":193},[165,556,557,560,562,564,566,568,570],{"class":60,"line":284},[165,558,559],{"class":174},"centre ",[165,561,203],{"class":170},[165,563,235],{"class":174},[165,565,238],{"class":216},[165,567,241],{"class":174},[165,569,46],{"class":216},[165,571,275],{"class":174},[165,573,574],{"class":60,"line":332},[165,575,576],{"class":174},"centre.setPlacements(Qgis.MarkerLinePlacement.CentralPoint)\n",[165,578,579],{"class":60,"line":337},[165,580,581],{"class":174},"centre.setSubSymbol(QgsMarkerSymbol.createSimple(\n",[165,583,584,586,588,590,593,595,597,599,601,603,605,607,610],{"class":60,"line":348},[165,585,287],{"class":174},[165,587,290],{"class":209},[165,589,293],{"class":174},[165,591,592],{"class":209},"\"arrowhead\"",[165,594,241],{"class":174},[165,596,301],{"class":209},[165,598,293],{"class":174},[165,600,450],{"class":209},[165,602,241],{"class":174},[165,604,311],{"class":209},[165,606,293],{"class":174},[165,608,609],{"class":209},"\"1.8\"",[165,611,329],{"class":174},[165,613,614],{"class":60,"line":359},[165,615,194],{"emptyLinePlaceholder":193},[165,617,618,621,623],{"class":60,"line":365},[165,619,620],{"class":174},"pipe_symbol ",[165,622,203],{"class":170},[165,624,625],{"class":174}," QgsLineSymbol([base, ends, centre])\n",[165,627,629],{"class":60,"line":628},17,[165,630,631],{"class":174},"pipes.setRenderer(QgsSingleSymbolRenderer(pipe_symbol))\n",[165,633,635],{"class":60,"line":634},18,[165,636,637],{"class":174},"pipes.triggerRepaint()\n",[14,639,640,642,643,387],{},[372,641,374],{}," Combining first- and last-vertex placements puts a marker at both ends of each feature — valves at pipe ends, here as small hollow squares drawn over the pipe. The central-point placement adds one direction arrow at the middle of each pipe, rotated to follow the line, showing flow direction without cluttering long pipes. Building the symbol from a list of layers makes the stacking order explicit: the line first, then end markers, then the arrow. The full stacking rules are in ",[21,644,646],{"href":645},"\u002Fpyqgis-cartography-visualization\u002Fsymbol-layers-and-advanced-symbology\u002Fstack-symbol-layers-pyqgis\u002F","stacking symbol layers",[133,648,650],{"id":649},"offset-and-rotate-markers","Offset and rotate markers",[14,652,653],{},"Many symbols sit beside the line rather than on it: the triangles of a cliff edge, the teeth of an embankment, the ticks on one side of a boundary. Offsets across the line and marker rotation produce them.",[14,655,656],{},[29,657,660,663,666,668,671,676,680,683,686,689,692,695,698],{"viewBox":658,"role":32,"ariaLabel":659,"xmlns":34},"0 0 760 220","Triangle markers offset to one side of a line and rotated to point away from it, forming a cliff edge symbol",[36,661,662],{},"Markers beside the line",[40,664,665],{},"A line with triangle markers offset to one side and rotated to point away from the line, the classic cliff or embankment symbol. The offset across the line moves markers to the left or right of the digitizing direction; rotation with the line keeps them aligned on curves. Reversing the line flips the side.",[44,667],{"x":46,"y":46,"width":47,"height":76,"fill":49},[51,669,670],{"x":53,"y":54,"style":55,"fill":56,"textAnchor":57},"Offset across, rotate with the line",[672,673],"path",{"d":674,"fill":97,"stroke":675,"style":66},"M 60 150 C 200 120 360 170 520 130 C 600 110 660 120 710 130","#2f3b35",[677,678],"polygon",{"points":679,"fill":675,"stroke":675,"style":73},"110,138 122,138 116,124",[677,681],{"points":682,"fill":675,"stroke":675,"style":73},"190,128 202,128 196,114",[677,684],{"points":685,"fill":675,"stroke":675,"style":73},"270,132 282,134 275,120",[677,687],{"points":688,"fill":675,"stroke":675,"style":73},"350,139 362,140 357,126",[677,690],{"points":691,"fill":675,"stroke":675,"style":73},"430,134 442,132 435,119",[677,693],{"points":694,"fill":675,"stroke":675,"style":73},"510,124 522,121 514,108",[677,696],{"points":697,"fill":675,"stroke":675,"style":73},"590,111 602,110 595,96",[51,699,700],{"x":53,"y":100,"style":130,"fill":65,"textAnchor":57},"offset 1 mm to the left, rotated with the line",[155,702,704],{"className":157,"code":703,"language":159,"meta":160,"style":160},"cliffs = QgsProject.instance().mapLayersByName(\"cliff_edges\")[0]\nedge = QgsSimpleLineSymbolLayer.create({\"line_color\": \"#2f3b35\", \"line_width\": \"0.35\"})\n\nteeth = QgsMarkerLineSymbolLayer(True, 2.5)\nteeth.setPlacements(Qgis.MarkerLinePlacement.Interval)\nteeth.setOffset(-0.9)                                  # negative = left of digitizing direction\nteeth.setSubSymbol(QgsMarkerSymbol.createSimple(\n    {\"name\": \"triangle\", \"color\": \"#2f3b35\", \"size\": \"1.4\", \"outline_style\": \"no\", \"angle\": \"0\"}))\ncliffs.setRenderer(QgsSingleSymbolRenderer(QgsLineSymbol([edge, teeth])))\ncliffs.triggerRepaint()\n",[162,705,706,724,751,755,773,778,795,800,848,853],{"__ignoreMap":160},[165,707,708,711,713,715,718,720,722],{"class":60,"line":167},[165,709,710],{"class":174},"cliffs ",[165,712,203],{"class":170},[165,714,206],{"class":174},[165,716,717],{"class":209},"\"cliff_edges\"",[165,719,213],{"class":174},[165,721,46],{"class":216},[165,723,219],{"class":174},[165,725,726,729,731,733,735,737,740,742,744,746,749],{"class":60,"line":184},[165,727,728],{"class":174},"edge ",[165,730,203],{"class":170},[165,732,442],{"class":174},[165,734,445],{"class":209},[165,736,293],{"class":174},[165,738,739],{"class":209},"\"#2f3b35\"",[165,741,241],{"class":174},[165,743,455],{"class":209},[165,745,293],{"class":174},[165,747,748],{"class":209},"\"0.35\"",[165,750,463],{"class":174},[165,752,753],{"class":60,"line":190},[165,754,194],{"emptyLinePlaceholder":193},[165,756,757,760,762,764,766,768,771],{"class":60,"line":197},[165,758,759],{"class":174},"teeth ",[165,761,203],{"class":170},[165,763,235],{"class":174},[165,765,238],{"class":216},[165,767,241],{"class":174},[165,769,770],{"class":216},"2.5",[165,772,275],{"class":174},[165,774,775],{"class":60,"line":222},[165,776,777],{"class":174},"teeth.setPlacements(Qgis.MarkerLinePlacement.Interval)\n",[165,779,780,783,786,789,792],{"class":60,"line":227},[165,781,782],{"class":174},"teeth.setOffset(",[165,784,785],{"class":170},"-",[165,787,788],{"class":216},"0.9",[165,790,791],{"class":174},")                                  ",[165,793,794],{"class":250},"# negative = left of digitizing direction\n",[165,796,797],{"class":60,"line":254},[165,798,799],{"class":174},"teeth.setSubSymbol(QgsMarkerSymbol.createSimple(\n",[165,801,802,804,806,808,811,813,815,817,819,821,823,825,828,830,832,834,836,838,841,843,846],{"class":60,"line":260},[165,803,287],{"class":174},[165,805,290],{"class":209},[165,807,293],{"class":174},[165,809,810],{"class":209},"\"triangle\"",[165,812,241],{"class":174},[165,814,301],{"class":209},[165,816,293],{"class":174},[165,818,739],{"class":209},[165,820,241],{"class":174},[165,822,311],{"class":209},[165,824,293],{"class":174},[165,826,827],{"class":209},"\"1.4\"",[165,829,241],{"class":174},[165,831,321],{"class":209},[165,833,293],{"class":174},[165,835,326],{"class":209},[165,837,241],{"class":174},[165,839,840],{"class":209},"\"angle\"",[165,842,293],{"class":174},[165,844,845],{"class":209},"\"0\"",[165,847,329],{"class":174},[165,849,850],{"class":60,"line":266},[165,851,852],{"class":174},"cliffs.setRenderer(QgsSingleSymbolRenderer(QgsLineSymbol([edge, teeth])))\n",[165,854,855],{"class":60,"line":278},[165,856,857],{"class":174},"cliffs.triggerRepaint()\n",[14,859,860,862,863,866,867,387],{},[372,861,374],{}," ",[162,864,865],{},"setOffset"," moves markers perpendicular to the line, negative to the left of the digitizing direction and positive to the right, so teeth always face the same side relative to the line — which means the data must be digitized consistently, conventionally with the cliff top on one side. With rotation enabled, the triangles turn with the line, staying perpendicular on curves. The marker's own angle adjusts which way the triangle points relative to the line. Lines digitized the wrong way can be flipped with ",[162,868,869],{},"native:reverselinedirection",[133,871,873],{"id":872},"draw-hashed-lines","Draw hashed lines",[14,875,876],{},"Hashed lines draw short line segments across the line at intervals, the basis of railway ties, boundary ticks and fences.",[155,878,880],{"className":157,"code":879,"language":159,"meta":160,"style":160},"from qgis.core import QgsHashedLineSymbolLayer\n\nrail = QgsProject.instance().mapLayersByName(\"railways\")[0]\nrail_base = QgsSimpleLineSymbolLayer.create({\"line_color\": \"#2f3b35\", \"line_width\": \"0.5\"})\n\nties = QgsHashedLineSymbolLayer(True, 2.0)\nties.setPlacements(Qgis.MarkerLinePlacement.Interval)\nties.setHashLength(1.6)\nties.setHashAngle(90)\nties.setSubSymbol(QgsLineSymbol.createSimple({\"color\": \"#2f3b35\", \"width\": \"0.3\"}))\n\nrail.setRenderer(QgsSingleSymbolRenderer(QgsLineSymbol([rail_base, ties])))\nrail.triggerRepaint()\n",[162,881,882,893,897,915,941,945,964,969,979,989,1011,1015,1020],{"__ignoreMap":160},[165,883,884,886,888,890],{"class":60,"line":167},[165,885,171],{"class":170},[165,887,175],{"class":174},[165,889,178],{"class":170},[165,891,892],{"class":174}," QgsHashedLineSymbolLayer\n",[165,894,895],{"class":60,"line":184},[165,896,194],{"emptyLinePlaceholder":193},[165,898,899,902,904,906,909,911,913],{"class":60,"line":190},[165,900,901],{"class":174},"rail ",[165,903,203],{"class":170},[165,905,206],{"class":174},[165,907,908],{"class":209},"\"railways\"",[165,910,213],{"class":174},[165,912,46],{"class":216},[165,914,219],{"class":174},[165,916,917,920,922,924,926,928,930,932,934,936,939],{"class":60,"line":197},[165,918,919],{"class":174},"rail_base ",[165,921,203],{"class":170},[165,923,442],{"class":174},[165,925,445],{"class":209},[165,927,293],{"class":174},[165,929,739],{"class":209},[165,931,241],{"class":174},[165,933,455],{"class":209},[165,935,293],{"class":174},[165,937,938],{"class":209},"\"0.5\"",[165,940,463],{"class":174},[165,942,943],{"class":60,"line":222},[165,944,194],{"emptyLinePlaceholder":193},[165,946,947,950,952,955,957,959,962],{"class":60,"line":227},[165,948,949],{"class":174},"ties ",[165,951,203],{"class":170},[165,953,954],{"class":174}," QgsHashedLineSymbolLayer(",[165,956,238],{"class":216},[165,958,241],{"class":174},[165,960,961],{"class":216},"2.0",[165,963,275],{"class":174},[165,965,966],{"class":60,"line":254},[165,967,968],{"class":174},"ties.setPlacements(Qgis.MarkerLinePlacement.Interval)\n",[165,970,971,974,977],{"class":60,"line":260},[165,972,973],{"class":174},"ties.setHashLength(",[165,975,976],{"class":216},"1.6",[165,978,275],{"class":174},[165,980,981,984,987],{"class":60,"line":266},[165,982,983],{"class":174},"ties.setHashAngle(",[165,985,986],{"class":216},"90",[165,988,275],{"class":174},[165,990,991,994,996,998,1000,1002,1005,1007,1009],{"class":60,"line":278},[165,992,993],{"class":174},"ties.setSubSymbol(QgsLineSymbol.createSimple({",[165,995,301],{"class":209},[165,997,293],{"class":174},[165,999,739],{"class":209},[165,1001,241],{"class":174},[165,1003,1004],{"class":209},"\"width\"",[165,1006,293],{"class":174},[165,1008,548],{"class":209},[165,1010,329],{"class":174},[165,1012,1013],{"class":60,"line":284},[165,1014,194],{"emptyLinePlaceholder":193},[165,1016,1017],{"class":60,"line":332},[165,1018,1019],{"class":174},"rail.setRenderer(QgsSingleSymbolRenderer(QgsLineSymbol([rail_base, ties])))\n",[165,1021,1022],{"class":60,"line":337},[165,1023,1024],{"class":174},"rail.triggerRepaint()\n",[14,1026,1027,1029,1030,1033,1034,1037],{},[372,1028,374],{}," Each hash is a short line of ",[162,1031,1032],{},"setHashLength"," millimetres drawn at ",[162,1035,1036],{},"setHashAngle"," degrees to the line — 90 for perpendicular ties, other angles for diagonal hatching. The hash's own appearance comes from its line sub-symbol, so hashes can be dashed, coloured or thick. A thin main line plus perpendicular ties every 2 mm is the familiar railway symbol; widening the ties and adding a white line on top gives the \"chequered\" style used in some national cartography.",[133,1039,1041],{"id":1040},"drive-markers-from-attributes","Drive markers from attributes",[14,1043,1044],{},"Marker lines can carry information, not just decoration: the marker at a pipe's start showing the type of fitting, the interval of fence posts reflecting fence type, the colour of boundary ticks showing the boundary's legal status. Data-defined properties on the marker sub-symbol and on the marker line itself make that possible.",[155,1046,1048],{"className":157,"code":1047,"language":159,"meta":160,"style":160},"from qgis.core import QgsProperty, QgsSymbolLayer\n\nfence = QgsProject.instance().mapLayersByName(\"fences\")[0]\nposts = QgsMarkerLineSymbolLayer(True, 4.0)\nposts.setPlacements(Qgis.MarkerLinePlacement.Interval)\nposts.setDataDefinedProperty(\n    QgsSymbolLayer.PropertyInterval,\n    QgsProperty.fromExpression(\"CASE WHEN \\\"type\\\" = 'electric' THEN 6 ELSE 3 END\"))\npost_marker = QgsMarkerSymbol.createSimple({\"name\": \"circle\", \"size\": \"0.8\", \"outline_style\": \"no\"})\npost_marker.symbolLayer(0).setDataDefinedProperty(\n    QgsSymbolLayer.PropertyFillColor,\n    QgsProperty.fromExpression(\"CASE WHEN \\\"condition\\\" = 'damaged' THEN '#b91c1c' ELSE '#2f3b35' END\"))\nposts.setSubSymbol(post_marker)\n\nline = QgsSimpleLineSymbolLayer.create({\"line_color\": \"#59645f\", \"line_width\": \"0.25\"})\nfence.setRenderer(QgsSingleSymbolRenderer(QgsLineSymbol([line, posts])))\nfence.triggerRepaint()\n",[162,1049,1050,1061,1065,1083,1101,1106,1111,1116,1138,1173,1183,1188,1206,1211,1215,1242,1247],{"__ignoreMap":160},[165,1051,1052,1054,1056,1058],{"class":60,"line":167},[165,1053,171],{"class":170},[165,1055,175],{"class":174},[165,1057,178],{"class":170},[165,1059,1060],{"class":174}," QgsProperty, QgsSymbolLayer\n",[165,1062,1063],{"class":60,"line":184},[165,1064,194],{"emptyLinePlaceholder":193},[165,1066,1067,1070,1072,1074,1077,1079,1081],{"class":60,"line":190},[165,1068,1069],{"class":174},"fence ",[165,1071,203],{"class":170},[165,1073,206],{"class":174},[165,1075,1076],{"class":209},"\"fences\"",[165,1078,213],{"class":174},[165,1080,46],{"class":216},[165,1082,219],{"class":174},[165,1084,1085,1088,1090,1092,1094,1096,1099],{"class":60,"line":197},[165,1086,1087],{"class":174},"posts ",[165,1089,203],{"class":170},[165,1091,235],{"class":174},[165,1093,238],{"class":216},[165,1095,241],{"class":174},[165,1097,1098],{"class":216},"4.0",[165,1100,275],{"class":174},[165,1102,1103],{"class":60,"line":222},[165,1104,1105],{"class":174},"posts.setPlacements(Qgis.MarkerLinePlacement.Interval)\n",[165,1107,1108],{"class":60,"line":227},[165,1109,1110],{"class":174},"posts.setDataDefinedProperty(\n",[165,1112,1113],{"class":60,"line":254},[165,1114,1115],{"class":174},"    QgsSymbolLayer.PropertyInterval,\n",[165,1117,1118,1121,1124,1127,1130,1132,1135],{"class":60,"line":260},[165,1119,1120],{"class":174},"    QgsProperty.fromExpression(",[165,1122,1123],{"class":209},"\"CASE WHEN ",[165,1125,1126],{"class":216},"\\\"",[165,1128,1129],{"class":209},"type",[165,1131,1126],{"class":216},[165,1133,1134],{"class":209}," = 'electric' THEN 6 ELSE 3 END\"",[165,1136,1137],{"class":174},"))\n",[165,1139,1140,1143,1145,1148,1150,1152,1154,1156,1158,1160,1163,1165,1167,1169,1171],{"class":60,"line":266},[165,1141,1142],{"class":174},"post_marker ",[165,1144,203],{"class":170},[165,1146,1147],{"class":174}," QgsMarkerSymbol.createSimple({",[165,1149,290],{"class":209},[165,1151,293],{"class":174},[165,1153,296],{"class":209},[165,1155,241],{"class":174},[165,1157,311],{"class":209},[165,1159,293],{"class":174},[165,1161,1162],{"class":209},"\"0.8\"",[165,1164,241],{"class":174},[165,1166,321],{"class":209},[165,1168,293],{"class":174},[165,1170,326],{"class":209},[165,1172,463],{"class":174},[165,1174,1175,1178,1180],{"class":60,"line":278},[165,1176,1177],{"class":174},"post_marker.symbolLayer(",[165,1179,46],{"class":216},[165,1181,1182],{"class":174},").setDataDefinedProperty(\n",[165,1184,1185],{"class":60,"line":284},[165,1186,1187],{"class":174},"    QgsSymbolLayer.PropertyFillColor,\n",[165,1189,1190,1192,1194,1196,1199,1201,1204],{"class":60,"line":332},[165,1191,1120],{"class":174},[165,1193,1123],{"class":209},[165,1195,1126],{"class":216},[165,1197,1198],{"class":209},"condition",[165,1200,1126],{"class":216},[165,1202,1203],{"class":209}," = 'damaged' THEN '#b91c1c' ELSE '#2f3b35' END\"",[165,1205,1137],{"class":174},[165,1207,1208],{"class":60,"line":337},[165,1209,1210],{"class":174},"posts.setSubSymbol(post_marker)\n",[165,1212,1213],{"class":60,"line":348},[165,1214,194],{"emptyLinePlaceholder":193},[165,1216,1217,1220,1222,1224,1226,1228,1231,1233,1235,1237,1240],{"class":60,"line":359},[165,1218,1219],{"class":174},"line ",[165,1221,203],{"class":170},[165,1223,442],{"class":174},[165,1225,445],{"class":209},[165,1227,293],{"class":174},[165,1229,1230],{"class":209},"\"#59645f\"",[165,1232,241],{"class":174},[165,1234,455],{"class":209},[165,1236,293],{"class":174},[165,1238,1239],{"class":209},"\"0.25\"",[165,1241,463],{"class":174},[165,1243,1244],{"class":60,"line":365},[165,1245,1246],{"class":174},"fence.setRenderer(QgsSingleSymbolRenderer(QgsLineSymbol([line, posts])))\n",[165,1248,1249],{"class":60,"line":628},[165,1250,1251],{"class":174},"fence.triggerRepaint()\n",[14,1253,1254,1256],{},[372,1255,374],{}," The interval is data-defined from the fence type, so electric fences show widely spaced posts and others dense ones, without separate rules. The post marker's fill colour is data-defined from a condition field, so damaged fences stand out in red within the same symbol. Data-defined properties are evaluated per feature, which keeps one symbol definition serving many variants; for very different appearances, a rule-based renderer with separate symbols is clearer. The same technique drives marker size, rotation and offset.",[133,1258,1260],{"id":1259},"combine-layers-into-classic-symbols","Combine layers into classic symbols",[14,1262,1263],{},"Real cartographic symbols combine several layers. A national boundary, for example: a wide pale band, a dash-dot line on top, and small markers at the vertices where the boundary turns.",[14,1265,1266],{},[29,1267,1270,1273,1276,1279,1282,1287,1290,1294,1297],{"viewBox":1268,"role":32,"ariaLabel":1269,"xmlns":34},"0 0 760 190","A boundary symbol made of a wide pale band, a dash-dot centre line and small vertex markers stacked in one symbol",[36,1271,1272],{},"A layered boundary symbol",[40,1274,1275],{},"A boundary symbol built from three layers: a wide translucent band underneath, a dash-dot line in the centre, and small crosses at vertices marking turning points. Each layer is a separate symbol layer in one line symbol, drawn in order from bottom to top.",[44,1277],{"x":46,"y":46,"width":47,"height":1278,"fill":49},"190",[51,1280,1281],{"x":53,"y":54,"style":55,"fill":56,"textAnchor":57},"Band, line, vertex markers",[60,1283],{"x1":62,"y1":1284,"x2":64,"y2":1284,"stroke":1285,"style":1286},"120","#c9c2ac","stroke-width:10",[60,1288],{"x1":62,"y1":1284,"x2":64,"y2":1284,"stroke":126,"style":1289},"stroke-width:1.5;stroke-dasharray:10 3 2 3",[68,1291],{"cx":1292,"cy":1284,"r":1293,"fill":126,"stroke":126,"style":73},"260","3",[68,1295],{"cx":1296,"cy":1284,"r":1293,"fill":126,"stroke":126,"style":73},"480",[51,1298,1300],{"x":53,"y":1299,"style":130,"fill":65,"textAnchor":57},"170","band · dash-dot line · vertex markers",[155,1302,1304],{"className":157,"code":1303,"language":159,"meta":160,"style":160},"boundary = QgsProject.instance().mapLayersByName(\"admin_boundaries\")[0]\nband = QgsSimpleLineSymbolLayer.create({\"line_color\": \"185,28,28,60\", \"line_width\": \"2.4\"})\ndashdot = QgsSimpleLineSymbolLayer.create({\"line_color\": \"#b91c1c\", \"line_width\": \"0.4\",\n                                           \"use_custom_dash\": \"1\", \"customdash\": \"6;1.5;1;1.5\"})\nturns = QgsMarkerLineSymbolLayer(False, 0)\nturns.setPlacements(Qgis.MarkerLinePlacement.InnerVertices)\nturns.setSubSymbol(QgsMarkerSymbol.createSimple(\n    {\"name\": \"cross2\", \"color\": \"#b91c1c\", \"size\": \"1.2\", \"outline_color\": \"#b91c1c\", \"outline_width\": \"0.2\"}))\nboundary.setRenderer(QgsSingleSymbolRenderer(QgsLineSymbol([band, dashdot, turns])))\nboundary.triggerRepaint()\n",[162,1305,1306,1324,1351,1379,1401,1419,1424,1429,1476,1481],{"__ignoreMap":160},[165,1307,1308,1311,1313,1315,1318,1320,1322],{"class":60,"line":167},[165,1309,1310],{"class":174},"boundary ",[165,1312,203],{"class":170},[165,1314,206],{"class":174},[165,1316,1317],{"class":209},"\"admin_boundaries\"",[165,1319,213],{"class":174},[165,1321,46],{"class":216},[165,1323,219],{"class":174},[165,1325,1326,1329,1331,1333,1335,1337,1340,1342,1344,1346,1349],{"class":60,"line":184},[165,1327,1328],{"class":174},"band ",[165,1330,203],{"class":170},[165,1332,442],{"class":174},[165,1334,445],{"class":209},[165,1336,293],{"class":174},[165,1338,1339],{"class":209},"\"185,28,28,60\"",[165,1341,241],{"class":174},[165,1343,455],{"class":209},[165,1345,293],{"class":174},[165,1347,1348],{"class":209},"\"2.4\"",[165,1350,463],{"class":174},[165,1352,1353,1356,1358,1360,1362,1364,1367,1369,1371,1373,1376],{"class":60,"line":190},[165,1354,1355],{"class":174},"dashdot ",[165,1357,203],{"class":170},[165,1359,442],{"class":174},[165,1361,445],{"class":209},[165,1363,293],{"class":174},[165,1365,1366],{"class":209},"\"#b91c1c\"",[165,1368,241],{"class":174},[165,1370,455],{"class":209},[165,1372,293],{"class":174},[165,1374,1375],{"class":209},"\"0.4\"",[165,1377,1378],{"class":174},",\n",[165,1380,1381,1384,1386,1389,1391,1394,1396,1399],{"class":60,"line":197},[165,1382,1383],{"class":209},"                                           \"use_custom_dash\"",[165,1385,293],{"class":174},[165,1387,1388],{"class":209},"\"1\"",[165,1390,241],{"class":174},[165,1392,1393],{"class":209},"\"customdash\"",[165,1395,293],{"class":174},[165,1397,1398],{"class":209},"\"6;1.5;1;1.5\"",[165,1400,463],{"class":174},[165,1402,1403,1406,1408,1410,1413,1415,1417],{"class":60,"line":222},[165,1404,1405],{"class":174},"turns ",[165,1407,203],{"class":170},[165,1409,235],{"class":174},[165,1411,1412],{"class":216},"False",[165,1414,241],{"class":174},[165,1416,46],{"class":216},[165,1418,275],{"class":174},[165,1420,1421],{"class":60,"line":227},[165,1422,1423],{"class":174},"turns.setPlacements(Qgis.MarkerLinePlacement.InnerVertices)\n",[165,1425,1426],{"class":60,"line":254},[165,1427,1428],{"class":174},"turns.setSubSymbol(QgsMarkerSymbol.createSimple(\n",[165,1430,1431,1433,1435,1437,1440,1442,1444,1446,1448,1450,1452,1454,1457,1459,1461,1463,1465,1467,1469,1471,1474],{"class":60,"line":260},[165,1432,287],{"class":174},[165,1434,290],{"class":209},[165,1436,293],{"class":174},[165,1438,1439],{"class":209},"\"cross2\"",[165,1441,241],{"class":174},[165,1443,301],{"class":209},[165,1445,293],{"class":174},[165,1447,1366],{"class":209},[165,1449,241],{"class":174},[165,1451,311],{"class":209},[165,1453,293],{"class":174},[165,1455,1456],{"class":209},"\"1.2\"",[165,1458,241],{"class":174},[165,1460,534],{"class":209},[165,1462,293],{"class":174},[165,1464,1366],{"class":209},[165,1466,241],{"class":174},[165,1468,543],{"class":209},[165,1470,293],{"class":174},[165,1472,1473],{"class":209},"\"0.2\"",[165,1475,329],{"class":174},[165,1477,1478],{"class":60,"line":266},[165,1479,1480],{"class":174},"boundary.setRenderer(QgsSingleSymbolRenderer(QgsLineSymbol([band, dashdot, turns])))\n",[165,1482,1483],{"class":60,"line":278},[165,1484,1485],{"class":174},"boundary.triggerRepaint()\n",[14,1487,1488,1490,1491,387],{},[372,1489,374],{}," The translucent band makes the boundary readable over busy basemaps without hiding them. The custom dash pattern — 6 mm dash, 1.5 mm gap, 1 mm dot, 1.5 mm gap — is the dash-dot convention for administrative boundaries. Inner-vertex placement marks turning points but not the line's ends, which usually meet other boundary segments. Save finished symbols to the style library so every project uses the same boundary style, as in ",[21,1492,1494],{"href":1493},"\u002Fpyqgis-cartography-visualization\u002Fprogrammatic-layer-styling\u002Fuse-style-manager-and-symbol-library-pyqgis\u002F","using the style manager and symbol library",[133,1496,1498],{"id":1497},"qgis-version-compatibility","QGIS version compatibility",[14,1500,1501,1504,1505,1508,1509,1511,1512,1515,1516,1518,1519,387],{},[162,1502,1503],{},"QgsMarkerLineSymbolLayer"," and ",[162,1506,1507],{},"QgsHashedLineSymbolLayer"," are available on QGIS 3.34 LTR, 3.40 LTR and QGIS 4. ",[162,1510,382],{}," with combinable ",[162,1513,1514],{},"Qgis.MarkerLinePlacement"," flags replaced the single-value ",[162,1517,386],{}," in 3.24; inner-vertex and segment-centre placements arrived in the same period. On QGIS 4, units use ",[162,1520,1521],{},"Qgis.RenderUnit.Millimeters",[133,1523,1525],{"id":1524},"troubleshooting","Troubleshooting",[138,1527,1528,1534,1540,1546],{},[141,1529,1530,1533],{},[372,1531,1532],{},"Markers face the wrong side."," The line is digitized in the other direction; reverse it or flip the offset sign.",[141,1535,1536,1539],{},[372,1537,1538],{},"Markers pile up at sharp corners."," Interval placement follows the line exactly; increase the interval or simplify the geometry.",[141,1541,1542,1545],{},[372,1543,1544],{},"The pattern does not scale with zoom."," Units are map units; use millimetres for a constant look.",[141,1547,1548,1551],{},[372,1549,1550],{},"No markers on short features."," The interval is longer than the line; add a central-point placement.",[133,1553,1555],{"id":1554},"conclusion","Conclusion",[14,1557,1558],{},"Use marker lines for markers at intervals, vertices, ends or the centre, offset them across the line and rotate them with it for side-specific symbols, use hashed lines for ties and ticks, combine bands, dashed lines and markers into classic symbols, keep units in millimetres, and digitize lines consistently so side and direction are right.",[133,1560,1562],{"id":1561},"frequently-asked-questions","Frequently Asked Questions",[14,1564,1565,1568],{},[372,1566,1567],{},"Can markers be spaced in map units?","\nYes — set the interval unit to map units, for example a marker every 100 m along a pipe.",[14,1570,1571,1574],{},[372,1572,1573],{},"Can the interval be data-defined?","\nYes, through the marker line's data-defined interval property.",[14,1576,1577,1580],{},[372,1578,1579],{},"How do I avoid markers on hidden line parts?","\nUse the symbol's clip or draw-only-on-visible-part options on recent releases.",[14,1582,1583,1586],{},[372,1584,1585],{},"Can I use an SVG as the marker?","\nYes — any marker symbol, including SVG markers, works as the sub-symbol.",[133,1588,1590],{"id":1589},"related","Related",[138,1592,1593,1598,1604,1609,1615],{},[141,1594,1595,1597],{},[21,1596,24],{"href":23}," — the guide this recipe belongs to",[141,1599,1600],{},[21,1601,1603],{"href":1602},"\u002Fpyqgis-cartography-visualization\u002Fsymbol-layers-and-advanced-symbology\u002Farrow-symbol-layer-pyqgis\u002F","Use the Arrow Symbol Layer in PyQGIS",[141,1605,1606],{},[21,1607,1608],{"href":645},"Stack Symbol Layers in PyQGIS",[141,1610,1611],{},[21,1612,1614],{"href":1613},"\u002Fpyqgis-cartography-visualization\u002Fsymbol-layers-and-advanced-symbology\u002Fuse-svg-marker-symbol-pyqgis\u002F","Use an SVG Marker Symbol in PyQGIS",[141,1616,1617],{},[21,1618,1620],{"href":1619},"\u002Fspatial-data-processing-automation\u002Fvector-data-manipulation\u002Fgenerate-points-along-lines-pyqgis\u002F","Generate Points Along Lines in PyQGIS",[1622,1623,1624],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sjoCn, html code.shiki .sjoCn{--shiki-default:#9AA79F}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":160,"searchDepth":184,"depth":184,"links":1626},[1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638],{"id":135,"depth":184,"text":136},{"id":149,"depth":184,"text":150},{"id":390,"depth":184,"text":391},{"id":649,"depth":184,"text":650},{"id":872,"depth":184,"text":873},{"id":1040,"depth":184,"text":1041},{"id":1259,"depth":184,"text":1260},{"id":1497,"depth":184,"text":1498},{"id":1524,"depth":184,"text":1525},{"id":1554,"depth":184,"text":1555},{"id":1561,"depth":184,"text":1562},{"id":1589,"depth":184,"text":1590},"Place markers along lines with QgsMarkerLineSymbolLayer and hashed lines — fixed intervals, vertices, first and last points, centre point, offsets along and across the line, rotation, and classic cartographic lines such as railways, boundaries, fences and pipelines with valves.","md",{"slug":1642,"type":1643,"breadcrumb":1644,"datePublished":1645,"dateModified":1645},"marker-line-and-interval-symbols-pyqgis","article","Marker Line and Interval Symbols","2026-10-02","\u002Fpyqgis-cartography-visualization\u002Fsymbol-layers-and-advanced-symbology\u002Fmarker-line-and-interval-symbols-pyqgis",{"title":5,"description":1639},"pyqgis-cartography-visualization\u002Fsymbol-layers-and-advanced-symbology\u002Fmarker-line-and-interval-symbols-pyqgis\u002Findex","reASTQFAM0CQuVqRU69NEQ0QyQAkac7krJb51v82Fv0",1790966252917]