在 Python 中,尝试将地理编码的 tsv 文件转换为 geojson 格式

In Python, trying to convert geocoded tsv file into geojson format

正在尝试将经过地理编码的 TSV 文件转换为 JSON 格式,但我遇到了问题。这是代码:

import geojson
import csv

def create_map(datafile):
    geo_map = {"type":"FeatureCollection"}
    item_list = []
    datablock = list(csv.reader(datafile))
    for i, line in enumerate(datablock):
        data = {}
        data['type'] = 'Feature'
        data['id'] = i
        data['properties']={'title': line['Movie Title'],
                           'description': line['Amenities'],
                           'date': line['Date']}
        data['name'] = {line['Location']}
        data['geometry'] = {'type':'Point',
                           'coordinates':(line['Lat'], line['Lng'])}
        item_list.append(data)
    for point in item_list:
        geo_map.setdefault('features', []).append(point)
    with open("thedamngeojson.geojson", 'w') as f:
        f.write(geojson.dumps(geo_map))

create_map('MovieParksGeocode2.tsv')

我在 data['properties'] 行上得到一个 TypeError:list indices must be integers, not str 但我不明白,这不是我为 geoJSON 字段设置值的方式吗?

我正在阅读的文件在这些键下有值:位置电影标题日期便利设施经纬度

可在此处查看文件:https://github.com/yongcho822/Movies-in-the-park/blob/master/MovieParksGeocodeTest.tsv

谢谢大家,一如既往的感激。

您这里有几件事情需要解决。

1.Your TSV 包含带双引号的换行符。我认为这不是故意的,并且会导致一些问题。

Location    Movie Title Date    Amenities   Formatted_Address   Lat Lng
"
Edgebrook Park, Chicago "   A League of Their Own   7-Jun   "
Family friendly activities and games. Also: crying is allowed." Edgebrook Park, 6525 North Hiawatha Avenue, Chicago, IL 60646, USA  41.9998876  -87.7627672
"

2.You 不需要 geojson 模块来转储 JSON - 这就是 GeoJSON 的全部。只是 import json 而不是。

3.You 正在尝试读取 TSV,但您没有包含为此所需的 delimiter=\t 选项。

4.You 正在尝试从行中读取键,但您没有使用 DictReader 这样做是为了 you.Hence TypeError 关于您上面提到的索引.

查看下面我修改后的代码块..您仍然需要修复您的 TSV 以使其成为有效的 TSV。

import csv
import json

def create_map(datafile):
    geo_map = {"type":"FeatureCollection"}
    item_list = []
    with open(datafile,'r') as tsvfile:
        reader = csv.DictReader(tsvfile,delimiter='\t')
        for i, line in enumerate(reader):
            print line
            data = {}
            data['type'] = 'Feature'
            data['id'] = i
            data['properties']={'title': line['Movie Title'],
                               'description': line['Amenities'],
                               'date': line['Date']}
            data['name'] = {line['Location']}
            data['geometry'] = {'type':'Point',
                               'coordinates':(line['Lat'], line['Lng'])}
            item_list.append(data)
        for point in item_list:
            geo_map.setdefault('features', []).append(point)
        with open("thedamngeojson.geojson", 'w') as f:
            f.write(json.dumps(geo_map))

create_map('MovieParksGeocode2.tsv')