저는 python으로 simplekml python 패키지를 사용하여 CSV 파일을 KML 파일로 변환하는 스크립트를 작성했습니다. 내 데이터 값 중 하나를 기준으로 점수를 조정하고 색상을 지정해야하기 때문에 아직 완료되지 않았습니다. 지금 나는이 스타일을 가지고 놀고 있는데, 공유 스타일을 사용할 수 있는지, 그리고 각 포인트의 색상과 눈금을 편집하는지 (색상 범위를 사용하도록 변경하려고 계획하고 있지만, 어떤 것이 효과가 있고 무엇이 효과가 없는지 파악하려고하는 것). 내 데이터에는 5000 행이 있으므로 공유 스타일을 사용하여 결과 KML을 최대한 짧게 유지하고 for 루프를 사용하여 색상을 지정하고 스키마 데이터와 함께 크기를 조정하려고했습니다.Simplekml 공유 스타일을 사용하고 개별 포인트의 스타일을 변경할 수 있습니까?
내 문제는 이것입니다 : if/else가 실행되지만 공유 스타일 아이콘의 색이 연두색으로 바뀝니다. 그 결과 모든 단일 포인트는 석회입니다. 공유 스타일을 사용하고 공유 스타일을 덮어 쓰지 않고 색상과 크기를 편집하는 방법이 있습니까? 공유 스타일을 제거하면 색상이 예상대로 작동하지만 내 KML 파일이 큽니다. 나는 Python을 처음 접했을뿐입니다. 지난 주에 방금 배웠습니다. 그래서 어떤 도움이나 조언을 부탁드립니다.
EDIT : 마치 내가 공유 한 스타일과 관련이있는 것처럼 할 수없는 것처럼 보입니다. 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을로드하면 출력을 미세하게 조정하는 것이 매우 어렵습니다. 일관된 산출물이 목표라면 거대한 파일에 갇힐 수 있습니다. – rheitzman
5000 행과 7MB는 큰 KML 파일로 간주되지 않지만 500K는 큰 크기가되었습니다. 또한 파이썬 코드에서 사전 참조의 공백을 제거해야합니다. 예 : 'row [ 'Casualties']'>'행 [ 'Casualties']'. – JasonM1