-
Notifications
You must be signed in to change notification settings - Fork 2
/
nvdb2qgis.py
199 lines (142 loc) · 6.5 KB
/
nvdb2qgis.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# -*- coding: utf-8 -*-
import nvdbapi
import nvdb2geojson
import json
from warnings import warn
# from qgis.core import *
import qgis
"""
Kommandolinjeverktøy for import av NVDB vegnett og fagdata til QGIS
Bruker nvdb2geojson og mellomlagrer geojson som fil.
Argumentet er nvdbapi.py er en av klasene nvdbVegnett eller nvdbFagdata
definert i nvdbapi.py
Før bruk må du sette områdefilter og evt egenskapsfilter
"""
def __qgisargs( *args):
"""Internt metode. Sjekker at vi har QGIS iface - objekt som argument.
Kan også ha navn (tekst), som da vil bli brukt som lagnavn i
layers panel"""
navn = None
for aa in args:
if isinstance( aa, str):
navn = aa
elif isinstance( aa, qgis._gui.QgisInterface):
iface = aa
if not iface or not isinstance(iface, qgis._gui.QgisInterface):
raise ValueError("Must have qgis interface iface argument as input" )
# print("Must have qgis interface iface argument as input" )
return (navn, iface)
def __navneforslag( data, objektid='' ):
"""Gjetter på brukandes navn til QGIS layer-panel"""
navn = 'nvdbdata'
if isinstance( data, dict):
try:
navn = '_'.join( [ str( data['metadata']['type']['id'] ),
data['metadata']['type']['navn'][:7],
str(objektid) ])
except KeyError:
pass
if isinstance( data, list ):
navn = '_'.join([ 'veglenke', str(objektid) ] )
if isinstance( data, nvdbapi.nvdbFagdata ):
navn = '_'.join( [ str( data.objektTypeId ),
data.objektTypeDef['navn'][:8] ])
if isinstance( data, nvdbapi.nvdbVegnett ):
navn = 'vegnett'
if isinstance( data, nvdbapi.nvdbFagdata ):
navn = '_'.join( [ str( data.objektTypeDef['id']),
data.objektTypeDef['navn'] ])
return navn
def hentnvdbid( objektid, *args, **kwargs ):
"""Henter NVDB objekt - fagdata eller veglenke og føyer det til kartflaten
i QGIS. Merk at ett strekningsobjekt / en veglenke som regel vil
være segmentert i mindre biter.
MÅ HA argumentet objektid og iface (QGIS interface objekt)
Kan også ha navn til bruk i layers-meny. (Hvis ikke lages et navn
automagisk ut fra objekttype)
EKSEMPEL
hentnvdbid(808571808, iface )
hentnvdbid(808571808, 'vegbredde', iface )
"""
data = nvdbapi.finnid(objektid)
(navn, iface) = __qgisargs( *args)
if data:
# Navneforslag
if not navn:
navn = __navneforslag( data, objektid=objektid)
# Gjetter på at det er NVDB fagdata
if isinstance( data, dict):
geojsondata = nvdb2geojson.fagdata2geojson( data, **kwargs)
#Gjetter på at det er vegnett
elif isinstance(data, list):
geojsondata = nvdb2geojson.vegnett2geojson( data, **kwargs)
else:
warn('Noe galt? Fikk ', type(data), ' for kallet nvdapi.finnid(',
str(objektid), ') forventer dict eller list' )
return
if not navn:
navn = 'NVDB'
tmp = json.dumps( geojsondata )
iface.addVectorLayer( tmp, navn, 'ogr')
else:
print( 'Fant ingen data for NVDB objektid', str(objektid))
def nvdb2kart(nvdbklasse, *args, **kwargs ):
"""Tar et søkeobjekt av typen nvdbFagdata eller nvdbVegnett, gjør et søk
avgrenset til kartflatens utstrekning i QGIS
MÅ HA argumentet objektid og iface (QGIS interface objekt)
Kan også ha navn til bruk i layers-meny. (Hvis ikke lages et navn
automagisk ut fra objekttype)
EKSEMPEL
#Vegnett europaveger
v = nvdbVegnett()")
v.addfilter_geo({ 'vegreferanse' : 'E' })" )
nvdb2kart( v, 'Europaveger Trondheim', iface)")
# Bomstasjoner
b = nvdbFagdata(45)")
nvdb2qgislag(b, 'Bomstasjoner', iface)")
"""
(lagnavn, iface) = __qgisargs( *args)
# srid = iface.activeLayer().crs().authid()
srid = iface.mapCanvas().mapRenderer().destinationCrs().authid()
if srid == ['EPSG:4326']:
srid = '4326'
elif srid in ['EPSG:25833', 'EPSG:32633' ]:
srid = '32633'
else:
raise ValueError( 'Kartprojeksjon må være EPSG:4326 eller EPSG:25833' )
xmin = str( iface.mapCanvas().extent().xMinimum())
xmax = str( iface.mapCanvas().extent().xMaximum())
ymin = str( iface.mapCanvas().extent().yMinimum())
ymax = str( iface.mapCanvas().extent().yMaximum())
nvdbklasse.addfilter_geo(
{ 'kartutsnitt' : ','.join( [ xmin, ymin, xmax, ymax ]),
'srid' : srid } )
nvdb2qgislag( nvdbklasse, lagnavn, iface)
def nvdb2qgislag(nvdbklasse, *args, **kwargs):
"""Tar et søkeobjekt av typen nvdbFagdata eller nvdbVegnett og føyer det
til QGIS (uavhengig av gjeldende kartflate).
Søket bør avgrenses med geografisk filter, eller på annen måte.
MÅ HA argumentet objektid og iface (QGIS interface objekt)
Kan også ha navn til bruk i layers-meny. (Hvis ikke lages et navn
automagisk ut fra objekttype)
EKSEMPEL
#Vegnett europaveger Trondheim kommune
v = nvdbVegnett()")
v.addfilter_geo({ 'kommune' : 1601, 'vegreferanse' : 'E' })" )
nvdb2qgislag( v, 'Europaveger Trondheim', iface)")
# Bomstasjoner
b = nvdbFagdata(45)")
nvdb2qgislag(b, 'Bomstasjoner', iface)")
"""
(lagnavn, iface) = __qgisargs( *args)
if not lagnavn:
lagnavn = __navneforslag( nvdbklasse )
# Fagdata - gjetter vi på...?
if isinstance( nvdbklasse, nvdbapi.nvdbFagdata) or isinstance(nvdbklasse, dict):
geojsondata = nvdb2geojson.fagdata2geojson( nvdbklasse, **kwargs)
elif isinstance( nvdbklasse, nvdbapi.nvdbVegnett) or isinstance( nvdbklasse, list):
geojsondata = nvdb2geojson.vegnett2geojson( nvdbklasse, **kwargs)
else:
raise ValueError( "Ikke implementert støtte for denne typen data!")
tmp = json.dumps( geojsondata )
iface.addVectorLayer( tmp, lagnavn, 'ogr')