Python 我可以使用SimpleXML共享样式并更改单个点的样式吗?

Python 我可以使用SimpleXML共享样式并更改单个点的样式吗?,python,kml,google-earth,simplekml,Python,Kml,Google Earth,Simplekml,我已经用python编写了一个脚本,它将使用SimpleXML python包将CSV文件转换为KML文件。它还没有完成,因为它还需要根据我的一个数据值对我的点进行缩放和着色。现在我正在玩这个if/else,看看我是否可以使用共享样式,然后编辑每个点的颜色和比例(我计划将其更改为使用一系列颜色,但现在我只是想弄清楚什么是有效的,什么是无效的)。我的数据有5000行,所以我想使用共享样式使生成的KML尽可能短,然后使用for循环与模式数据一起指定颜色和比例 我的问题是:执行if/else,但它会将

我已经用python编写了一个脚本,它将使用SimpleXML 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."
要在中使用共享样式,您需要为每种颜色创建一个样式,然后根据颜色标准在点上引用其变量,在本例中,该标准是伤亡人数的日志

在KML中创建多个共享样式

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
接下来,根据颜色测试将样式指定给点

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

您将发现,Google Earth将在加载时“优化”您的KML,因此很难微调您的输出。如果目标是一致的输出,那么您可能会被巨大的文件卡住。5000行和7MB不被认为是一个大的KML文件,但500K正在变大。此外,还需要在python代码中删除字典引用中的空格;e、 g.
行['inumbers']
行['inumbers']
。如果png是纯色,则Google Earth将原色替换为图标样式中定义的颜色。如果指定颜色=白色(默认),则按原样使用图标图像。在KML中尝试不同的颜色,看看图标在Google Earth中显示时是如何变化的。这似乎是合理的。但我看不到任何变化。有点奇怪,我最后换了别的地方。但我可能会在将来的某个时候看一看。