Skip to content

Instantly share code, notes, and snippets.

@rwl
Created June 12, 2015 10:48
Show Gist options
  • Save rwl/396e35aa41919714b0a1 to your computer and use it in GitHub Desktop.
Save rwl/396e35aa41919714b0a1 to your computer and use it in GitHub Desktop.
Extract geographical coords from CIM RDF/XML data
import xml.etree.ElementTree as etree
data = '''<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF xmlns:entsoe="http://entsoe.eu/Secretariat/2013/ProfileExtension/3"
xmlns:cim="http://iec.ch/TC57/2013/CIM-schema-cim16#"
xmlns:md="http://iec.ch/TC57/61970-552/ModelDescription/1#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<md:FullModel rdf:about="urn:uuid:6fdb7290-de0d-11e2-8f45-b8f6b1180b6d">
<md:Model.created>2013-06-26T00:00:00</md:Model.created>
<md:Model.DependentOn rdf:resource="urn:uuid:2399cbd2-9a39-11e0-aa80-0800200c9a66_EU"/>
<md:Model.DependentOn rdf:resource="urn:uuid:2399cbd4-9a39-11e0-aa80-0800200c9a66_EU"/>
<md:Model.DependentOn rdf:resource="urn:uuid:54172206-ea0a-44ee-be5d-0443b556b08d"/>
<md:Model.DependentOn rdf:resource="urn:uuid:54172206-ea0a-44ee-be5d-0443b556b08l"/>
<md:Model.modelingAuthoritySet>http://GB/Planning/ENTSOE/2</md:Model.modelingAuthoritySet>
<md:Model.description> </md:Model.description>
<md:Model.profile>http://entsoe.eu/CIM/Geographical/2</md:Model.profile>
</md:FullModel>
<cim:Location rdf:ID="_loc1">
<cim:Location.CoordinateSystem rdf:resource="#_e4c22cb0-c8fc-11e1-bd6b-b8f6b1180b6d"/>
<cim:Location.PowerSystemResources rdf:resource="#_046009e3-c766-11e1-8775-005056c00008"/>
</cim:Location>
<cim:PositionPoint rdf:ID="_76719d31-c966-11e1-af5f-b8f6b1180b6d">
<cim:PositionPoint.sequenceNumber>3</cim:PositionPoint.sequenceNumber>
<cim:PositionPoint.Location rdf:resource="#_loc1"/>
<cim:PositionPoint.yPosition>54.478424072265625</cim:PositionPoint.yPosition>
<cim:PositionPoint.xPosition>-2.31961989402771</cim:PositionPoint.xPosition>
</cim:PositionPoint>
<cim:PositionPoint rdf:ID="_b3e92860-c964-11e1-af5f-b8f6b1180b6d">
<cim:PositionPoint.sequenceNumber>1</cim:PositionPoint.sequenceNumber>
<cim:PositionPoint.Location rdf:resource="#_loc1"/>
<cim:PositionPoint.yPosition>56.098087310791016</cim:PositionPoint.yPosition>
<cim:PositionPoint.xPosition>-3.3618369102478027</cim:PositionPoint.xPosition>
</cim:PositionPoint>
<cim:PositionPoint rdf:ID="_d682f7a0-c966-11e1-af5f-b8f6b1180b6d">
<cim:PositionPoint.sequenceNumber>4</cim:PositionPoint.sequenceNumber>
<cim:PositionPoint.Location rdf:resource="#_loc1"/>
<cim:PositionPoint.yPosition>55.236846923828125</cim:PositionPoint.yPosition>
<cim:PositionPoint.xPosition>-2.5158896446228027</cim:PositionPoint.xPosition>
</cim:PositionPoint>
<cim:PositionPoint rdf:ID="_6f396670-c98d-11e1-9c61-406c8f32ef58">
<cim:PositionPoint.sequenceNumber>1</cim:PositionPoint.sequenceNumber>
<cim:PositionPoint.Location rdf:resource="#_loc1"/>
<cim:PositionPoint.yPosition>51.28425216674805</cim:PositionPoint.yPosition>
<cim:PositionPoint.xPosition>-0.3900351822376251</cim:PositionPoint.xPosition>
</cim:PositionPoint>
<cim:PositionPoint rdf:ID="_6795f920-c964-11e1-af5f-b8f6b1180b6d">
<cim:PositionPoint.sequenceNumber>4</cim:PositionPoint.sequenceNumber>
<cim:PositionPoint.Location rdf:resource="#_loc1"/>
<cim:PositionPoint.yPosition>56.47551727294922</cim:PositionPoint.yPosition>
<cim:PositionPoint.xPosition>-4.312533378601074</cim:PositionPoint.xPosition>
</cim:PositionPoint>
<cim:PositionPoint rdf:ID="_c076fa20-c98d-11e1-9c61-406c8f32ef58">
<cim:PositionPoint.sequenceNumber>2</cim:PositionPoint.sequenceNumber>
<cim:PositionPoint.Location rdf:resource="#_loc1"/>
<cim:PositionPoint.yPosition>52.112239837646484</cim:PositionPoint.yPosition>
<cim:PositionPoint.xPosition>-1.6688095331192017</cim:PositionPoint.xPosition>
</cim:PositionPoint>
</rdf:RDF>
'''
rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
cim = 'http://iec.ch/TC57/2013/CIM-schema-cim16#'
root = etree.fromstring(data)
locations = root.findall("./{%s}Location" % (cim))
for loc in locations:
id = loc.attrib['{%s}ID' % rdf]
points = root.findall(".//{%s}PositionPoint.Location[@{%s}resource='#%s']/.." % (cim, rdf, id))
for point in points:
seqnum = ref.find('./{%s}PositionPoint.sequenceNumber' % cim).text
x = ref.find('./{%s}PositionPoint.xPosition' % cim).text
y = ref.find('./{%s}PositionPoint.yPosition' % cim).text
print('x: %s y: %s' % (x, y))
if seqnum != None:
pass # line
else:
pass # point
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment