3

simplekml python パッケージを使用して、CSV ファイルを KML ファイルに変換するスクリプトを python で作成しました。データ値の 1 つに基づいてポイントのスケーリングと色付けも行う必要があるため、まだ完成していません。現在、共有スタイルを使用できるかどうかを確認するために、この if/else をいじってから、各ポイントの色とスケールを編集しています (これをさまざまな色を使用するように変更する予定ですが、今のところは.何が機能し、何が機能しないかを理解しようとしているだけです)。私のデータには 5000 行あるので、共有スタイルを使用して結果の KML をできるだけ短くし、for ループを使用してスキーマ データと共に色とスケールを割り当てたいと考えました。

私の問題はこれです: if/else は実行されますが、共有スタイル アイコンの色がライム グリーンに変わります。その結果、すべての点がライム グリーンになります。共有スタイルを使用し、共有スタイルを上書きせずに色とスケールだけを編集する方法はありますか? 共有スタイルを削除すると、色は期待どおりに機能しますが、KML ファイルが巨大です。私はpythonに非常に慣れていません。先週学んだばかりです。そのため、ヘルプやヒントをいただければ幸いです。

編集:そこで共有されたスタイルでやろうとしたことができないようです。if/else を使用して色を比較して割り当てることはできますが、共有スタイルを削除した場合にのみ機能します。それはすべてを上書きするだけだと思います。ただし、これを行う方法があれば、出力ファイルははるかに小さくなります (共有スタイルを使用すると約 4 MB、共有スタイルを使用しない場合は約 7 MB であり、これは将来的にはるかに大きなデータセットで使用されることがわかっています)。

参照用の私のコードは次のとおりです。

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."
4

1 に答える 1