Ich habe ein Skript in Python geschrieben, das eine CSV-Datei in eine KML-Datei mit dem SimpleKml Python-Paket konvertieren wird. Es ist noch nicht fertig, da es meine Punkte basierend auf einem meiner Datenwerte skalieren und färben muss. Im Moment spiele ich mit diesem if/else herum, nur um zu sehen, ob ich einen geteilten Stil verwenden kann, und dann die Farbe und den Maßstab jedes Punktes zu bearbeiten (ich habe vor, dies zu ändern, um eine Reihe von Farben zu verwenden. Ich versuche nur herauszufinden, was funktioniert und was nicht. Meine Daten haben 5000 Zeilen. Daher wollte ich einen gemeinsamen Stil verwenden, um die resultierende KML-Datei so kurz wie möglich zu halten. Verwenden Sie dann die for-Schleife, um Farbe und Skalierung zusammen mit den Schemadaten zuzuweisen.Kann ich den gemeinsamen Stil simplekml verwenden und auch den Stil einzelner Punkte ändern?
Mein Problem ist das: das if/else führt aus, aber es ändert die Farbe des geteilten Stilsymbols auf das Limone Grün. Das Ergebnis ist, dass jeder einzelne Punkt lindgrün ist. Gibt es eine Möglichkeit, einen gemeinsamen Stil zu verwenden und auch nur Farbe und Skalierung zu bearbeiten, ohne dass der gemeinsame Stil überschrieben wird? Wenn ich den gemeinsamen Stil entferne, funktionieren die Farben wie erwartet, aber meine KML-Datei ist riesig. Ich bin neu bei Python, habe ich erst letzte Woche gelernt. So wird jede Hilfe oder Tipps geschätzt.
EDIT: Es scheint, als ob ich nicht tun kann, was ich mit dem geteilten Stil dort gemacht habe. Ich kann if/else verwenden, um Farben zu vergleichen und zuzuweisen, aber es funktioniert nur, wenn ich den geteilten Stil loswerde. Ich denke, das überschreibt einfach alles. Wenn es eine Möglichkeit gibt, dies zu tun, würde dies meine Ausgabedateien viel kleiner machen (mit dem gemeinsamen Stil sind sie ungefähr 4 MB, ohne dass sie etwa 7 MB groß sind und ich weiß, dass dies in Zukunft mit viel größeren Datensätzen verwendet werden wird).
Hier ist mein Code als Referenz:
import simplekml
import csv
import math
kml = simplekml.Kml()
style = simplekml.Style() #creates shared style for all points
style.iconstyle.icon.href ='http://maps.google.com/mapfiles/kml/shapes/target.png' #can change to any desired icon URL
style.iconstyle.scale = 1
schema = kml.newschema(name= '') #creates schema
schema.newsimplefield(name= 'realization', type = 'string', display name = 'Realization')
schema.newsimplefield(name= 'diameter', type = 'string', displayname = 'Diameter')
schema.newsimplefield(name= 'density', type = 'string', displayname = 'Density')
schema.newsimplefield(name= 'strength', type = 'string', displayname = 'Strength')
schema.newsimplefield(name= 'velocity', type = 'string', displayname = 'Velocity (mps)')
schema.newsimplefield(name= 'entry', type = 'string', displayname = 'Entry Angle')
schema.newsimplefield(name= 'casualties', type = 'float', displayname = 'Casualties')
schema.newsimplefield(name= 'damagesource', type = 'string', displayname = 'Damage Source')
schema.newsimplefield(name= 'blastrad', type = 'string', displayname = 'Blast Radius')
#loads csv and sets delimiter
myfile = open(raw_input("Enter file path: "))
data = csv.DictReader(myfile, delimiter = ',') #create new kml file
for row in data:
cas_log = float(row[' Casualties ']) + 1 #change 0 values to 1
newlog = math.log10(cas_log)
row[' Casualties '] = newlog #changes the values to their log10
pnt = kml.newpoint(name = "", coords = [(float(row[' Longitude ']),float(row[' Latitude ']))])
pnt.style = style #assigns shared style to every point
pnt.extendeddata.schemadata.schemaurl = schema.id #assigns schema data to each point for display in
pnt.extendeddata.schemadata.newsimpledata('realization', row['Realization '])
pnt.extendeddata.schemadata.newsimpledata('diameter', row[' Diameter '])
pnt.extendeddata.schemadata.newsimpledata('density', row[' Density '])
pnt.extendeddata.schemadata.newsimpledata('strength', row[' Strength '])
pnt.extendeddata.schemadata.newsimpledata('velocity', row[' Velocity_mps '])
pnt.extendeddata.schemadata.newsimpledata('entry', row[' EntryAngle '])
pnt.extendeddata.schemadata.newsimpledata('casualties', row[' Casualties '])
pnt.extendeddata.schemadata.newsimpledata('damagesource', row[' DamageSource'])
pnt.extendeddata.schemadata.newsimpledata('blastrad', row[' BlastRadMajor_m '])
if row[' Casualties '] == 0.0: # color test
pnt.style.iconstyle.color = 'ffff00ff' #magenta
else:
pnt.style.iconstyle.color = 'ff32cd32' #lime green
kml.save("csv2kml.kml") #saves new KML file by this name in the user directory
print "File created."
Etwas, das Sie entdecken den Stil ist, dass Google Earth „optimieren“ Ihre KML, wenn geladen, so ist es sehr schwierig, die Ausgabe fein abzustimmen. Sie können mit der riesigen Datei feststecken, wenn eine konsistente Ausgabe das Ziel ist. – rheitzman
5000 Zeilen und 7 MB werden nicht als große KML-Datei betrachtet, aber 500 KB wird zu groß. Außerdem müssen Sie den Leerraum in den Wörterbuchverweisen im Python-Code entfernen. z.B. 'Reihe ['Verluste']'> 'Reihe ['Verluste']'. – JasonM1