Skip to content

Continuous improvement of powerline analyser #2497

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 59 commits into from
Jun 16, 2025
Merged
Changes from 2 commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
2a97485
Continuous improvement of powerline analyser
flacombe Apr 23, 2025
45a3ba7
Add tests for item 7040 classes 2, 4, 6 and 8
flacombe Apr 24, 2025
3a99bca
Fix lint, tests
flacombe Apr 24, 2025
9155796
fix typo
flacombe Apr 24, 2025
b8a3916
fix nodes_voltage_values
flacombe Apr 24, 2025
adbb098
Add comments
flacombe Apr 25, 2025
3cbdbc3
Add tests for class 1 and fix class 3
flacombe Apr 25, 2025
e3888c4
Add test class 8 for two lines on same tower
flacombe Apr 25, 2025
ffac283
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
ff735e3
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
badc931
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
f944410
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
7130710
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
a0450f8
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
184477b
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
88c2179
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
e1f0daf
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
b69618e
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
fe06b16
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
d7dc574
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
3ef2354
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
e3c9b99
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
8dae2fc
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
eb8c78e
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
b4890ab
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
21ad815
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
1cbfb47
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
d238938
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
321839d
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
e9587b9
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
f70222b
Update analysers/analyser_osmosis_powerline.py
frodrigo Apr 26, 2025
3332aab
Lint
frodrigo Apr 26, 2025
2929bde
Fix lint
flacombe Apr 28, 2025
312f559
Fix lint
flacombe Apr 28, 2025
5b4d8d5
Improve topoedge voltage management
flacombe May 16, 2025
9e95019
Fix lint
flacombe May 16, 2025
e48dcbd
Normalize hstore nulls
flacombe May 16, 2025
2979694
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
6de0b07
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
ce5ef25
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
7276bff
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
ff79b69
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
d80acfa
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
7106c00
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
b7fbad2
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
1c3e043
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
e832402
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
c53df75
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
05e887c
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
0a04435
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
d233a43
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
e318cc7
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
ddea2d2
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
ed8177c
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
3a3edfd
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
4c3a73c
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
a236d91
Continue review
flacombe May 17, 2025
ab68bf6
Merge branch 'feature/powerline' of github.com:flacombe/osmose-backen…
flacombe May 17, 2025
4e08c74
Update analysers/analyser_osmosis_powerline.py
frodrigo May 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
237 changes: 161 additions & 76 deletions analysers/analyser_osmosis_powerline.py
Original file line number Diff line number Diff line change
@@ -29,20 +29,96 @@
sql01 = """
CREATE TEMP TABLE power_lines_nodes AS
SELECT
ways.id as wid,
unnest(ways.nodes) AS nid,
unnest(ways.nodes[2:array_length(ways.nodes,1)]) AS nid_next,
ways.tags->'cables' as cables,
ways.tags->'circuits' as circuits,
coalesce(ways.tags->'location','overhead') as location,
w.id as wid,
unnest('{NULL}'||w.nodes[1:array_length(w.nodes,1)-1]) AS nid_prec,
unnest(w.nodes) AS nid,
unnest(w.nodes[2:array_length(w.nodes,1)]) AS nid_next,
w.tags->'cables' as cables,
coalesce((w.tags->'circuits')::integer, 1) as circuits,
coalesce(w.tags->'location','overhead') as location,
voltage
FROM
ways
JOIN LATERAL (SELECT array_agg(lpad(v, 99, '0')) FROM unnest(regexp_split_to_array(ways.tags->'voltage','; *')) AS t(v)) AS t(voltage) ON TRUE
ways w
JOIN LATERAL (
SELECT array_agg(lpad(v, 99, '0'))
FROM unnest(array_cat(
array_fill(
substring(w.tags->'voltage' for greatest(char_length (w.tags->'voltage'), position(';' in w.tags->'voltage')))::text, -- voltage1 in voltage1;voltage2
ARRAY[coalesce((w.tags->'circuits')::integer, 1) - 1 + char_length(coalesce(w.tags->'voltage','')) - char_length(replace(coalesce(w.tags->'voltage',''), ';', ''))]
),
regexp_split_to_array(w.tags->'voltage','; *'))
) AS t(v)
WHERE v ~ '^[0-9\.]+$') AS t(voltage)
ON TRUE
WHERE
ways.tags != ''::hstore AND
ways.tags?'power' AND
ways.tags->'power' IN ('line', 'minor_line', 'cable')
w.tags != ''::hstore AND
w.tags?'power' AND
w.tags->'power' IN ('line', 'minor_line', 'cable') AND
w.tags->'voltage' IS NOT NULL

UNION ALL

SELECT
w.id as wid,
unnest('{NULL}'||w.nodes[1:array_length(w.nodes,1)-1]) AS nid_prec,
unnest(w.nodes) AS nid,
unnest(w.nodes[2:array_length(w.nodes,1)]) AS nid_next,
w.tags->'cables' as cables,
coalesce((w.tags->'circuits')::integer, 1) as circuits,
coalesce(w.tags->'location','overhead') as location,
NULL as voltage
FROM
ways w
WHERE
w.tags != ''::hstore AND
w.tags?'power' AND
w.tags->'power' IN ('line', 'minor_line', 'cable') AND
w.tags->'voltage' IS NULL
"""

# Build junctions knowledge
sql02 = """
CREATE TEMP TABLE power_lines_topoedges AS

WITH topotuples as (
(SELECT
n.wid,
n.nid # n.nid_prec AS tid,
n.nid,
n.location,
n.cables,
n.circuits,
voltage
FROM power_lines_nodes n
WHERE nid_prec IS NOT NULL)

UNION ALL

(SELECT
n.wid,
n.nid # n.nid_next as tid,
n.nid,
n.location,
n.cables,
n.circuits,
voltage
FROM power_lines_nodes n
WHERE nid_next IS NOT NULL)
)

SELECT
p.nid,
p.tid,
p.location,
COUNT(distinct p.wid) as cw,
SUM(p.circuits::integer) as circuits,
regexp_split_to_array(string_agg(array_to_string(p.voltage,';'),';'),'; *') as voltage
FROM
topotuples p
GROUP BY
p.nid, p.tid, p.location
HAVING
array_position(array_agg(p.circuits), NULL) IS NULL
"""

# Lone power supports
@@ -172,11 +248,13 @@
sql26 = """
SELECT
t.nid,
t.wid,
ST_AsText(t.geom),
t.power
FROM (
SELECT
u.nid,
u.wid,
u.geom,
u.power
FROM
@@ -186,6 +264,7 @@

SELECT
u.nid,
u.wid,
u.geom,
u.power
FROM
@@ -197,6 +276,7 @@

SELECT
u.nid,
u.wid,
u.geom,
u.power
FROM
@@ -211,57 +291,69 @@
) AS t
"""

# Power lines junctions as nodes with voltage repeated several times
# Every plain line junction that isn't transformers or cross repeated twice (main and / sqrt(3)) (meaning the junction involves different voltages)
sql30 = """
CREATE VIEW power_lines_junctions AS
SELECT
p.nid
FROM
(SELECT nid FROM power_lines_nodes n WHERE n.voltage IS NOT NULL GROUP BY n.wid, n.nid) AS p
GROUP BY
p.nid
HAVING
COUNT(*) > 1
"""
with nodes_voltage as (
SELECT
nid,
tid,
unnest(voltage)::integer voltage,
round(unnest(voltage)::numeric / 1000,1) voltage_val
FROM power_lines_topoedges
UNION SELECT
nid,
tid,
unnest(voltage)::integer voltage,
round((unnest(voltage)::integer / (1000 * sqrt(3)))::numeric,1) voltage_val
FROM power_lines_topoedges
),

nodes_selected as (
SELECT
nid
FROM
nodes_voltage
GROUP BY nid
HAVING COUNT(distinct tid) > 1 AND array_position(array_agg(voltage), NULL) IS NULL
),

voltage_groups as (
SELECT
n.nid,
max(n.voltage) as voltage,
n.voltage_val,
count(n.voltage) cv
FROM nodes_voltage n
JOIN nodes_selected s
ON s.nid=n.nid
GROUP BY n.nid, n.voltage_val
)

# Every junctions that aren't transformers cross, splits or terminations repeated a single time (meaning the junction involves different voltages)
sql31 = """
SELECT
DISTINCT(j.nid),
DISTINCT(v.nid),
ST_AsText(nodes.geom)
FROM
power_lines_junctions j
NATURAL JOIN power_lines_nodes n
JOIN nodes ON
n.nid = nodes.id
FROM voltage_groups v
JOIN nodes ON
v.nid = nodes.id
WHERE
n.voltage is not null AND
(
NOT nodes.tags?'power' OR
nodes.tags->'power' != 'transformer'
) AND
NOT nodes.tags?'transformer' AND -- example: power=pole + transformer=*
(
NOT nodes.tags?'line_management' OR
(
NOT 'split' = ANY(string_to_array(nodes.tags->'line_management', '|')) AND
NOT 'termination' = ANY(string_to_array(nodes.tags->'line_management', '|')) AND
nodes.tags->'line_management' != 'cross'
)
NOT nodes.tags?'line_management' OR nodes.tags->'line_management' != 'cross'
)

GROUP BY
j.nid,
n.voltage,
nodes.geom
GROUP BY v.nid, nodes.geom, v.voltage
HAVING
COUNT(*) = 1
sum(v.cv)=2
"""

# Non power nodes on power line and minor_line ways
sql40 = """
SELECT DISTINCT ON (nodes.id)
nodes.id,
nodes.id as nid,
ways.id as wid,
ST_AsText(nodes.geom)
FROM
ways
@@ -366,31 +458,17 @@
sql70 = """
CREATE TEMP TABLE power_lines_mgmt AS

WITH topotuples as (
(SELECT
n.wid, n.nid, n.location, n.cables, coalesce(n.circuits, CASE n.cables WHEN '3' THEN '1' ELSE NULL END) as circuits
FROM power_lines_nodes n
WHERE nid_next IS NOT NULL)

UNION ALL

(SELECT
n.wid, n.nid_next as nid, n.location, n.cables, coalesce(n.circuits, CASE n.cables WHEN '3' THEN '1' ELSE NULL END) as circuits
FROM power_lines_nodes n
WHERE nid_next IS NOT NULL)
),junctions as (
WITH vertices as (
SELECT
COUNT(distinct p.wid) as cw,
COUNT(*) as cn,
p.nid,
string_agg(CASE p.location WHEN 'overhead' THEN p.circuits ELSE NULL END,'-' order by p.circuits desc) as circuits_overhead,
string_agg(CASE WHEN p.location!='overhead' THEN p.circuits ELSE NULL END,'-' order by p.circuits desc) as circuits_elsewhere
e.nid,
string_agg(CASE e.location WHEN 'overhead' THEN e.circuits::varchar ELSE NULL END,'-' order by e.circuits desc) as circuits_overhead,
string_agg(CASE WHEN e.location!='overhead' THEN e.circuits::varchar ELSE NULL END,'-' order by e.circuits desc) as circuits_elsewhere
FROM
topotuples p
power_lines_topoedges e
GROUP BY
p.nid
e.nid
HAVING
COUNT(*) > 1 AND COUNT(distinct p.wid) > 1 AND array_position(array_agg(p.circuits), NULL) IS NULL
COUNT(*) > 1 AND SUM(e.circuits) > 2
)

SELECT
@@ -432,7 +510,7 @@
ELSE NULL
END as location_transition
FROM
junctions j
vertices j
"""

sql71 = """
@@ -505,22 +583,26 @@ def __init__(self, config, logger = None):
self.classs[8] = self.def_class(item = 7040, level = 3, tags = ['power', 'fix:chair'],
title = T_('Power support line management suggestion'))

self.callback40 = lambda res: {"class":4, "data":[self.node_full, self.positionAsText], "fix":[{"+": {"power": "tower"}}, {"+": {"power": "pole"}}]}
self.callback50 = lambda res: {"class":5, "subclass": stablehash64(res[1]), "data":[self.way_full, self.positionAsText]}

def way_power(self, res):
way_data = self.apiconn.WayGet(res)
way_tags = {key: way_data["tag"][key] for key in way_data["tag"].keys() & {'power', 'voltage'}}
self.geom["way"].append({"id":res, "nd":[], "tag":way_tags})

def analyser_osmosis_common(self):
self.run(sql01)
self.run(sql02)
self.run(sql10, lambda res: {"class":1, "data":[self.node_full, self.positionAsText]} )
self.run(sql20)
self.run(sql21)
self.run(sql22)
self.run(sql23)
self.run(sql24)
self.run(sql25)
self.run(sql26, lambda res: {"class":6 if res[2] == 'minor_line' else 2, "data":[self.node_full, self.positionAsText]} )
self.run(sql30)
self.run(sql31, lambda res: {"class":3, "data":[self.node, self.positionAsText]} )
self.run(sql40, self.callback40)
self.run(sql26, lambda res: {"class":6 if res[3] == 'minor_line' else 2, "data":[self.node_full, self.way_power, self.positionAsText]} )
self.run(sql30, lambda res: {"class":3, "data":[self.node, self.positionAsText]} )
self.run(sql40, lambda res: {"class":4, "data":[self.node_full, self.way_power, self.positionAsText], "fix":[{"+": {"power": "tower"}}, {"+": {"power": "pole"}}]})
self.run(sql60, lambda res: {"class":7, "data":[self.way_full, self.any_full, self.positionAsText]} )
self.run(sql70)
self.run(sql71, lambda res: {"class":8, "data":[self.node_full, self.positionAsText], "fix":self.__callback80_fix(res)} )
@@ -553,20 +635,23 @@ def __callback80_fix(self, res):

###########################################################################

import time
from .Analyser_Osmosis import TestAnalyserOsmosis

class Test(TestAnalyserOsmosis):
@classmethod
def setup_class(cls):
from modules import config
TestAnalyserOsmosis.setup_class()
cls.analyser_conf = cls.load_osm("tests/osmosis_powerline_voltage.test.osm",
config.dir_tmp + "/tests/osmosis_powerline_voltage.test.xml")
cls.analyser_conf = cls.load_osm("tests/osmosis_powerline.test.osm",
config.dir_tmp + "/tests/osmosis_powerline.test.xml")

def test_class3(self):
def test_powergrid(self):
with Analyser_Osmosis_Powerline(self.analyser_conf, self.logger) as a:
a.analyser()

self.root_err = self.load_errors()
self.check_err(cl="3", elems=[("node", "4")])
self.check_num_err(1)
self.check_err(cl="2", elems=[("node", "25874")])
self.check_err(cl="2", elems=[("node", "25883")])
self.check_err(cl="3", elems=[("node", "25950")])
self.check_num_err(7)
347 changes: 347 additions & 0 deletions tests/osmosis_powerline.test.osm
Original file line number Diff line number Diff line change
@@ -0,0 +1,347 @@
<?xml version='1.0' encoding='UTF-8'?>
<osm version='0.6' generator='JOSM'>
<node id='25873' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19229424221' lon='4.47287852839'>
<tag k='power' v='insulator' />
</node>
<node id='25874' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19228681528' lon='4.47405870035'>
<tag k='power' v='tower' />
</node>
<node id='25875' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19172236547' lon='4.47380120829'>
<tag k='line_management' v='split' />
<tag k='power' v='tower' />
</node>
<node id='25876' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19104650347' lon='4.47379047945'>
<tag k='power' v='tower' />
</node>
<node id='25877' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19050432245' lon='4.47377975062'>
<tag k='power' v='tower' />
</node>
<node id='25878' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19040776911' lon='4.47758848742' />
<node id='25879' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19034092438' lon='4.47750265673'>
<tag k='line_management' v='transition' />
<tag k='location' v='underground' />
<tag k='power' v='pole' />
</node>
<node id='25880' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19018976738' lon='4.47730911825'>
<tag k='line_management' v='branch' />
<tag k='power' v='pole' />
</node>
<node id='25881' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19025116596' lon='4.47738773173'>
<tag k='power' v='pole' />
</node>
<node id='25882' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.1903014806' lon='4.47745215362'>
<tag k='power' v='pole' />
</node>
<node id='25883' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19085339852' lon='4.47848970965' />
<node id='25884' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19083854426' lon='4.47818930224' />
<node id='25885' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19069742863' lon='4.47813565806' />
<node id='25886' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.1905191768' lon='4.47816784456' />
<node id='25887' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19029636119' lon='4.47821075991' />
<node id='25888' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19025179796' lon='4.47800691202' />
<node id='25889' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19031864279' lon='4.47777087763' />
<node id='25890' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18883689105' lon='4.48189344093' />
<node id='25891' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18882946365' lon='4.48179151699' />
<node id='25892' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18879604034' lon='4.48146428749' />
<node id='25893' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18886474379' lon='4.48138113901' />
<node id='25894' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18886288694' lon='4.48133017704' />
<node id='25895' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.189171123' lon='4.48271151468' />
<node id='25896' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18917297984' lon='4.48260959074' />
<node id='25897' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18911356097' lon='4.4825371711' />
<node id='25898' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18903557362' lon='4.48253448889' />
<node id='25899' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18893901769' lon='4.48251571342' />
<node id='25900' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18892416292' lon='4.4824781625' />
<node id='25901' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18893159031' lon='4.48235209867' />
<node id='25902' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18892973346' lon='4.48228236124' />
<node id='25903' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18888145543' lon='4.4822421281' />
<node id='25904' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18882203625' lon='4.48223408148' />
<node id='25905' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18879604034' lon='4.48222335264' />
<node id='25906' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18873290922' lon='4.48081250802'>
<tag k='power' v='transformer' />
</node>
<node id='25907' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18875704645' lon='4.48210265324' />
<node id='25908' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18870876826' lon='4.48205437347' />
<node id='25909' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18872919365' lon='4.4820034115' />
<node id='25910' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18877747182' lon='4.48197122499' />
<node id='25911' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18876818756' lon='4.48177542374' />
<node id='25912' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18868834286' lon='4.48177005932' />
<node id='25913' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18860107062' lon='4.48169763967' />
<node id='25914' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18859550004' lon='4.48164399549' />
<node id='25915' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18862335291' lon='4.4815554826' />
<node id='25916' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18869391343' lon='4.481496474' />
<node id='25917' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18876076015' lon='4.48128726169' />
<node id='25918' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.1886660606' lon='4.4812577574' />
<node id='25919' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18860292748' lon='4.48115583345' />
<node id='25920' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18867720173' lon='4.48101367638' />
<node id='25921' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18876076015' lon='4.48097076103' />
<node id='25922' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18877375812' lon='4.48091443464' />
<node id='25923' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.1887589033' lon='4.48214288637' />
<node id='25924' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18835782171' lon='4.48300655767'>
<tag k='power' v='terminal' />
</node>
<node id='25925' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18842281198' lon='4.48296900675' />
<node id='25926' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.1884673767' lon='4.48282416746' />
<node id='25927' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18845994925' lon='4.48275979444' />
<node id='25928' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18843395316' lon='4.48258813307' />
<node id='25929' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18847294728' lon='4.48240574285' />
<node id='25930' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18855464915' lon='4.48235746309' />
<node id='25931' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18863263719' lon='4.48232259437' />
<node id='25932' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18865120575' lon='4.48227967903' />
<node id='25933' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18867534488' lon='4.48219116613' />
<node id='25934' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18869205657' lon='4.48216434404' />
<node id='25935' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18871434068' lon='4.47785671368'>
<tag k='power' v='tower' />
</node>
<node id='25936' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18871434068' lon='4.4785755457'>
<tag k='power' v='tower' />
</node>
<node id='25937' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.1887217681' lon='4.47932656422'>
<tag k='power' v='tower' />
</node>
<node id='25938' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.1887254818' lon='4.48009904042'>
<tag k='power' v='tower' />
</node>
<node id='25939' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18991014533' lon='4.47380120829'>
<tag k='power' v='tower' />
</node>
<node id='25940' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18930853445' lon='4.47380120829'>
<tag k='power' v='tower' />
</node>
<node id='25941' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18874405405' lon='4.47380120829'>
<tag k='line_management' v='branch|straight' />
<tag k='power' v='tower' />
</node>
<node id='25942' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18822413277' lon='4.47380120829'>
<tag k='power' v='tower' />
</node>
<node id='25943' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18764478612' lon='4.47381193712'>
<tag k='power' v='tower' />
</node>
<node id='25944' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18873290922' lon='4.47475071564'>
<tag k='power' v='tower' />
</node>
<node id='25945' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18873290922' lon='4.47558220044'>
<tag k='power' v='tower' />
</node>
<node id='25946' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.1887254818' lon='4.47637076989'>
<tag k='power' v='tower' />
</node>
<node id='25947' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18872919551' lon='4.47713251725'>
<tag k='line_management' v='branch' />
<tag k='power' v='tower' />
</node>
<node id='25948' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18910799602' lon='4.47712714747'>
<tag k='power' v='tower' />
</node>
<node id='25949' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18955363597' lon='4.47709496096'>
<tag k='power' v='tower' />
</node>
<node id='25950' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19001412679' lon='4.47708423212' />
<node id='25951' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19005555525' lon='4.47713727609'>
<tag k='power' v='pole' />
</node>
<node id='25952' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19012399663' lon='4.47722490682'>
<tag k='power' v='pole' />
</node>
<node id='25953' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18708028864' lon='4.47384412363'>
<tag k='power' v='tower' />
</node>
<node id='25954' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18638208636' lon='4.47385485247'>
<tag k='power' v='tower' />
</node>
<node id='25955' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18581014811' lon='4.47385485247'>
<tag k='power' v='tower' />
</node>
<node id='25956' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.1851564971' lon='4.47385485247'>
<tag k='power' v='tower' />
</node>
<node id='25957' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18455483419' lon='4.47345788553'>
<tag k='power' v='terminal' />
</node>
<node id='25958' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18454740621' lon='4.47414453104'>
<tag k='power' v='insulator' />
</node>
<node id='26007' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19013195417' lon='4.47741984796'>
<tag k='power' v='pole' />
</node>
<node id='26008' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19008007533' lon='4.47751921145'>
<tag k='power' v='pole' />
</node>
<node id='26009' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.19001231809' lon='4.47764898669'>
<tag k='power' v='pole' />
</node>
<node id='26010' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18994725373' lon='4.47777360409'>
<tag k='line_management' v='termination' />
<tag k='power' v='pole' />
</node>
<node id='26082' timestamp='2025-04-24T15:00:00Z' version='1' lat='46.18786193028' lon='4.47380791587' />
<way id='1908' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25873' />
<nd ref='25875' />
<tag k='power' v='line' />
<tag k='voltage' v='225000' />
</way>
<way id='1909' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25874' />
<nd ref='25875' />
<tag k='power' v='line' />
<tag k='voltage' v='225000' />
</way>
<way id='1910' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25875' />
<nd ref='25876' />
<nd ref='25877' />
<nd ref='25939' />
<nd ref='25940' />
<nd ref='25941' />
<nd ref='25942' />
<nd ref='26082' />
<nd ref='25943' />
<nd ref='25953' />
<nd ref='25954' />
<nd ref='25955' />
<nd ref='25956' />
<tag k='cables' v='6' />
<tag k='circuits' v='2' />
<tag k='power' v='line' />
<tag k='voltage' v='225000' />
</way>
<way id='1911' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25957' />
<nd ref='25956' />
<tag k='power' v='line' />
<tag k='voltage' v='225000' />
</way>
<way id='1912' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25956' />
<nd ref='25958' />
<tag k='power' v='line' />
<tag k='voltage' v='225000' />
</way>
<way id='1913' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25941' />
<nd ref='25944' />
<nd ref='25945' />
<nd ref='25946' />
<nd ref='25947' />
<nd ref='25935' />
<nd ref='25936' />
<nd ref='25937' />
<nd ref='25938' />
<nd ref='25906' />
<tag k='cables' v='3' />
<tag k='power' v='line' />
<tag k='voltage' v='225000' />
</way>
<way id='1914' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25907' />
<nd ref='25908' />
<nd ref='25909' />
<nd ref='25910' />
<nd ref='25890' />
<nd ref='25891' />
<nd ref='25911' />
<nd ref='25912' />
<nd ref='25913' />
<nd ref='25914' />
<nd ref='25915' />
<nd ref='25916' />
<nd ref='25892' />
<nd ref='25893' />
<nd ref='25894' />
<nd ref='25917' />
<nd ref='25918' />
<nd ref='25919' />
<nd ref='25920' />
<nd ref='25921' />
<nd ref='25922' />
<nd ref='25906' />
<tag k='cables' v='3' />
<tag k='location' v='underground' />
<tag k='power' v='cable' />
<tag k='voltage' v='400' />
</way>
<way id='1915' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25895' />
<nd ref='25896' />
<nd ref='25897' />
<nd ref='25898' />
<nd ref='25899' />
<nd ref='25900' />
<nd ref='25901' />
<nd ref='25902' />
<nd ref='25903' />
<nd ref='25904' />
<nd ref='25905' />
<nd ref='25923' />
<nd ref='25907' />
<tag k='cables' v='3' />
<tag k='location' v='underground' />
<tag k='power' v='cable' />
<tag k='voltage' v='400' />
</way>
<way id='1916' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25924' />
<nd ref='25925' />
<nd ref='25926' />
<nd ref='25927' />
<nd ref='25928' />
<nd ref='25929' />
<nd ref='25930' />
<nd ref='25931' />
<nd ref='25932' />
<nd ref='25933' />
<nd ref='25934' />
<nd ref='25907' />
<tag k='cables' v='3' />
<tag k='location' v='underground' />
<tag k='power' v='cable' />
<tag k='voltage' v='400' />
</way>
<way id='1917' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25947' />
<nd ref='25948' />
<nd ref='25949' />
<nd ref='25950' />
<tag k='cables' v='3' />
<tag k='power' v='line' />
<tag k='voltage' v='225000' />
</way>
<way id='1918' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25883' />
<nd ref='25884' />
<nd ref='25885' />
<nd ref='25886' />
<nd ref='25887' />
<nd ref='25888' />
<nd ref='25889' />
<nd ref='25878' />
<nd ref='25879' />
<tag k='circuits' v='1' />
<tag k='location' v='underground' />
<tag k='power' v='cable' />
<tag k='voltage' v='20000' />
</way>
<way id='1919' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25950' />
<nd ref='25951' />
<nd ref='25952' />
<nd ref='25880' />
<nd ref='25881' />
<nd ref='25882' />
<nd ref='25879' />
<tag k='circuits' v='1' />
<tag k='power' v='minor_line' />
<tag k='voltage' v='20000' />
</way>
<way id='1932' timestamp='2025-04-24T15:00:00Z' version='1'>
<nd ref='25880' />
<nd ref='26007' />
<nd ref='26008' />
<nd ref='26009' />
<nd ref='26010' />
<tag k='cables' v='1' />
<tag k='circuits' v='1' />
<tag k='power' v='minor_line' />
<tag k='voltage' v='11500' />
</way>
</osm>
46 changes: 0 additions & 46 deletions tests/osmosis_powerline_voltage.test.osm

This file was deleted.