我在 python 中编写了一个脚本,它将使用 simplekml python 包将 CSV 文件转换为 KML 文件。它还没有完成,因为它还需要根据我的一个数据值对我的点进行缩放和着色。现在我正在玩这个 if/else 只是为了看看我是否可以使用共享样式,然后编辑每个点的颜色和比例(我计划将其更改为使用一系列颜色,但现在我'我只是想弄清楚什么有效,什么无效)。我的数据有 5000 行,所以我想使用共享样式来使生成的 KML 尽可能短,然后使用 for 循环来分配颜色和比例以及模式数据。
我的问题是: if/else 执行,但它将共享样式图标颜色更改为浅绿色。结果是每个点都是石灰绿色。有没有办法使用共享样式并且只编辑颜色和比例而不覆盖共享样式?如果我删除共享样式,颜色会按预期工作,但我的 KML 文件很大。我对python很陌生,我上周刚学会。因此,感谢您提供任何帮助或提示。
编辑:似乎我无法用那里的共享风格做我打算做的事情。我可以使用 if/else 来比较和分配颜色,但它只有在我摆脱共享样式时才有效。我认为这会覆盖一切。但是,如果有办法做到这一点,那将使我的输出文件更小(共享样式它们大约为 4mb,没有它们大约为 7mb,我知道这将在未来用于更大的数据集)。
这是我的参考代码:
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."