import xml.etree.ElementTree as ET
import json

def make_placemark(name, desc, lat, lon):
    placemark_el = ET.Element("Placemark")
    name_el = ET.Element("name")
    name_el.text = name
    placemark_el.append(name_el)
    description_el = ET.Element("description")
    description_el.text = desc
    placemark_el.append(description_el)
    point_el = ET.Element("Point")
    coordinates_el = ET.Element("coordinates")
    coordinates_el.text = str(lon) + ',' + str(lat) + ',0'
    point_el.append(coordinates_el)
    placemark_el.append(point_el)
    return placemark_el


def json2html(jj):
    tbl = r'<table border="1">'
    #
    if isinstance(jj, dict):
        for key, value in jj.items():
            if isinstance(value, dict) or isinstance(value, list):
                tbl += '<tr><th>' + str(key) + '</th><td>' + json2html(value) + '</td></tr>'
            else:
                tbl += '<tr><th>' + str(key) + '</th><td>' + str(value) + '</td></tr>'
    elif isinstance(jj, list):
        for ell in jj:
            tbl += '<tr><th>' + json2html(ell) + '</td></tr>'
    #
    tbl += '</table>'
    return tbl


ET.register_namespace("", "http://www.opengis.net/kml/2.2")
el = ET.XML(r'<kml xmlns="http://www.opengis.net/kml/2.2"/>')
doc = ET.Element("Document")

#
file_directory = r'C:\work1\crash_region_code_1165.json'
json_data=open(file_directory, 'r', encoding="utf-8").read()
str1 = json_data.split('\n')
for n in str1:
    if n != '':
        data = json.loads(n)
        geo_code = data['geo_code']
        doc.append(make_placemark(data['_id']['$oid'], json2html(data), geo_code['latitude'], geo_code['longitude']))

el.append(doc)
et = ET.ElementTree(el)
et.write(r'C:\work1\test22.kml', encoding='UTF-8', xml_declaration=True)
