我正在尝试修改使用lxml.objectify的PyKML。随着跟踪节点追加,这将变为具有默认str()
行为的字符串。我想抓住列表或元组的附加内容并将它们转换为适当的位置分隔行,而不是'(xx.xxxx,yy.yyyy)'
from pykml.factory import GX_ElementMaker as GX
track = GX.Track(id='track_%d' % group_num )
for pt in group:
when = datetime.datetime.utcfromtimestamp(pt['ts'])
track.append( KML.when( when ) ) # WHEN?
for pt in group:
track.append( GX.coord( (pt['x'],pt['y'])) ) # <-- trouble here
谢谢, -kurt
答案 0 :(得分:0)
使用命名空间信息创建一个干净的ElementMaker类。然后使用节点名称作为方法创建子类。在该方法中,处理所有奇怪的情况。然后制作将在该节点名称中放置的字符串,并返回具有该节点名称的干净ElementMaker类的实例。
def indexable_levels(args):
#print 'args:',args
levels = 0
while True:
if isinstance(args,str): break
try:
args = args[0]
levels += 1
except:
break
#print ' levels ->',levels
return levels
# Create a factory object for the KML Google Extension namespace
_GX_ElementMakerSimple = objectify.ElementMaker(
annotate=False,
namespace=nsmap['gx'],
nsmap={'gx': nsmap['gx']},
)
class _GX_ElementMaker (objectify.ElementMaker):
'KML ElementMaker with overloads for custom text payloads like coordinates'
def coord(self, *args):
#print 'start coord: "%s"' % (str(args)), type(args), len(args)
levels = indexable_levels(args)
if levels == 1 and len(args) == 1:
# This case is really redundant with the next
assert isinstance(args[0],str)
return _GX_ElementMakerSimple.coord(args[0])
if levels == 1:
return _GX_ElementMakerSimple.coord(' '.join([str(item) for item in args]))
if levels == 2:
# ((-121.583851, 37.386052),)
assert(len(args)==1)
return _GX_ElementMakerSimple.coord(' '.join([str(item) for item in args[0] ]))
assert(False)
# Create a factory object for the KML Google Extension namespace
GX_ElementMaker = _GX_ElementMaker(
annotate=False,
namespace=nsmap['gx'],
nsmap={'gx': nsmap['gx']},
)