2016-07-21 3 views
2

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

당신은 발견 할 것입니다 뭔가 구글 어스는 "최적화"것입니다 귀하의 KML을로드하면 출력을 미세하게 조정하는 것이 매우 어렵습니다. 일관된 산출물이 목표라면 거대한 파일에 갇힐 수 있습니다. – rheitzman

+0

5000 행과 7MB는 큰 KML 파일로 간주되지 않지만 500K는 큰 크기가되었습니다. 또한 파이썬 코드에서 사전 참조의 공백을 제거해야합니다. 예 : 'row [ 'Casualties']'>'행 [ 'Casualties']'. – JasonM1

답변

0

당신이 다음 색상 기준에 따라 점에서 그 변수를 참조 색상의 각각의 스타일을 만들 필요가 simplekml에서 공유 스타일을 사용하려면이에있는 대소 문자는 사상자 수의 로그입니다.

, 당신의 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 
관련 문제