diff --git a/datapackage_pipelines/lib/dump/dumper_base.py b/datapackage_pipelines/lib/dump/dumper_base.py index a71561f..8b94c08 100644 --- a/datapackage_pipelines/lib/dump/dumper_base.py +++ b/datapackage_pipelines/lib/dump/dumper_base.py @@ -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): @@ -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', {})) @@ -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) diff --git a/datapackage_pipelines/lib/dump/file_formats.py b/datapackage_pipelines/lib/dump/file_formats.py index 2232cc2..828a370 100644 --- a/datapackage_pipelines/lib/dump/file_formats.py +++ b/datapackage_pipelines/lib/dump/file_formats.py @@ -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(']}') +