Title: | A GeoJson Processing Toolkit |
---|---|
Description: | Includes functions for processing GeoJson objects <https://en.wikipedia.org/wiki/GeoJSON> relying on 'RFC 7946' <https://datatracker.ietf.org/doc/html/rfc7946>. The geojson encoding is based on 'json11', a tiny JSON library for 'C++11' <https://github.com/dropbox/json11>. Furthermore, the source code is exported in R through the 'Rcpp' and 'RcppArmadillo' packages. |
Authors: | Lampros Mouselimis [aut, cre] , Dropbox Inc [cph] |
Maintainer: | Lampros Mouselimis <[email protected]> |
License: | MIT + file LICENSE |
Version: | 1.1.2 |
Built: | 2025-01-15 08:32:05 UTC |
Source: | https://github.com/mlampros/geojsonr |
returns a json-dump from a geojson file
Dump_From_GeoJson(url_file)
Dump_From_GeoJson(url_file)
url_file |
either a string specifying the input path to a file OR a valid url (beginning with 'http..') pointing to a geojson object |
a character string (json dump)
## Not run: library(geojsonR) res = Dump_From_GeoJson("/myfolder/point.geojson") ## End(Not run)
## Not run: library(geojsonR) res = Dump_From_GeoJson("/myfolder/point.geojson") ## End(Not run)
creates a FeatureCollection dump from multiple Feature geojson objects
Features_2Collection( Features_files_vec, bbox_vec = NULL, write_path = NULL, verbose = FALSE )
Features_2Collection( Features_files_vec, bbox_vec = NULL, write_path = NULL, verbose = FALSE )
Features_files_vec |
a character vector specifying paths to files (Feature geojson objects) |
bbox_vec |
either NULL or a numeric vector |
write_path |
either NULL or a character string specifying a valid path to a file ( preferably with a .geojson extension ) where the output data will be saved |
verbose |
a boolean. If TRUE then information will be printed out in the console |
The Features_2Collection function utilizes internally a for-loop. In case of an error set the verbose parameter to TRUE to find out which file leads to this error.
a FeatureCollection dump
## Not run: library(geojsonR) vec_files = c("/myfolder/Feature1.geojson", "/myfolder/Feature2.geojson", "/myfolder/Feature3.geojson", "/myfolder/Feature4.geojson", "/myfolder/Feature5.geojson") res = Features_2Collection(vec_files, bbox_vec = NULL) ## End(Not run)
## Not run: library(geojsonR) vec_files = c("/myfolder/Feature1.geojson", "/myfolder/Feature2.geojson", "/myfolder/Feature3.geojson", "/myfolder/Feature4.geojson", "/myfolder/Feature5.geojson") res = Features_2Collection(vec_files, bbox_vec = NULL) ## End(Not run)
reads GeoJson data
FROM_GeoJson( url_file_string, Flatten_Coords = FALSE, Average_Coordinates = FALSE, To_List = FALSE )
FROM_GeoJson( url_file_string, Flatten_Coords = FALSE, Average_Coordinates = FALSE, To_List = FALSE )
url_file_string |
a string specifying the input path to a file OR a geojson object (in form of a character string) OR a valid url (beginning with 'http..') pointing to a geojson object |
Flatten_Coords |
either TRUE or FALSE. If TRUE then the properties member of the geojson file will be omitted during parsing. |
Average_Coordinates |
either TRUE or FALSE. If TRUE then additionally a geojson-dump and the average latitude and longitude of the geometry object will be returned. |
To_List |
either TRUE or FALSE. If TRUE then the coordinates of the geometry object will be returned in form of a list, otherwise in form of a numeric matrix. |
The FROM_GeoJson function is based on the 'RFC 7946' specification. Thus, geojson files/strings which include property-names other than the 'RFC 7946' specifies will return an error. To avoid errors of that kind a user should take advantage of the FROM_GeoJson_Schema function, which is not as strict concerning the property names.
a (nested) list
## Not run: library(geojsonR) # INPUT IS A FILE res = FROM_GeoJson(url_file_string = "/myfolder/feature_collection.geojson") # INPUT IS A GEOJSON (character string) tmp_str = '{ "type": "MultiPolygon", "coordinates": [ [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]], [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]], [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]] ] }' res = FROM_GeoJson(url_file_string = tmp_str) # INPUT IS A URL res = FROM_GeoJson(url_file_string = "http://www.EXAMPLE_web_page.geojson") ## End(Not run)
## Not run: library(geojsonR) # INPUT IS A FILE res = FROM_GeoJson(url_file_string = "/myfolder/feature_collection.geojson") # INPUT IS A GEOJSON (character string) tmp_str = '{ "type": "MultiPolygon", "coordinates": [ [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]], [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]], [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]] ] }' res = FROM_GeoJson(url_file_string = tmp_str) # INPUT IS A URL res = FROM_GeoJson(url_file_string = "http://www.EXAMPLE_web_page.geojson") ## End(Not run)
reads GeoJson data using a one-word-schema
FROM_GeoJson_Schema( url_file_string, geometry_name = "", Average_Coordinates = FALSE, To_List = FALSE )
FROM_GeoJson_Schema( url_file_string, geometry_name = "", Average_Coordinates = FALSE, To_List = FALSE )
url_file_string |
a string specifying the input path to a file OR a geojson object (in form of a character string) OR a valid url (beginning with 'http..') pointing to a geojson object |
geometry_name |
a string specifying the geometry name in the geojson string/file. The geometry_name functions as a one-word schema and can significantly speed up the parsing of the data. |
Average_Coordinates |
either TRUE or FALSE. If TRUE then additionally a geojson-dump and the average latitude and longitude of the geometry object will be returned. |
To_List |
either TRUE or FALSE. If TRUE then the coordinates of the geometry object will be returned in form of a list, otherwise in form of a numeric matrix. |
This function is appropriate when the property-names do not match exactly the 'RFC 7946' specification ( for instance if the geometry object-name appears as location as is the case sometimes in mongodb queries ). The user can then specify the geometry_name as it exactly appears in the .geojson string/file (consult the example for more details). If no geometry_name is given then recursion will be used, which increases the processing time. In case that the input .geojson object is of type : Point, LineString, MultiPoint, Polygon, GeometryCollection, MultiLineString, MultiPolygon, Feature or FeatureCollection with a second attribute name : coordinates, then the geometry_name parameter is not necessary.
a (nested) list
library(geojsonR) # INPUT IS A GEOJSON (character string) tmp_str = '{ "name" : "example_name", "location" : { "type" : "Point", "coordinates" : [ -120.24, 39.21 ] } }' res = FROM_GeoJson_Schema(url_file_string = tmp_str, geometry_name = "location")
library(geojsonR) # INPUT IS A GEOJSON (character string) tmp_str = '{ "name" : "example_name", "location" : { "type" : "Point", "coordinates" : [ -120.24, 39.21 ] } }' res = FROM_GeoJson_Schema(url_file_string = tmp_str, geometry_name = "location")
merge json files (or any kind of text files) from a directory
merge_files( INPUT_FOLDER, OUTPUT_FILE, CONCAT_DELIMITER = "\n", verbose = FALSE )
merge_files( INPUT_FOLDER, OUTPUT_FILE, CONCAT_DELIMITER = "\n", verbose = FALSE )
INPUT_FOLDER |
a character string specifying a path to the input folder |
OUTPUT_FILE |
a character string specifying a path to the output file |
CONCAT_DELIMITER |
a character string specifying the delimiter to use when merging the files |
verbose |
either TRUE or FALSE. If TRUE then information will be printed in the console. |
This function is meant for json files but it can be applied to any kind of text files. It takes an input folder (INPUT_FOLDER) and an output file (OUTPUT_FILE) and merges all files from the INPUT_FOLDER to a single OUTPUT_FILE using the concatenation delimiter (CONCAT_DELIMITER).
## Not run: library(geojsonR) merge_files(INPUT_FOLDER = "/my_folder/", OUTPUT_FILE = "output_file.json") ## End(Not run)
## Not run: library(geojsonR) merge_files(INPUT_FOLDER = "/my_folder/", OUTPUT_FILE = "output_file.json") ## End(Not run)
creates a FeatureCollection from R list objects ( see the details section about the limitations of this function )
save_R_list_Features_2_FeatureCollection( input_list, path_to_file = "", verbose = FALSE )
save_R_list_Features_2_FeatureCollection( input_list, path_to_file = "", verbose = FALSE )
input_list |
a list object that includes 1 or more geojson R list Features |
path_to_file |
either an empty string ("") or a valid path to a file where the output FeatureCollection will be saved |
verbose |
a boolean. If TRUE then information will be printed out in the console |
it allows the following attributes: 'type', 'id', 'properties' and 'geometry'
it allows only coordinates of type 'Polygon' or 'MultiPolygon' to be processed. In case of a 'Polygon' there are 2 cases: (a.) Polygon WITHOUT interior rings (a numeric matrix is expected) and (b.) Polygon WITH interior rings (a list of numeric matrices is expected). See the test-cases if you receive an error for the correct format of the input data. In case of a 'MultiPolygon' both Polygons with OR without interior rings can be included. Multipolygons are of the form: list of lists where each SUBLIST can be either a numeric matrix (Polygon without interior rings) or a list (Polygon with interior rings)
the properties attribute must be a list that can take only character strings, numeric and integer values of SIZE 1. In case that any of the input properties is of SIZE > 1 then it will throw an error.
The input_list parameter can be EITHER created from scratch OR GeoJson Features (in form of a FeatureCollection) can be loaded in R and modified so that this list can be processed by this function
a FeatureCollection in form of a character string
a FeatureCollection saved in a file
## Not run: library(geojsonR) #------------------------------------------------ # valid example that will save the data to a file #------------------------------------------------ Feature1 = list(type ="Feature", id = 1L, properties = list(prop1 = 'id', prop2 = 1.0234), geometry = list(type = 'Polygon', coordinates = matrix(runif(20), nrow = 10, ncol = 2))) Feature2 = list(type ="Feature", id = 2L, properties = list(prop1 = 'non-id', prop2 = 6.0987), geometry = list(type = 'MultiPolygon', coordinates = list(matrix(runif(20), nrow = 10, ncol = 2), matrix(runif(20), nrow = 10, ncol = 2)))) list_features = list(Feature1, Feature2) path_feat_col = tempfile(fileext = '.geojson') res = save_R_list_Features_2_FeatureCollection(input_list = list_features, path_to_file = path_feat_col, verbose = TRUE) #------------------------------------- # validate that the file can be loaded #------------------------------------- res_load = FROM_GeoJson_Schema(url_file_string = path_feat_col) str(res_load) #---------------------------------------------------- # INVALID data types such as NA's will throw an ERROR #---------------------------------------------------- Feature1 = list(type ="Feature", id = 1L, properties = list(prop1 = NA, prop2 = 1.0234), geometry = list(type = 'Polygon', coordinates = matrix(runif(20), nrow = 10, ncol = 2))) list_features = list(Feature1, Feature2) path_feat_col = tempfile(fileext = '.geojson') res = save_R_list_Features_2_FeatureCollection(input_list = list_features, path_to_file = path_feat_col, verbose = TRUE) ## End(Not run)
## Not run: library(geojsonR) #------------------------------------------------ # valid example that will save the data to a file #------------------------------------------------ Feature1 = list(type ="Feature", id = 1L, properties = list(prop1 = 'id', prop2 = 1.0234), geometry = list(type = 'Polygon', coordinates = matrix(runif(20), nrow = 10, ncol = 2))) Feature2 = list(type ="Feature", id = 2L, properties = list(prop1 = 'non-id', prop2 = 6.0987), geometry = list(type = 'MultiPolygon', coordinates = list(matrix(runif(20), nrow = 10, ncol = 2), matrix(runif(20), nrow = 10, ncol = 2)))) list_features = list(Feature1, Feature2) path_feat_col = tempfile(fileext = '.geojson') res = save_R_list_Features_2_FeatureCollection(input_list = list_features, path_to_file = path_feat_col, verbose = TRUE) #------------------------------------- # validate that the file can be loaded #------------------------------------- res_load = FROM_GeoJson_Schema(url_file_string = path_feat_col) str(res_load) #---------------------------------------------------- # INVALID data types such as NA's will throw an ERROR #---------------------------------------------------- Feature1 = list(type ="Feature", id = 1L, properties = list(prop1 = NA, prop2 = 1.0234), geometry = list(type = 'Polygon', coordinates = matrix(runif(20), nrow = 10, ncol = 2))) list_features = list(Feature1, Feature2) path_feat_col = tempfile(fileext = '.geojson') res = save_R_list_Features_2_FeatureCollection(input_list = list_features, path_to_file = path_feat_col, verbose = TRUE) ## End(Not run)
secondary function for shiny Applications
shiny_from_JSON(input_file)
shiny_from_JSON(input_file)
input_file |
a character string specifying a path to a file |
This function is meant for shiny Applications. To read a GeoJson file use either the FROM_GeoJson or FROM_GeoJson_Schema function.
a (nested) list
converts data to a GeoJson object
converts data to a GeoJson object
# utl <- TO_GeoJson$new()
# utl <- TO_GeoJson$new()
a List
TO_GeoJson$new()
--------------
Point(data, stringify = FALSE)
--------------
MultiPoint(data, stringify = FALSE)
--------------
LineString(data, stringify = FALSE)
--------------
MultiLineString(data, stringify = FALSE)
--------------
Polygon(data, stringify = FALSE)
--------------
MultiPolygon(data, stringify = FALSE)
--------------
GeometryCollection(data, stringify = FALSE)
--------------
Feature(data, stringify = FALSE)
--------------
FeatureCollection(data, stringify = FALSE)
--------------
new()
TO_GeoJson$new()
Point()
TO_GeoJson$Point(data, stringify = FALSE)
data
a list specifying the geojson geometry object
stringify
either TRUE or FALSE, specifying if the output should also include a geojson-dump (as a character string)
MultiPoint()
TO_GeoJson$MultiPoint(data, stringify = FALSE)
data
a list specifying the geojson geometry object
stringify
either TRUE or FALSE, specifying if the output should also include a geojson-dump (as a character string)
LineString()
TO_GeoJson$LineString(data, stringify = FALSE)
data
a list specifying the geojson geometry object
stringify
either TRUE or FALSE, specifying if the output should also include a geojson-dump (as a character string)
MultiLineString()
TO_GeoJson$MultiLineString(data, stringify = FALSE)
data
a list specifying the geojson geometry object
stringify
either TRUE or FALSE, specifying if the output should also include a geojson-dump (as a character string)
Polygon()
TO_GeoJson$Polygon(data, stringify = FALSE)
data
a list specifying the geojson geometry object
stringify
either TRUE or FALSE, specifying if the output should also include a geojson-dump (as a character string)
MultiPolygon()
TO_GeoJson$MultiPolygon(data, stringify = FALSE)
data
a list specifying the geojson geometry object
stringify
either TRUE or FALSE, specifying if the output should also include a geojson-dump (as a character string)
GeometryCollection()
TO_GeoJson$GeometryCollection(data, stringify = FALSE)
data
a list specifying the geojson geometry object
stringify
either TRUE or FALSE, specifying if the output should also include a geojson-dump (as a character string)
Feature()
TO_GeoJson$Feature(data, stringify = FALSE)
data
a list specifying the geojson geometry object
stringify
either TRUE or FALSE, specifying if the output should also include a geojson-dump (as a character string)
FeatureCollection()
TO_GeoJson$FeatureCollection(data, stringify = FALSE)
data
a list specifying the geojson geometry object
stringify
either TRUE or FALSE, specifying if the output should also include a geojson-dump (as a character string)
clone()
The objects of this class are cloneable with this method.
TO_GeoJson$clone(deep = FALSE)
deep
Whether to make a deep clone.
library(geojsonR) # initialize class init = TO_GeoJson$new() # Examples covering all geometry-objects # Point point_dat = c(100, 1.01) point = init$Point(point_dat, stringify = TRUE) point # MultiPoint multi_point_dat = list(c(100, 1.01), c(200, 2.01)) multi_point = init$MultiPoint(multi_point_dat, stringify = TRUE) multi_point # LineString linestring_dat = list(c(100, 1.01), c(200, 2.01)) line_string = init$LineString(linestring_dat, stringify = TRUE) line_string # MultiLineString multilinestring_dat = list(list(c(100, 0.0), c(101, 1.0)), list(c(102, 2.0), c(103, 3.0))) multiline_string = init$MultiLineString(multilinestring_dat, stringify = TRUE) multiline_string # Polygon (WITHOUT interior rings) polygon_WITHOUT_dat = list(list(c(100, 1.01), c(200, 2.01), c(100, 1.0), c(100, 1.01))) polygon_without = init$Polygon(polygon_WITHOUT_dat, stringify = TRUE) polygon_without # Polygon (WITH interior rings) polygon_WITH_dat = list(list(c(100, 1.01), c(200, 2.01), c(100, 1.0), c(100, 1.01)), list(c(50, 0.5), c(50, 0.8), c(50, 0.9), c(50, 0.5))) polygon_with = init$Polygon(polygon_WITH_dat, stringify = TRUE) polygon_with # MultiPolygon # the first polygon is without interior rings and the second one is with interior rings multi_polygon_dat = list(list(list(c(102, 2.0), c(103, 2.0), c(103, 3.0), c(102, 2.0))), list(list(c(100, 0.0), c(101, 1.0), c(101, 1.0), c(100, 0.0)), list(c(100.2, 0.2), c(100.2, 0.8), c(100.8, 0.8), c(100.2, 0.2)))) multi_polygon = init$MultiPolygon(multi_polygon_dat, stringify = TRUE) multi_polygon # GeometryCollection (named list) Point = c(100, 1.01) MultiPoint = list(c(100, 1.01), c(200, 2.01)) MultiLineString = list(list(c(100, 0.0), c(101, 1.0)), list(c(102, 2.0), c(103, 3.0))) LineString = list(c(100, 1.01), c(200, 2.01)) MultiLineString = list(list(c(100, 0.0), c(101, 1.0)), list(c(102, 2.0), c(103, 3.0))) Polygon = list(list(c(100, 1.01), c(200, 2.01), c(100, 1.0), c(100, 1.01))) Polygon = list(list(c(100, 1.01), c(200, 2.01), c(100, 1.0), c(100, 1.01)), list(c(50, 0.5), c(50, 0.8), c(50, 0.9), c(50, 0.5))) MultiPolygon = list(list(list(c(102, 2.0), c(103, 2.0), c(103, 3.0), c(102, 2.0))), list(list(c(100, 0.0), c(101, 1.0), c(101, 1.0), c(100, 0.0)), list(c(100.2, 0.2), c(100.2, 0.8), c(100.8, 0.8), c(100.2, 0.2)))) geometry_collection_dat = list(Point = Point, MultiPoint = MultiPoint, MultiLineString = MultiLineString, LineString = LineString, MultiLineString = MultiLineString, Polygon = Polygon, Polygon = Polygon, MultiPolygon = MultiPolygon) geometry_col = init$GeometryCollection(geometry_collection_dat, stringify = TRUE) geometry_col # Feature (named list) # Empty 'properties' list feature_dat1 = list(id = 1, bbox = c(1,2,3,4), geometry = list(Point = c(100, 1.01)), properties = list()) # Nested 'properties' list feature_dat2 = list(id = "1", bbox = c(1,2,3,4), geometry = list(Point = c(100, 1.01)), properties = list(prop0 = 'value0', prop1 = 0.0, vec = c(1,2,3), lst = list(a = 1, d = 2))) feature_obj = init$Feature(feature_dat2, stringify = TRUE) feature_obj cat(feature_obj$json_dump) # FeatureCollection (named list) # takes as input the previously created 'feature_dat1', 'feature_dat2' feature_col_dat = list(bbox = c(-10.01, -10.01, 10.01, 10.01), features = list(Feature = feature_dat1, Feature = feature_dat2)) feature_col_dat feature_collection_obj = init$FeatureCollection(feature_col_dat, stringify = TRUE) feature_collection_obj cat(feature_collection_obj$json_dump)
library(geojsonR) # initialize class init = TO_GeoJson$new() # Examples covering all geometry-objects # Point point_dat = c(100, 1.01) point = init$Point(point_dat, stringify = TRUE) point # MultiPoint multi_point_dat = list(c(100, 1.01), c(200, 2.01)) multi_point = init$MultiPoint(multi_point_dat, stringify = TRUE) multi_point # LineString linestring_dat = list(c(100, 1.01), c(200, 2.01)) line_string = init$LineString(linestring_dat, stringify = TRUE) line_string # MultiLineString multilinestring_dat = list(list(c(100, 0.0), c(101, 1.0)), list(c(102, 2.0), c(103, 3.0))) multiline_string = init$MultiLineString(multilinestring_dat, stringify = TRUE) multiline_string # Polygon (WITHOUT interior rings) polygon_WITHOUT_dat = list(list(c(100, 1.01), c(200, 2.01), c(100, 1.0), c(100, 1.01))) polygon_without = init$Polygon(polygon_WITHOUT_dat, stringify = TRUE) polygon_without # Polygon (WITH interior rings) polygon_WITH_dat = list(list(c(100, 1.01), c(200, 2.01), c(100, 1.0), c(100, 1.01)), list(c(50, 0.5), c(50, 0.8), c(50, 0.9), c(50, 0.5))) polygon_with = init$Polygon(polygon_WITH_dat, stringify = TRUE) polygon_with # MultiPolygon # the first polygon is without interior rings and the second one is with interior rings multi_polygon_dat = list(list(list(c(102, 2.0), c(103, 2.0), c(103, 3.0), c(102, 2.0))), list(list(c(100, 0.0), c(101, 1.0), c(101, 1.0), c(100, 0.0)), list(c(100.2, 0.2), c(100.2, 0.8), c(100.8, 0.8), c(100.2, 0.2)))) multi_polygon = init$MultiPolygon(multi_polygon_dat, stringify = TRUE) multi_polygon # GeometryCollection (named list) Point = c(100, 1.01) MultiPoint = list(c(100, 1.01), c(200, 2.01)) MultiLineString = list(list(c(100, 0.0), c(101, 1.0)), list(c(102, 2.0), c(103, 3.0))) LineString = list(c(100, 1.01), c(200, 2.01)) MultiLineString = list(list(c(100, 0.0), c(101, 1.0)), list(c(102, 2.0), c(103, 3.0))) Polygon = list(list(c(100, 1.01), c(200, 2.01), c(100, 1.0), c(100, 1.01))) Polygon = list(list(c(100, 1.01), c(200, 2.01), c(100, 1.0), c(100, 1.01)), list(c(50, 0.5), c(50, 0.8), c(50, 0.9), c(50, 0.5))) MultiPolygon = list(list(list(c(102, 2.0), c(103, 2.0), c(103, 3.0), c(102, 2.0))), list(list(c(100, 0.0), c(101, 1.0), c(101, 1.0), c(100, 0.0)), list(c(100.2, 0.2), c(100.2, 0.8), c(100.8, 0.8), c(100.2, 0.2)))) geometry_collection_dat = list(Point = Point, MultiPoint = MultiPoint, MultiLineString = MultiLineString, LineString = LineString, MultiLineString = MultiLineString, Polygon = Polygon, Polygon = Polygon, MultiPolygon = MultiPolygon) geometry_col = init$GeometryCollection(geometry_collection_dat, stringify = TRUE) geometry_col # Feature (named list) # Empty 'properties' list feature_dat1 = list(id = 1, bbox = c(1,2,3,4), geometry = list(Point = c(100, 1.01)), properties = list()) # Nested 'properties' list feature_dat2 = list(id = "1", bbox = c(1,2,3,4), geometry = list(Point = c(100, 1.01)), properties = list(prop0 = 'value0', prop1 = 0.0, vec = c(1,2,3), lst = list(a = 1, d = 2))) feature_obj = init$Feature(feature_dat2, stringify = TRUE) feature_obj cat(feature_obj$json_dump) # FeatureCollection (named list) # takes as input the previously created 'feature_dat1', 'feature_dat2' feature_col_dat = list(bbox = c(-10.01, -10.01, 10.01, 10.01), features = list(Feature = feature_dat1, Feature = feature_dat2)) feature_col_dat feature_collection_obj = init$FeatureCollection(feature_col_dat, stringify = TRUE) feature_collection_obj cat(feature_collection_obj$json_dump)