2016-07-21 4 views
2

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." 
+0

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

+0

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

Antwort

0

geteilt Stile in simplekml verwenden Sie benötigen einen Stil für jede der Farben erstellen dann für Farbe auf Kriterien seiner variablen auf den Punkt beziehen, die in diesem Fall ist das Protokoll der Anzahl der Opfer.

Erstellen Sie mehrere gemeinsam genutzte Stile in der KML-Datei

style1 = simplekml.Style() #creates shared style for all points 
style1.iconstyle.color = 'ffff00ff' #magenta 
style1.iconstyle.icon.href ='http://maps.google.com/mapfiles/kml/shapes/target.png' #can change to any desired icon URL 
style1.iconstyle.scale = 1 

style2 = simplekml.Style() #creates shared style for all points 
style2.iconstyle.color = 'ff32cd32' #lime green 
style2.iconstyle.icon.href ='http://maps.google.com/mapfiles/kml/shapes/target.png' #can change to any desired icon URL 
style2.iconstyle.scale = 1 

Als Nächstes weisen auf den Punkt auf der Grundlage der Farbtest

if row['Casualties'] >= 5.0: # color test 
    pnt.style = style1 # magenta 
else: 
    pnt.style = style2 # lime green 
Verwandte Themen