10

I am needing a Python script to convert CSV data to GeoJSON output. The output should match the format, below:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates":  [ -85.362709,40.466442 ]
      },
      "properties": {
        "weather":"Overcast",
        "temp":"30.2 F"
      }
    }
  ]
}

I am using this script to run the process, but it does not produce the desired output:

import csv, json
    li = []
    with open('CurrentObs.csv', newline='') as csvfile:
        reader = csv.reader(csvfile, delimiter=',')
        for latitude, longitude, weather, temp in reader:
            li.append({
               "latitude": latitude,
               "longitude": longitude,
               "weather": weather,
               "temp": temp,
               "geo": {
                    "__type": "GeoPoint",
                    "latitude": latitude,
                    "longitude": longitude,
                }
            })

    with open("GeoObs.json", "w") as f:
        json.dump(li, f)

Any help is greatly appreciated!

Phydeaux
  • 2,795
  • 3
  • 17
  • 35
user5834454
  • 147
  • 2
  • 3
  • 12

2 Answers2

17

one could use directly the geojson package:

import csv, json
from geojson import Feature, FeatureCollection, Point

features = []
with open('CurrentObs.csv', newline='') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    for latitude, longitude, weather, temp in reader:
        latitude, longitude = map(float, (latitude, longitude))
        features.append(
            Feature(
                geometry = Point((longitude, latitude)),
                properties = {
                    'weather': weather,
                    'temp': temp
                }
            )
        )

collection = FeatureCollection(features)
with open("GeoObs.json", "w") as f:
    f.write('%s' % collection)
ewcz
  • 12,819
  • 1
  • 25
  • 47
  • that dosen't work for me !. are latitude and longitude columns in the csv or what ? i got an error in the loop =>[my issue](https://stackoverflow.com/questions/51013294/fast-convert-of-large-csv-to-geojson) – A.HADDAD Jun 24 '18 at 22:45
  • @ewcz How would you modify this to have a proper FeatureCollection like: "type": "FeatureCollection", "features": [ "geometry": { "type": "Point", "coordinates": [ -73.935242, 40.730610 ] }, "properties": {...}] } – LBes Sep 12 '18 at 22:35
4

Check if this script resolves

import csv
import json
from collections import OrderedDict

li = []
with open('CurrentObs.csv', 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    for latitude, longitude, weather, temp in reader:
        d = OrderedDict()
        d['type'] = 'Feature'
        d['geometry'] = {
            'type': 'Point',
            'coordinates': [float(latitude), float(longitude)]
        }
        d['properties'] = {
            'weather': weather,
            'temp': temp
        }
        li.append(d)

d = OrderedDict()
d['type'] = 'FeatureCollection'
d['features'] = li
with open('GeoObs.json', 'w') as f:
    f.write(json.dumps(d, sort_keys=False, indent=4))
  • 1
    Nice solution, for applications like OpenLayers, you would want to flip the 'coordinates': [float(latitude), float(longitude)] to 'coordinates': [float(longitude), float(latitude)] and throw in some logic to catch the header... – Jonathan Dec 26 '20 at 17:18