gpt4 book ai didi

python - 将 KML 解析为 Google map 仅显示数百个图钉中的一个

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:24 24 4
gpt4 key购买 nike

我的期望

我正在研究 Violent Python,目前我在一个模块上从 .pcap 文件中获取 ip 地址,将 ip 地址解析为经度和纬度,最后将这些 longs 和 langs 解析为一个 .kml 文件。

我的想法是我的 .kml 文件应该可以上传到 Google 地球和 Google map ,以显示每个捕获包的来源和目的地的引脚。


实际发生了什么:

  • 在 Google 地球上,解析失败,除
  • 外没有其他错误消息

Parsing Aborted

  • 在 Google map 上,我只看到阿姆斯特丹的一个大头针。这似乎是第一个 <placemark> IP:212.204.214.114.

代码和其他重要内容:

您可以找到 whole .kml-file here .

标题是正确的(如果相信本书和其他 SO 线程):

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">

所有的地标都有这个简单的结构:

<Placemark>
<name>212.204.214.114</name>
<Point>
<coordinates>4.834300, 52.404800</coordinates>
</Point>
</Placemark>

我的代码遵循与 Violent Python 中的模块相同的结构,有一些小的变化以更好地遵循更现代的最佳实践:

import dpkt, socket, pygeoip, argparse, os

gi = pygeoip.GeoIP('/opt/GeoIP/Geo.dat')

def ret_klm(ip):
rec = gi.record_by_name(ip)

try:
long = rec['longitude']
lat = rec['latitude']
kml = (
'<Placemark>\n'
'<name>%s</name>\n'
'<Point>\n'
'<coordinates>%6f, %6f</coordinates>\n'
'</Point>\n'
'</Placemark>\n'
)%(ip, long, lat)
return kml
except:
return ''


def plotIPs(pcap):
kml_points = ''
for (ts, buf) in pcap:
try:
eth = dpkt.ethernet.Ethernet(buf)
ip = eth.data
src = socket.inet_ntoa(ip.src)
src_kml = ret_klm(src)
dst = socket.inet_ntoa(ip.dst)
dst_kml = ret_klm(dst)
kml_points = kml_points + src_kml + dst_kml
except:
pass

return kml_points

def main():

parser = argparse.ArgumentParser(
description=u'GeoLocator to parse IP addresses to their '
u'long, lat in KML for Google Maps.'
)

parser.add_argument(
u'-p',
help=u'Pcap file for parsing',
required=True,
dest=u'pcap_file'
)
arguments = parser.parse_args()

if not os.path.isfile(arguments.pcap_file):
parser.print_usage()
raise SystemExit

with open(arguments.pcap_file) as file:
pcap = dpkt.pcap.Reader(file)
kmlheader = '<?xml version="1.0" encoding="UTF-8"?>'+\
'\n<kml xmlns="http://www.opengis.net/kml/2.2">\n'
kmlfooter = '</kml>\n'
kmldoc = kmlheader + plotIPs(pcap) + kmlfooter
print(kmldoc)

if __name__ == '__main__':
main()

最佳答案

您需要将 元素添加到您的 KML 中,它将包含所有 元素。像这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
<Placemark>
<name>212.204.214.114</name>
<Point>
<coordinates>4.834300, 52.404800</coordinates>
</Point>
</Placemark>
<Placemark>
<name>212.204.214.114</name>
<Point>
<coordinates>4.834300, 52.404800</coordinates>
</Point>
</Placemark>
<!-- the rest of your placemarks -->
</Document>
</kml>

关于python - 将 KML 解析为 Google map 仅显示数百个图钉中的一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44445733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com