Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions datapackage_pipelines/lib/dump/dumper_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from ...utilities.extended_json import json
from ...wrapper import ingest, spew

from .file_formats import CSVFormat, JSONFormat
from .file_formats import CSVFormat, JSONFormat, GeoJSONFormat


class DumperBase(object):
Expand All @@ -34,7 +34,8 @@ def __init__(self, debug=False):
self.add_filehash_to_path = self.__params.get('add-filehash-to-path', False)
self.file_format_handlers = {
'csv': CSVFormat,
'json': JSONFormat
'json': JSONFormat,
'geojson': GeoJSONFormat
}
self.file_format_handlers.update(**self.__params.get('file-formatters', {}))

Expand Down Expand Up @@ -253,6 +254,7 @@ def write_file_to_output(self, filename, path):
raise NotImplementedError()

def rows_processor(self, resource, spec, temp_file, writer, fields, datapackage):
print(fields)
file_formatter = self.file_formatters[spec['name']]
for row in resource:
file_formatter.write_row(writer, row, fields)
Expand Down
37 changes: 37 additions & 0 deletions datapackage_pipelines/lib/dump/file_formats.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,3 +152,40 @@ def write_transformed_row(self, writer, transformed_row, fields):

def finalize_file(self, writer):
writer.write(']')

class GeoJSONFormat(JSONFormat):

def initialize_file(self, file, headers):
writer = file
writer.write('{"type": "FeatureCollection","features":')
writer.__first = True
return writer


def write_transformed_row(self, writer, transformed_row, fields):
if not writer.__first:
writer.write(',')
else:
writer.__first = False
try:
geometry = {}
for k, v in transformed_row.items():
if fields[k]["type"] == "geopoint":
geometry = {"type": "Point",
"coordinates" : self._FileFormat__transform_value(v, fields[k]["type"])}
break
elif fields[k]["type"] == "geojson":
geometry = self._FileFormat__transform_value(v, fields[k]["type"])
break
except Exception:
logging.exception('Missing point geometry in row %r', transformed_row)
raise
properties = dict((k, self._FileFormat__transform_value(v, fields[k]["type"]))
for k, v in transformed_row.items() if fields[k]["type"] not in ["geopoint", "geojson"])
feature = {"geometry": geometry, "type": "Feature", "properties": properties}

writer.write(json.dumps(feature, sort_keys=True, ensure_ascii=True))

def finalize_file(self, writer):
writer.write(']}')