JuliaGeo¶

JuliaGeo is a (Github) organization that contains a number of related Julia projects for manipulating, querying, and processing geospatial geometry data. We aim to provide a common interface between geospatial packages. We also have a website.

We previously presented about JuliaGeo related work in:

  • FOSS4G2019 | JuliaGeo: A Fresh Approach to GeospatialComputing
  • JuliaCon2020 | GeoInterface: bringing geospatial packages together
  • JuliaCon2022 | State of JuliaGeo

The geospatial stack is not as mature as others (yet), mostly due to its age as Python and R have had a 20 years headstart. However, it is already easy to install the required C dependencies and read all common data formats into Julia types that can be used across the ecosystem.

In [1]:
]add ArchGDAL, RasterDataSources
    Updating registry at `C:\Users\Leonie Lokal\.julia\registries\General.toml`
   Resolving package versions...
   Installed ASCIIrasters ────── v0.1.1
   Installed RasterDataSources ─ v0.5.7
   Installed ZipFile ─────────── v0.9.4
    Updating `C:\Users\Leonie Lokal\.julia\environments\v1.9\Project.toml`
  [c9ce4bd3] + ArchGDAL v0.10.1
  [3cb90ccd] + RasterDataSources v0.5.7
    Updating `C:\Users\Leonie Lokal\.julia\environments\v1.9\Manifest.toml`
  [81770e7c] + ASCIIrasters v0.1.1
  [3cb90ccd] + RasterDataSources v0.5.7
⌅ [a5390f91] + ZipFile v0.9.4
        Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`
Precompiling project...
  ✓ ASCIIrasters
  ✓ ZipFile
  ✓ RasterDataSources
  ✓ Rasters → RastersRasterDataSourcesExt
  4 dependencies successfully precompiled in 18 seconds. 288 already precompiled.
  1 dependency had warnings during precompilation:
┌ RasterDataSources [3cb90ccd-e1b6-4867-9617-4276c8b2ca36]
│  ┌ Warning: Replacing docs for `RasterDataSources.getraster :: Union{}` in module `RasterDataSources`
│  └ @ Base.Docs docs\Docs.jl:243
└  
In [5]:
import Pkg
Pkg.add("DataFrames")
   Resolving package versions...
    Updating `C:\Users\Leonie Lokal\.julia\environments\v1.9\Project.toml`
  [a93c6f00] + DataFrames v1.6.1
  No Changes to `C:\Users\Leonie Lokal\.julia\environments\v1.9\Manifest.toml`
In [ ]:
]add ArchGDAL
In [6]:
using GeoDataFrames, DataFrames, Rasters, GeoArrays, GeoInterface, Downloads, Plots, ArchGDAL, RasterDataSources

Raster data¶

Let's download and open a small geotiff file. We use Rasters, a package inspired by rasterio in Python.

In [7]:
url = "https://github.com/yeesian/ArchGDALDatasets/blob/master/data/utmsmall.tif?raw=true"
fn = "utmsmall.tif"
fn = isfile(fn) ? fn : Downloads.download(url, "utmsmall.tif")
isfile(fn)
Out[7]:
true
In [8]:
using Rasters
raster = Raster(fn)
Out[8]:
100×100 Raster{UInt8,2} with dimensions: 
  X Projected{Float64} LinRange{Float64}(440720.0, 446660.0, 100) ForwardOrdered Regular Intervals crs: WellKnownText,
  Y Projected{Float64} LinRange{Float64}(3.75126e6, 3.74532e6, 100) ReverseOrdered Regular Intervals crs: WellKnownText
and reference dimensions: 
  Band Categorical{Int64} 1:1 ForwardOrdered
extent: Extent(X = (440720.0, 446720.0), Y = (3.74532e6, 3.75132e6))crs: PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]]
parent:
              3.75126e6     3.7512e6  …     3.74538e6     3.74532e6
 440720.0  0x6b          0x73            0x42          0x84
 440780.0  0x7b          0x84            0x8c          0xad
 440840.0  0x84          0x6b            0x8c          0x9c
 440900.0  0x73          0x7b            0x9c          0x94
 440960.0  0x84          0x94         …  0x73          0x19
 441020.0  0x84          0x73            0x3a          0x10
      ⋮                               ⋱     ⋮          
 446360.0  0xd6          0xce            0x84          0x94
 446420.0  0xf7          0xff         …  0x63          0x63
 446480.0  0xff          0xbd            0x52          0x52
 446540.0  0xe6          0xd6            0x5a          0x5a
 446600.0  0xce          0xce            0x5a          0x7b
 446660.0  0xc5          0xd6            0x6b          0xa5

In [9]:
p = plot(raster; c=:deep)
Out[9]:

We can request the coordinates of a (center of a) cell with coords, and also do the inverse with indices

In [10]:
@time view(raster, X(446000..446660), Y(3.75e6..3.75126e6))
  0.139923 seconds (314.91 k allocations: 19.950 MiB, 99.95% compilation time)
Out[10]:
11×21 Raster{UInt8,2} with dimensions: 
  X Projected{Float64} LinRange{Float64}(446000.0, 446600.0, 11) ForwardOrdered Regular Intervals crs: WellKnownText,
  Y Projected{Float64} LinRange{Float64}(3.7512e6, 3.75e6, 21) ReverseOrdered Regular Intervals crs: WellKnownText
and reference dimensions: 
  Band Categorical{Int64} 1:1 ForwardOrdered
extent: Extent(X = (446000.0, 446660.0), Y = (3.75e6, 3.75126e6))crs: PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]]
parent:
              3.7512e6     3.75114e6  …     3.75006e6     3.75e6
 446000.0  0xff         0xef             0xc5          0xc5
 446060.0  0xad         0xff             0xb5          0x9c
 446120.0  0xff         0xe6             0x9c          0xad
 446180.0  0xad         0xd6             0x8c          0x9c
 446240.0  0xde         0xff          …  0xb5          0xbd
 446300.0  0xff         0xff             0x84          0x7b
 446360.0  0xce         0xef             0xad          0x8c
 446420.0  0xff         0xb5             0xbd          0xff
 446480.0  0xbd         0xc5             0xbd          0xa5
 446540.0  0xd6         0xb5          …  0x94          0xad
 446600.0  0xce         0xff             0x9c          0x94

This Raster behaves just like any Array in Julia. You can do math with it, or change the type.

In [11]:
nraster = clamp.(Float32.(raster) * 2, 100, 200)
Out[11]:
100×100 Raster{Float32,2} with dimensions: 
  X Projected{Float64} LinRange{Float64}(440720.0, 446660.0, 100) ForwardOrdered Regular Intervals crs: WellKnownText,
  Y Projected{Float64} LinRange{Float64}(3.75126e6, 3.74532e6, 100) ReverseOrdered Regular Intervals crs: WellKnownText
and reference dimensions: 
  Band Categorical{Int64} 1:1 ForwardOrdered
extent: Extent(X = (440720.0, 446720.0), Y = (3.74532e6, 3.75132e6))crs: PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]]
parent:
             3.75126e6    3.7512e6    3.75114e6  …    3.74538e6    3.74532e6
 440720.0  200.0        200.0       200.0           132.0        200.0
 440780.0  200.0        200.0       200.0           200.0        200.0
 440840.0  200.0        200.0       200.0           200.0        200.0
 440900.0  200.0        200.0       200.0           200.0        200.0
 440960.0  200.0        200.0       200.0        …  200.0        100.0
 441020.0  200.0        200.0       200.0           116.0        100.0
      ⋮                                          ⋱    ⋮          
 446360.0  200.0        200.0       200.0           200.0        200.0
 446420.0  200.0        200.0       200.0        …  198.0        198.0
 446480.0  200.0        200.0       200.0           164.0        164.0
 446540.0  200.0        200.0       200.0           180.0        180.0
 446600.0  200.0        200.0       200.0           180.0        200.0
 446660.0  200.0        200.0       200.0           200.0        200.0

Saving to file is as easy as reading it

In [12]:
Rasters.write("test.tif", nraster)
Out[12]:
"test.tif"

Rasters can also rasterize points, create a raster from scratch, work on NetCDF files, do zonal statistics and more. Please check the documentation https://rafaqz.github.io/Rasters.jl/stable/

Vector data¶

We can also easily open vector datasets. We will use GeoDataFrames here, a package inspired by geopandas in Python.

In [13]:
url = "https://github.com/OpenGeoHub/spatial-prediction-eml/blob/master/input/gbif_aedes_albopictus.gpkg?raw=true"
fn = "gbif_aedes_albopictus.gpkg"
isfile(fn) || Downloads.download(url, fn)
Out[13]:
"gbif_aedes_albopictus.gpkg"
In [14]:
df = GeoDataFrames.read(fn)
Out[14]:
13903×50 DataFrame
13878 rows omitted
RowgeomgbifIDdatasetKeyoccurrenceIDkingdomphylumclassorderfamilygenusspeciesinfraspecificEpithettaxonRankscientificNameverbatimScientificNameverbatimScientificNameAuthorshipcountryCodelocalitystateProvinceoccurrenceStatusindividualCountpublishingOrgKeycoordinateUncertaintyInMeterscoordinatePrecisionelevationelevationAccuracydepthdepthAccuracyeventDatedaymonthyeartaxonKeyspeciesKeybasisOfRecordinstitutionCodecollectionCodecatalogNumberrecordNumberidentifiedBydateIdentifiedlicenserightsHolderrecordedBytypeStatusestablishmentMeanslastInterpretedmediaTypeissueDate
IGeometr…Float64StringString?StringStringStringStringStringStringStringMissingStringStringStringString?StringString?String?StringFloat64StringFloat64?MissingFloat64?Float64?MissingMissingStringFloat64?Float64?Float64Float64Float64StringString?String?String?MissingString?String?StringString?String?MissingString?StringString?String?String
1Geometry: wkbPoint3.72352e98a863029-f435-446a-821e-275f4f641165https://observation.org/observation/226030224AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingESSpain - BegurmissingPRESENT1.0c8d737e0-2ff8-42e8-b8fc-6b805d26fc5f43.0missingmissingmissingmissingmissing2021-09-21 00:00:0021.09.02021.01.65143e61.65143e6HUMAN_OBSERVATIONmissingObservationsOBS.226030224missingmissingmissingCC_BY_NC_4_0Stichting Observation Internationalmissingmissingmissing2022-03-24 21:07:39StillImageOCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT2021-09-21
2Geometry: wkbPoint3.72315e98a863029-f435-446a-821e-275f4f641165https://observation.org/observation/229897504AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingFRFrance - PaumissingPRESENT1.0c8d737e0-2ff8-42e8-b8fc-6b805d26fc5f25.0missingmissingmissingmissingmissing2021-07-22 00:00:0022.07.02021.01.65143e61.65143e6HUMAN_OBSERVATIONmissingObservationsOBS.229897504missingmissingmissingCC_BY_NC_4_0Stichting Observation Internationalmissingmissingmissing2022-03-24 21:21:48StillImageOCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT2021-07-22
3Geometry: wkbPoint3.72176e98a863029-f435-446a-821e-275f4f641165https://observation.org/observation/222737616AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingFRFrance - Caluire-et-CuiremissingPRESENT1.0c8d737e0-2ff8-42e8-b8fc-6b805d26fc5f356.0missingmissingmissingmissingmissing2021-08-12 00:00:0012.08.02021.01.65143e61.65143e6HUMAN_OBSERVATIONmissingObservationsOBS.222737616missingmissingmissingCC_BY_NC_4_0Stichting Observation Internationalmissingmissingmissing2022-03-24 21:01:03StillImageCOORDINATE_ROUNDED;OCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT2021-08-12
4Geometry: wkbPoint3.72142e98a863029-f435-446a-821e-275f4f641165https://observation.org/observation/221356176AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingESSpain - ElchemissingPRESENT1.0c8d737e0-2ff8-42e8-b8fc-6b805d26fc5f4.0missingmissingmissingmissingmissing2021-07-28 00:00:0028.07.02021.01.65143e61.65143e6HUMAN_OBSERVATIONmissingObservationsOBS.221356176missingmissingmissingCC_BY_NC_4_0Stichting Observation Internationalmissingmissingmissing2022-03-24 20:56:46StillImageOCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT2021-07-28
5Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E-Montesacro-M5-2020-06-30-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ITMontesacroRmPRESENT10.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missingmissingmissingmissingmissingmissing2020-06-30 00:00:0030.06.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingmissingCC_BY_NC_4_0missingmissingmissingIntroduced2022-03-30 14:52:49missingCOORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS842020-06-30
6Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E-SAR-4_200804-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)TR34396IstanbulPRESENT125.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missingmissing105.00.0missingmissing2020-08-04 00:00:004.08.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingmissingCC_BY_NC_4_0missingmissingmissingIntroduced2022-03-30 14:52:49missingGEODETIC_DATUM_ASSUMED_WGS842020-08-04
7Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E_CRO_ZG_40_200612-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)HRZagrebCity of ZagrebPRESENT22.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missingmissing137.00.0missingmissing2020-06-12 00:00:0012.06.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingmissingCC_BY_NC_4_0missingmissingmissingIntroduced2022-03-30 14:52:49missingGEODETIC_DATUM_ASSUMED_WGS842020-06-12
8Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E-Montesacro-M1-2020-06-16-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ITMontesacroRmPRESENT3.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missingmissingmissingmissingmissingmissing2020-06-16 00:00:0016.06.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingmissingCC_BY_NC_4_0missingmissingmissingIntroduced2022-03-30 14:52:49missingCOORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS842020-06-16
9Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E_SP_LesFonts_4_200902-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ESTerrassaBarcelonaPRESENT2.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missingmissing220.00.0missingmissing2020-09-02 00:00:002.09.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingmissingCC_BY_NC_4_0missingmissingmissingIntroduced2022-03-30 14:52:49missingGEODETIC_DATUM_ASSUMED_WGS842020-09-02
10Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E_AL_SR_3_201125-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ALSarandeSarandePRESENT2.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missingmissing22.00.0missingmissing2020-11-25 00:00:0025.011.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingmissingCC_BY_NC_4_0missingmissingmissingIntroduced2022-03-30 14:52:49missingGEODETIC_DATUM_ASSUMED_WGS842020-11-25
11Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E-Monterotondo-C4-2020-10-20-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ITMonterotondoRmPRESENT1.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missingmissingmissingmissingmissingmissing2020-10-20 00:00:0020.010.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingmissingCC_BY_NC_4_0missingmissingmissingIntroduced2022-03-30 14:52:49missingGEODETIC_DATUM_ASSUMED_WGS842020-10-20
12Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36A-SP-Palma-3-1-200910-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ESPalmaMallorcaPRESENT11.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missingmissing20.00.0missingmissing2020-09-10 00:00:0010.09.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingmissingCC_BY_NC_4_0missingmissingmissingIntroduced2022-03-30 14:52:49missingCOORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS842020-09-10
13Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E_ETX-FU-02_200721-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ESEtxebarriBizkaiaPRESENT15.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missingmissing27.10.0missingmissing2020-07-21 00:00:0021.07.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingmissingCC_BY_NC_4_0missingmissingmissingIntroduced2022-03-30 14:52:49missingGEODETIC_DATUM_ASSUMED_WGS842020-07-21
⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮
13892Geometry: wkbPoint1.26485e933614778-513a-4ec0-814d-125021cca5fe4461AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingTRmissingmissingPRESENT1.092f51af1-e917-49bc-a8ed-014ed3a77becmissingmissingmissingmissingmissingmissing2011-01-01 00:00:00missingmissing2011.01.65143e61.65143e6MATERIAL_CITATIONmissingmissingmissingmissingmissingmissingCC0_1_0missingmissingmissingmissing2022-01-30 11:39:38missingGEODETIC_DATUM_ASSUMED_WGS84;OCCURRENCE_STATUS_UNPARSABLE2011-01-01
13893Geometry: wkbPoint1.26485e933614778-513a-4ec0-814d-125021cca5fe4460AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingMEmissingmissingPRESENT1.092f51af1-e917-49bc-a8ed-014ed3a77becmissingmissingmissingmissingmissingmissing2010-01-01 00:00:00missingmissing2010.01.65143e61.65143e6MATERIAL_CITATIONmissingmissingmissingmissingmissingmissingCC0_1_0missingmissingmissingmissing2022-01-30 11:39:38missingGEODETIC_DATUM_ASSUMED_WGS84;OCCURRENCE_STATUS_UNPARSABLE2010-01-01
13894Geometry: wkbPoint1.22777e950c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/2533926AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingITmissingToscanaPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574d7.0missingmissingmissingmissingmissing2007-09-29 00:00:0029.09.02007.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations2533926missingfilippoceccolini2016-01-01 20:22:56CC_BY_NC_4_0filippoceccolinifilippoceccolinimissingmissing2022-04-05 23:28:48StillImagemissing2007-09-29
13895Geometry: wkbPoint1.14352e950c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/1881457AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingESmissingCataluñaPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574d25.0missingmissingmissingmissingmissing2015-08-22 06:27:5722.08.02015.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations1881457missingEduardo Martínez2015-08-28 21:54:44CC_BY_NC_4_0SergioSergiomissingmissing2022-04-05 22:57:01StillImageCOORDINATE_ROUNDED2015-08-22
13896Geometry: wkbPoint1.02433e950c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/905732AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingITmissingVenetoPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574dmissingmissingmissingmissingmissingmissing2014-09-30 16:57:3930.09.02014.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations905732missingMarcello Consolo2014-10-02 11:47:31CC_BY_4_0Marcello ConsoloMarcello Consolomissingmissing2022-04-05 23:26:50StillImagemissing2014-09-30
13897Geometry: wkbPoint1.02422e950c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/867653AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingESmissingCataluñaPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574d500.0missingmissingmissingmissingmissing2014-09-08 21:27:328.09.02014.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations867653missingmolluria2014-09-08 19:28:30CC_BY_NC_4_0molluriamolluriamissingmissing2022-04-05 22:56:54StillImagemissing2014-09-08
13898Geometry: wkbPoint1.02422e950c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/857721AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingITmissingVenetoPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574dmissingmissingmissingmissingmissingmissing2014-09-01 16:02:181.09.02014.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations857721missingMarcello Consolo2014-09-01 21:17:57CC_BY_4_0Marcello ConsoloMarcello Consolomissingmissing2022-04-05 23:20:48StillImagemissing2014-09-01
13899Geometry: wkbPoint9.2024e86ac3f774-d9fb-4796-b3e9-92bf6c81c084missingAnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingDEBischweiermissingPRESENT1.0bb646dff-a905-4403-a49b-6d378c2cf0d9250.0missingmissingmissingmissingmissing2012-06-16 00:00:0016.06.02012.01.65143e61.65143e6HUMAN_OBSERVATIONnaturguckernaturgucker481639899missingmissingmissingCC_BY_4_0missing-430290170missingmissing2022-02-24 22:31:39missingCOORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS842012-06-16
13900Geometry: wkbPoint9.20236e86ac3f774-d9fb-4796-b3e9-92bf6c81c084missingAnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingDEBischweiermissingPRESENT1.0bb646dff-a905-4403-a49b-6d378c2cf0d9250.0missingmissingmissingmissingmissing2007-05-12 00:00:0012.05.02007.01.65143e61.65143e6HUMAN_OBSERVATIONnaturguckernaturgucker-470102427missingmissingmissingCC_BY_4_0missing-430290170missingmissing2022-02-24 22:32:57missingCOORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS842007-05-12
13901Geometry: wkbPoint8.91149e850c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/258032AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingITmissingVenetoPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574dmissingmissingmissingmissingmissingmissing2012-09-23 00:43:4723.09.02012.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations258032missingMarcello Consolo2013-05-07 15:46:38CC_BY_4_0Marcello ConsoloMarcello Consolomissingmissing2022-04-05 23:27:15missingmissing2012-09-23
13902Geometry: wkbPoint8.91029e850c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/441906AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingITmissingVenetoPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574d1.0missingmissingmissingmissingmissing2013-10-18 17:39:2818.010.02013.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations441906missingMarcello Consolo2013-10-27 21:08:54CC_BY_4_0Marcello ConsoloMarcello Consolomissingmissing2022-04-05 22:56:55StillImagemissing2013-10-18
13903Geometry: wkbPoint7.68646e87a498826-f762-11e1-a439-00145eb45e9aMCNB:MCNB-Art:MZB 2010-1153AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusmissingSPECIESAedes albopictus (Skuse, 1894)Aedes (Stegomyia) albopictusmissingESmissingBarcelonaPRESENT1.0e8eada63-4a33-44aa-b2fd-4f71efb222a08633.08missing280.0missingmissingmissing2010-08-20 00:00:0020.08.02010.01.65143e61.65143e6PRESERVED_SPECIMENMCNBMCNB-ArtMZB 2010-1153missingMederos López, Jorge Luis2010-08-21 00:00:00CC_BY_4_0missingMederos López, Jorge Luismissingmissing2022-02-28 13:59:54missingOCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT;COLLECTION_MATCH_NONE;INSTITUTION_MATCH_FUZZY2010-08-20
In [18]:
ndf = dropmissing(df, :month)
step = 200
subr = 1:step:nrow(ndf)  # this is how you make a range
plot(ndf.geom[subr], marker_z=ndf.month[subr]', c=:turbo)  # don't plot all points
Out[18]:
In [16]:
histogram(df.month)
Out[16]:

We can also do geometric operations, like buffer. Note that we operate independent from the DataFrame, just on a Vector of geometries.

In [17]:
plot(GeoInterface.buffer.(df.geom[subr], 10))
Out[17]:

The astute reader will note something wrong here. We buffered with 10, but what unit is that? The distance is in the coordinate system, which is latitude/longitude here (some form of WGS84). If you expected something in meters, all answers will be wrong. Julia expects some responsibility from the user here (and in general).

In [19]:
DataFrames.metadata(df)  # no CRS(!) defined for this geopackage
Out[19]:
Dict{String, Union{Nothing, Tuple{Symbol}}} with 2 entries:
  "geometrycolumns" => (:geom,)
  "crs"             => nothing

Proj¶

Let's use the Proj package to project some data.

In [20]:
Pkg.add("Proj")
using Proj
   Resolving package versions...
   Installed Proj ─ v1.4.0
    Updating `C:\Users\Leonie Lokal\.julia\environments\v1.9\Project.toml`
  [c94c279d] + Proj v1.4.0
    Updating `C:\Users\Leonie Lokal\.julia\environments\v1.9\Manifest.toml`
  [c94c279d] + Proj v1.4.0
Precompiling project...
  ✓ Proj
  1 dependency successfully precompiled in 3 seconds. 292 already precompiled.
In [21]:
trans = Proj.Transformation("EPSG:4326", "+proj=utm +zone=31 +datum=WGS84")
Out[21]:
Transformation pipeline
    description: axis order change (2D) + UTM zone 31N
    definition: proj=pipeline step proj=axisswap order=2,1 step proj=unitconvert xy_in=deg xy_out=rad step proj=utm zone=31 ellps=WGS84
    direction: forward
In [22]:
@. trans(GeoInterface.coordinates(df.geom))  # Open PR to not need the GeoInterface here
Out[22]:
13903-element Vector{Tuple{Float64, Float64}}:
 (5.209376604186281e6, 456552.49739319785)
 (5.412241069392667e6, -50731.29295413459)
 (5.754713873198218e6, 733179.8932641628)
 (4.68187355543689e6, -87588.90154608067)
 (5.080960560416632e6, 1.798244832580825e6)
 (4.365457390064061e6, 3.9054092442464735e6)
 (5.487505153230741e6, 2.350489741186236e6)
 (5.082739701223782e6, 1.799398637696565e6)
 (5.150989731892225e6, 288756.27863756026)
 (4.573765250143256e6, 2.7094693606671216e6)
 (5.078039242256528e6, 1.8109702117222908e6)
 (4.870748849152667e6, 361067.96092195663)
 (5.394598021868791e6, -419992.2062797706)
 ⋮
 (4.487757221573868e6, 3.5960106434823587e6)
 (4.947812193001832e6, 2.724578586965682e6)
 (5.343704296345204e6, 1.6325303912099127e6)
 (5.171601017402769e6, 391407.8382243044)
 (5.5555960208923435e6, 1.7709453930896844e6)
 (5.109021046712543e6, 243357.92512239376)
 (5.5555960208923435e6, 1.7709453930896844e6)
 (6.161726404212961e6, 1.3077580635600183e6)
 (6.161726404212961e6, 1.3077580635600183e6)
 (5.55561653002505e6, 1.7709315733399887e6)
 (5.555608215072476e6, 1.7709450061190184e6)
 (5.131854397338626e6, 304168.2568917704)

Now let's also write some data again. In the 2022 summer school, we hit a snag by trying to write this DataFrame again.

In [23]:
ofn = "test.geojson"
GeoDataFrames.write(ofn, df; geom_column=(:geom), options=Dict("OVERWRITE"=>"YES"))
MethodError: Cannot `convert` an object of type Type{Missing} to an object of type ArchGDAL.OGRFieldType

Closest candidates are:
  convert(::Type{ArchGDAL.OGRFieldType}, ::Type{<:Enum{T}}) where T
   @ ArchGDAL C:\Users\Leonie Lokal\.julia\packages\ArchGDAL\R3wJR\src\types.jl:371
  convert(::Type{ArchGDAL.OGRFieldType}, ::GDAL.OGRFieldType)
   @ ArchGDAL C:\Users\Leonie Lokal\.julia\packages\ArchGDAL\R3wJR\src\utils.jl:163
  convert(::Type{ArchGDAL.OGRFieldType}, ::Type{UInt32})
   @ ArchGDAL C:\Users\Leonie Lokal\.julia\packages\ArchGDAL\R3wJR\src\utils.jl:142
  ...


Stacktrace:
  [1] (::GeoDataFrames.var"#20#25"{ArchGDAL.Dataset, String, Dict{String, String}, Vector{Tuple{Symbol, DataType}}, Vector{Any}, DataFrames.DataFrameRows{DataFrame}})(layer::ArchGDAL.FeatureLayer)
    @ GeoDataFrames C:\Users\Leonie Lokal\.julia\packages\GeoDataFrames\HubJA\src\io.jl:147
  [2] createlayer(::GeoDataFrames.var"#20#25"{ArchGDAL.Dataset, String, Dict{String, String}, Vector{Tuple{Symbol, DataType}}, Vector{Any}, DataFrames.DataFrameRows{DataFrame}}; kwargs::Base.Pairs{Symbol, Any, NTuple{4, Symbol}, NamedTuple{(:name, :geom, :spatialref, :options), Tuple{String, ArchGDAL.OGRwkbGeometryType, ArchGDAL.SpatialRef, Vector{String}}}})
    @ ArchGDAL C:\Users\Leonie Lokal\.julia\packages\ArchGDAL\R3wJR\src\context.jl:267
  [3] (::GeoDataFrames.var"#19#24"{ArchGDAL.Dataset, String, Nothing, Dict{String, String}, Vector{Tuple{Symbol, DataType}}, Vector{Any}, DataFrames.DataFrameRows{DataFrame}})(spatialref::ArchGDAL.SpatialRef)
    @ GeoDataFrames C:\Users\Leonie Lokal\.julia\packages\GeoDataFrames\HubJA\src\io.jl:135
  [4] newspatialref(::GeoDataFrames.var"#19#24"{ArchGDAL.Dataset, String, Nothing, Dict{String, String}, Vector{Tuple{Symbol, DataType}}, Vector{Any}, DataFrames.DataFrameRows{DataFrame}}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ ArchGDAL C:\Users\Leonie Lokal\.julia\packages\ArchGDAL\R3wJR\src\context.jl:267
  [5] newspatialref
    @ C:\Users\Leonie Lokal\.julia\packages\ArchGDAL\R3wJR\src\context.jl:264 [inlined]
  [6] #18
    @ C:\Users\Leonie Lokal\.julia\packages\GeoDataFrames\HubJA\src\io.jl:133 [inlined]
  [7] create(f::GeoDataFrames.var"#18#23"{String, Nothing, Dict{String, String}, Vector{Tuple{Symbol, DataType}}, Vector{Any}, DataFrames.DataFrameRows{DataFrame}}, args::String; kwargs::Base.Pairs{Symbol, ArchGDAL.Driver, Tuple{Symbol}, NamedTuple{(:driver,), Tuple{ArchGDAL.Driver}}})
    @ ArchGDAL C:\Users\Leonie Lokal\.julia\packages\ArchGDAL\R3wJR\src\context.jl:267
  [8] create
    @ C:\Users\Leonie Lokal\.julia\packages\ArchGDAL\R3wJR\src\context.jl:264 [inlined]
  [9] write(fn::String, table::DataFrame; layer_name::String, crs::Nothing, driver::Nothing, options::Dict{String, String}, geom_columns::Tuple{Symbol}, kwargs::Base.Pairs{Symbol, Symbol, Tuple{Symbol}, NamedTuple{(:geom_column,), Tuple{Symbol}}})
    @ GeoDataFrames C:\Users\Leonie Lokal\.julia\packages\GeoDataFrames\HubJA\src\io.jl:129
 [10] top-level scope
    @ In[23]:2
In [24]:
using DataFrames
columns = String[]
for (column, type) in (zip(names(df), eltype.(eachcol(df))))
    type isa Type{Missing} && push!(columns, column)
end      
@info columns
sdf = df[!, Not(columns)]
[ Info: ["infraspecificEpithet", "coordinatePrecision", "depth", "depthAccuracy", "recordNumber", "typeStatus"]
Out[24]:
13903×44 DataFrame
13878 rows omitted
RowgeomgbifIDdatasetKeyoccurrenceIDkingdomphylumclassorderfamilygenusspeciestaxonRankscientificNameverbatimScientificNameverbatimScientificNameAuthorshipcountryCodelocalitystateProvinceoccurrenceStatusindividualCountpublishingOrgKeycoordinateUncertaintyInMeterselevationelevationAccuracyeventDatedaymonthyeartaxonKeyspeciesKeybasisOfRecordinstitutionCodecollectionCodecatalogNumberidentifiedBydateIdentifiedlicenserightsHolderrecordedByestablishmentMeanslastInterpretedmediaTypeissueDate
IGeometr…Float64StringString?StringStringStringStringStringStringStringStringStringStringString?StringString?String?StringFloat64StringFloat64?Float64?Float64?StringFloat64?Float64?Float64Float64Float64StringString?String?String?String?String?StringString?String?String?StringString?String?String
1Geometry: wkbPoint3.72352e98a863029-f435-446a-821e-275f4f641165https://observation.org/observation/226030224AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingESSpain - BegurmissingPRESENT1.0c8d737e0-2ff8-42e8-b8fc-6b805d26fc5f43.0missingmissing2021-09-21 00:00:0021.09.02021.01.65143e61.65143e6HUMAN_OBSERVATIONmissingObservationsOBS.226030224missingmissingCC_BY_NC_4_0Stichting Observation Internationalmissingmissing2022-03-24 21:07:39StillImageOCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT2021-09-21
2Geometry: wkbPoint3.72315e98a863029-f435-446a-821e-275f4f641165https://observation.org/observation/229897504AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingFRFrance - PaumissingPRESENT1.0c8d737e0-2ff8-42e8-b8fc-6b805d26fc5f25.0missingmissing2021-07-22 00:00:0022.07.02021.01.65143e61.65143e6HUMAN_OBSERVATIONmissingObservationsOBS.229897504missingmissingCC_BY_NC_4_0Stichting Observation Internationalmissingmissing2022-03-24 21:21:48StillImageOCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT2021-07-22
3Geometry: wkbPoint3.72176e98a863029-f435-446a-821e-275f4f641165https://observation.org/observation/222737616AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingFRFrance - Caluire-et-CuiremissingPRESENT1.0c8d737e0-2ff8-42e8-b8fc-6b805d26fc5f356.0missingmissing2021-08-12 00:00:0012.08.02021.01.65143e61.65143e6HUMAN_OBSERVATIONmissingObservationsOBS.222737616missingmissingCC_BY_NC_4_0Stichting Observation Internationalmissingmissing2022-03-24 21:01:03StillImageCOORDINATE_ROUNDED;OCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT2021-08-12
4Geometry: wkbPoint3.72142e98a863029-f435-446a-821e-275f4f641165https://observation.org/observation/221356176AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingESSpain - ElchemissingPRESENT1.0c8d737e0-2ff8-42e8-b8fc-6b805d26fc5f4.0missingmissing2021-07-28 00:00:0028.07.02021.01.65143e61.65143e6HUMAN_OBSERVATIONmissingObservationsOBS.221356176missingmissingCC_BY_NC_4_0Stichting Observation Internationalmissingmissing2022-03-24 20:56:46StillImageOCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT2021-07-28
5Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E-Montesacro-M5-2020-06-30-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ITMontesacroRmPRESENT10.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missingmissingmissing2020-06-30 00:00:0030.06.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingCC_BY_NC_4_0missingmissingIntroduced2022-03-30 14:52:49missingCOORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS842020-06-30
6Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E-SAR-4_200804-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)TR34396IstanbulPRESENT125.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missing105.00.02020-08-04 00:00:004.08.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingCC_BY_NC_4_0missingmissingIntroduced2022-03-30 14:52:49missingGEODETIC_DATUM_ASSUMED_WGS842020-08-04
7Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E_CRO_ZG_40_200612-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)HRZagrebCity of ZagrebPRESENT22.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missing137.00.02020-06-12 00:00:0012.06.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingCC_BY_NC_4_0missingmissingIntroduced2022-03-30 14:52:49missingGEODETIC_DATUM_ASSUMED_WGS842020-06-12
8Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E-Montesacro-M1-2020-06-16-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ITMontesacroRmPRESENT3.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missingmissingmissing2020-06-16 00:00:0016.06.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingCC_BY_NC_4_0missingmissingIntroduced2022-03-30 14:52:49missingCOORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS842020-06-16
9Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E_SP_LesFonts_4_200902-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ESTerrassaBarcelonaPRESENT2.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missing220.00.02020-09-02 00:00:002.09.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingCC_BY_NC_4_0missingmissingIntroduced2022-03-30 14:52:49missingGEODETIC_DATUM_ASSUMED_WGS842020-09-02
10Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E_AL_SR_3_201125-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ALSarandeSarandePRESENT2.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missing22.00.02020-11-25 00:00:0025.011.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingCC_BY_NC_4_0missingmissingIntroduced2022-03-30 14:52:49missingGEODETIC_DATUM_ASSUMED_WGS842020-11-25
11Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E-Monterotondo-C4-2020-10-20-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ITMonterotondoRmPRESENT1.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missingmissingmissing2020-10-20 00:00:0020.010.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingCC_BY_NC_4_0missingmissingIntroduced2022-03-30 14:52:49missingGEODETIC_DATUM_ASSUMED_WGS842020-10-20
12Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36A-SP-Palma-3-1-200910-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ESPalmaMallorcaPRESENT11.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missing20.00.02020-09-10 00:00:0010.09.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingCC_BY_NC_4_0missingmissingIntroduced2022-03-30 14:52:49missingCOORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS842020-09-10
13Geometry: wkbPoint3.71405e903269e13-84ae-430f-990e-f11069413e36E_ETX-FU-02_200721-1AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictus (Skuse, 1894)(Skuse, 1894)ESEtxebarriBizkaiaPRESENT15.0e37fc40e-0541-4ffa-8a4c-0426d73804e8missing27.10.02020-07-21 00:00:0021.07.02020.01.65143e61.65143e6HUMAN_OBSERVATIONUIBmissingmissingmissingmissingCC_BY_NC_4_0missingmissingIntroduced2022-03-30 14:52:49missingGEODETIC_DATUM_ASSUMED_WGS842020-07-21
⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮
13892Geometry: wkbPoint1.26485e933614778-513a-4ec0-814d-125021cca5fe4461AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingTRmissingmissingPRESENT1.092f51af1-e917-49bc-a8ed-014ed3a77becmissingmissingmissing2011-01-01 00:00:00missingmissing2011.01.65143e61.65143e6MATERIAL_CITATIONmissingmissingmissingmissingmissingCC0_1_0missingmissingmissing2022-01-30 11:39:38missingGEODETIC_DATUM_ASSUMED_WGS84;OCCURRENCE_STATUS_UNPARSABLE2011-01-01
13893Geometry: wkbPoint1.26485e933614778-513a-4ec0-814d-125021cca5fe4460AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingMEmissingmissingPRESENT1.092f51af1-e917-49bc-a8ed-014ed3a77becmissingmissingmissing2010-01-01 00:00:00missingmissing2010.01.65143e61.65143e6MATERIAL_CITATIONmissingmissingmissingmissingmissingCC0_1_0missingmissingmissing2022-01-30 11:39:38missingGEODETIC_DATUM_ASSUMED_WGS84;OCCURRENCE_STATUS_UNPARSABLE2010-01-01
13894Geometry: wkbPoint1.22777e950c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/2533926AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingITmissingToscanaPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574d7.0missingmissing2007-09-29 00:00:0029.09.02007.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations2533926filippoceccolini2016-01-01 20:22:56CC_BY_NC_4_0filippoceccolinifilippoceccolinimissing2022-04-05 23:28:48StillImagemissing2007-09-29
13895Geometry: wkbPoint1.14352e950c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/1881457AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingESmissingCataluñaPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574d25.0missingmissing2015-08-22 06:27:5722.08.02015.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations1881457Eduardo Martínez2015-08-28 21:54:44CC_BY_NC_4_0SergioSergiomissing2022-04-05 22:57:01StillImageCOORDINATE_ROUNDED2015-08-22
13896Geometry: wkbPoint1.02433e950c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/905732AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingITmissingVenetoPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574dmissingmissingmissing2014-09-30 16:57:3930.09.02014.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations905732Marcello Consolo2014-10-02 11:47:31CC_BY_4_0Marcello ConsoloMarcello Consolomissing2022-04-05 23:26:50StillImagemissing2014-09-30
13897Geometry: wkbPoint1.02422e950c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/867653AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingESmissingCataluñaPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574d500.0missingmissing2014-09-08 21:27:328.09.02014.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations867653molluria2014-09-08 19:28:30CC_BY_NC_4_0molluriamolluriamissing2022-04-05 22:56:54StillImagemissing2014-09-08
13898Geometry: wkbPoint1.02422e950c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/857721AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingITmissingVenetoPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574dmissingmissingmissing2014-09-01 16:02:181.09.02014.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations857721Marcello Consolo2014-09-01 21:17:57CC_BY_4_0Marcello ConsoloMarcello Consolomissing2022-04-05 23:20:48StillImagemissing2014-09-01
13899Geometry: wkbPoint9.2024e86ac3f774-d9fb-4796-b3e9-92bf6c81c084missingAnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingDEBischweiermissingPRESENT1.0bb646dff-a905-4403-a49b-6d378c2cf0d9250.0missingmissing2012-06-16 00:00:0016.06.02012.01.65143e61.65143e6HUMAN_OBSERVATIONnaturguckernaturgucker481639899missingmissingCC_BY_4_0missing-430290170missing2022-02-24 22:31:39missingCOORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS842012-06-16
13900Geometry: wkbPoint9.20236e86ac3f774-d9fb-4796-b3e9-92bf6c81c084missingAnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingDEBischweiermissingPRESENT1.0bb646dff-a905-4403-a49b-6d378c2cf0d9250.0missingmissing2007-05-12 00:00:0012.05.02007.01.65143e61.65143e6HUMAN_OBSERVATIONnaturguckernaturgucker-470102427missingmissingCC_BY_4_0missing-430290170missing2022-02-24 22:32:57missingCOORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS842007-05-12
13901Geometry: wkbPoint8.91149e850c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/258032AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingITmissingVenetoPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574dmissingmissingmissing2012-09-23 00:43:4723.09.02012.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations258032Marcello Consolo2013-05-07 15:46:38CC_BY_4_0Marcello ConsoloMarcello Consolomissing2022-04-05 23:27:15missingmissing2012-09-23
13902Geometry: wkbPoint8.91029e850c9509d-22c7-4a22-a47d-8c48425ef4a7http://www.inaturalist.org/observations/441906AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes albopictusmissingITmissingVenetoPRESENT1.028eb1a3f-1c15-4a95-931a-4af90ecb574d1.0missingmissing2013-10-18 17:39:2818.010.02013.01.65143e61.65143e6HUMAN_OBSERVATIONiNaturalistObservations441906Marcello Consolo2013-10-27 21:08:54CC_BY_4_0Marcello ConsoloMarcello Consolomissing2022-04-05 22:56:55StillImagemissing2013-10-18
13903Geometry: wkbPoint7.68646e87a498826-f762-11e1-a439-00145eb45e9aMCNB:MCNB-Art:MZB 2010-1153AnimaliaArthropodaInsectaDipteraCulicidaeAedesAedes albopictusSPECIESAedes albopictus (Skuse, 1894)Aedes (Stegomyia) albopictusmissingESmissingBarcelonaPRESENT1.0e8eada63-4a33-44aa-b2fd-4f71efb222a08633.08280.0missing2010-08-20 00:00:0020.08.02010.01.65143e61.65143e6PRESERVED_SPECIMENMCNBMCNB-ArtMZB 2010-1153Mederos López, Jorge Luis2010-08-21 00:00:00CC_BY_4_0missingMederos López, Jorge Luismissing2022-02-28 13:59:54missingOCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT;COLLECTION_MATCH_NONE;INSTITUTION_MATCH_FUZZY2010-08-20
In [93]:
isfile(ofn) && rm(ofn)  # GDAL can't overwrite GeoJSON files...
GeoDataFrames.write(ofn, sdf; geom_column=(:geom))
Out[93]:
"test.geojson"

We can read a textfile from disk by using read.

In [94]:
String(read(ofn))
Out[94]:
"{\n\"type\": \"FeatureCollection\",\n\"name\": \"data\",\n\"features\": [\n{ \"type\": \"Feature\", \"id\": 0, \"properties\": { \"gbifID\": 3723517781.0, \"datasetKey\": \"8a863029-f435-446a-821e-275f4f641165\", \"occurrenceID\": \"https://observation.org/observation/226030224\", \"kingdom\": \"Animal" ⋯ 20362681 bytes ⋯ ", \"lastInterpreted\": \"2022-02-28 13:59:54\", \"mediaType\": null, \"issue\": \"OCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT;COLLECTION_MATCH_NONE;INSTITUTION_MATCH_FUZZY\", \"Date\": \"2010-08-20\" }, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ 2.1529, 41.3937 ] } }\n]\n}\n"

There are many other pure (i.e. not depending on another library like GDAL) Julia readers of such data. For example, the above can be read with GeoJSON.jl. There's also ShapeFile.jl, GeoParquet.jl and we are working on a GeoArrow.jl one.

In [19]:
using Pkg
Pkg.add("GeoJSON")
import GeoJSON as GJ  # Rasters also defines a GeoJSON
   Resolving package versions...
  No Changes to `~/code/Project.toml`
  No Changes to `~/code/Manifest.toml`
In [20]:
fc = GJ.read(read(ofn))
Out[20]:
FeatureCollection with 13903 Features
In [21]:
fcg = fc.geometry  # check autocomplete with TAB(!)
Out[21]:
13903-element Vector{GeoJSON.Point{2, Float32}}:
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 ⋮
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
 2D Point
In [22]:
jdf = DataFrame(fc)
Out[22]:
13903×44 DataFrame
13878 rows omitted
RowverbatimScientificNamelicenserightsHolderlastInterpretedspecieselevationAccuracyinstitutionCodespeciesKeyeventDateverbatimScientificNameAuthorshippublishingOrgKeydateIdentifiedscientificNamelocalitycoordinateUncertaintyInMetersDateidentifiedByindividualCountbasisOfRecordclasskingdomdatasetKeyestablishmentMeansmediaTypegbifIDtaxonKeyissueelevationdaystateProvinceoccurrenceIDgenusgeometryoccurrenceStatusphylumcountryCodecollectionCodeyearordertaxonRankrecordedBycatalogNumberfamilymonth
StringStringString?StringStringInt64?String?Int64StringString?StringString?StringString?Union…?StringString?Int64StringStringStringStringString?String?Int64Int64String?Union…?Int64?String?String?StringPoint…StringStringStringString?Int64StringStringString?String?StringInt64?
1Aedes albopictusCC_BY_NC_4_0Stichting Observation International2022-03-24 21:07:39Aedes albopictusmissingmissing16514302021-09-21 00:00:00missingc8d737e0-2ff8-42e8-b8fc-6b805d26fc5fmissingAedes albopictus (Skuse, 1894)Spain - Begur432021-09-21missing1HUMAN_OBSERVATIONInsectaAnimalia8a863029-f435-446a-821e-275f4f641165missingStillImage37235177811651430OCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNTmissing21missinghttps://observation.org/observation/226030224Aedes2D PointPRESENTArthropodaESObservations2021DipteraSPECIESmissingOBS.226030224Culicidae9
2Aedes albopictusCC_BY_NC_4_0Stichting Observation International2022-03-24 21:21:48Aedes albopictusmissingmissing16514302021-07-22 00:00:00missingc8d737e0-2ff8-42e8-b8fc-6b805d26fc5fmissingAedes albopictus (Skuse, 1894)France - Pau252021-07-22missing1HUMAN_OBSERVATIONInsectaAnimalia8a863029-f435-446a-821e-275f4f641165missingStillImage37231495121651430OCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNTmissing22missinghttps://observation.org/observation/229897504Aedes2D PointPRESENTArthropodaFRObservations2021DipteraSPECIESmissingOBS.229897504Culicidae7
3Aedes albopictusCC_BY_NC_4_0Stichting Observation International2022-03-24 21:01:03Aedes albopictusmissingmissing16514302021-08-12 00:00:00missingc8d737e0-2ff8-42e8-b8fc-6b805d26fc5fmissingAedes albopictus (Skuse, 1894)France - Caluire-et-Cuire3562021-08-12missing1HUMAN_OBSERVATIONInsectaAnimalia8a863029-f435-446a-821e-275f4f641165missingStillImage37217632021651430COORDINATE_ROUNDED;OCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNTmissing12missinghttps://observation.org/observation/222737616Aedes2D PointPRESENTArthropodaFRObservations2021DipteraSPECIESmissingOBS.222737616Culicidae8
4Aedes albopictusCC_BY_NC_4_0Stichting Observation International2022-03-24 20:56:46Aedes albopictusmissingmissing16514302021-07-28 00:00:00missingc8d737e0-2ff8-42e8-b8fc-6b805d26fc5fmissingAedes albopictus (Skuse, 1894)Spain - Elche42021-07-28missing1HUMAN_OBSERVATIONInsectaAnimalia8a863029-f435-446a-821e-275f4f641165missingStillImage37214222841651430OCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNTmissing28missinghttps://observation.org/observation/221356176Aedes2D PointPRESENTArthropodaESObservations2021DipteraSPECIESmissingOBS.221356176Culicidae7
5Aedes albopictus (Skuse, 1894)CC_BY_NC_4_0missing2022-03-30 14:52:49Aedes albopictusmissingUIB16514302020-06-30 00:00:00(Skuse, 1894)e37fc40e-0541-4ffa-8a4c-0426d73804e8missingAedes albopictus (Skuse, 1894)Montesacromissing2020-06-30missing10HUMAN_OBSERVATIONInsectaAnimalia03269e13-84ae-430f-990e-f11069413e36Introducedmissing37140520431651430COORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS84missing30RmE-Montesacro-M5-2020-06-30-1Aedes2D PointPRESENTArthropodaITmissing2020DipteraSPECIESmissingmissingCulicidae6
6Aedes albopictus (Skuse, 1894)CC_BY_NC_4_0missing2022-03-30 14:52:49Aedes albopictus0UIB16514302020-08-04 00:00:00(Skuse, 1894)e37fc40e-0541-4ffa-8a4c-0426d73804e8missingAedes albopictus (Skuse, 1894)34396missing2020-08-04missing125HUMAN_OBSERVATIONInsectaAnimalia03269e13-84ae-430f-990e-f11069413e36Introducedmissing37140520391651430GEODETIC_DATUM_ASSUMED_WGS841054IstanbulE-SAR-4_200804-1Aedes2D PointPRESENTArthropodaTRmissing2020DipteraSPECIESmissingmissingCulicidae8
7Aedes albopictus (Skuse, 1894)CC_BY_NC_4_0missing2022-03-30 14:52:49Aedes albopictus0UIB16514302020-06-12 00:00:00(Skuse, 1894)e37fc40e-0541-4ffa-8a4c-0426d73804e8missingAedes albopictus (Skuse, 1894)Zagrebmissing2020-06-12missing22HUMAN_OBSERVATIONInsectaAnimalia03269e13-84ae-430f-990e-f11069413e36Introducedmissing37140520271651430GEODETIC_DATUM_ASSUMED_WGS8413712City of ZagrebE_CRO_ZG_40_200612-1Aedes2D PointPRESENTArthropodaHRmissing2020DipteraSPECIESmissingmissingCulicidae6
8Aedes albopictus (Skuse, 1894)CC_BY_NC_4_0missing2022-03-30 14:52:49Aedes albopictusmissingUIB16514302020-06-16 00:00:00(Skuse, 1894)e37fc40e-0541-4ffa-8a4c-0426d73804e8missingAedes albopictus (Skuse, 1894)Montesacromissing2020-06-16missing3HUMAN_OBSERVATIONInsectaAnimalia03269e13-84ae-430f-990e-f11069413e36Introducedmissing37140520101651430COORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS84missing16RmE-Montesacro-M1-2020-06-16-1Aedes2D PointPRESENTArthropodaITmissing2020DipteraSPECIESmissingmissingCulicidae6
9Aedes albopictus (Skuse, 1894)CC_BY_NC_4_0missing2022-03-30 14:52:49Aedes albopictus0UIB16514302020-09-02 00:00:00(Skuse, 1894)e37fc40e-0541-4ffa-8a4c-0426d73804e8missingAedes albopictus (Skuse, 1894)Terrassamissing2020-09-02missing2HUMAN_OBSERVATIONInsectaAnimalia03269e13-84ae-430f-990e-f11069413e36Introducedmissing37140520071651430GEODETIC_DATUM_ASSUMED_WGS842202BarcelonaE_SP_LesFonts_4_200902-1Aedes2D PointPRESENTArthropodaESmissing2020DipteraSPECIESmissingmissingCulicidae9
10Aedes albopictus (Skuse, 1894)CC_BY_NC_4_0missing2022-03-30 14:52:49Aedes albopictus0UIB16514302020-11-25 00:00:00(Skuse, 1894)e37fc40e-0541-4ffa-8a4c-0426d73804e8missingAedes albopictus (Skuse, 1894)Sarandemissing2020-11-25missing2HUMAN_OBSERVATIONInsectaAnimalia03269e13-84ae-430f-990e-f11069413e36Introducedmissing37140520051651430GEODETIC_DATUM_ASSUMED_WGS842225SarandeE_AL_SR_3_201125-1Aedes2D PointPRESENTArthropodaALmissing2020DipteraSPECIESmissingmissingCulicidae11
11Aedes albopictus (Skuse, 1894)CC_BY_NC_4_0missing2022-03-30 14:52:49Aedes albopictusmissingUIB16514302020-10-20 00:00:00(Skuse, 1894)e37fc40e-0541-4ffa-8a4c-0426d73804e8missingAedes albopictus (Skuse, 1894)Monterotondomissing2020-10-20missing1HUMAN_OBSERVATIONInsectaAnimalia03269e13-84ae-430f-990e-f11069413e36Introducedmissing37140520001651430GEODETIC_DATUM_ASSUMED_WGS84missing20RmE-Monterotondo-C4-2020-10-20-1Aedes2D PointPRESENTArthropodaITmissing2020DipteraSPECIESmissingmissingCulicidae10
12Aedes albopictus (Skuse, 1894)CC_BY_NC_4_0missing2022-03-30 14:52:49Aedes albopictus0UIB16514302020-09-10 00:00:00(Skuse, 1894)e37fc40e-0541-4ffa-8a4c-0426d73804e8missingAedes albopictus (Skuse, 1894)Palmamissing2020-09-10missing11HUMAN_OBSERVATIONInsectaAnimalia03269e13-84ae-430f-990e-f11069413e36Introducedmissing37140519971651430COORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS842010MallorcaA-SP-Palma-3-1-200910-1Aedes2D PointPRESENTArthropodaESmissing2020DipteraSPECIESmissingmissingCulicidae9
13Aedes albopictus (Skuse, 1894)CC_BY_NC_4_0missing2022-03-30 14:52:49Aedes albopictus0UIB16514302020-07-21 00:00:00(Skuse, 1894)e37fc40e-0541-4ffa-8a4c-0426d73804e8missingAedes albopictus (Skuse, 1894)Etxebarrimissing2020-07-21missing15HUMAN_OBSERVATIONInsectaAnimalia03269e13-84ae-430f-990e-f11069413e36Introducedmissing37140519961651430GEODETIC_DATUM_ASSUMED_WGS8427.121BizkaiaE_ETX-FU-02_200721-1Aedes2D PointPRESENTArthropodaESmissing2020DipteraSPECIESmissingmissingCulicidae7
⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮
13892Aedes albopictusCC0_1_0missing2022-01-30 11:39:38Aedes albopictusmissingmissing16514302011-01-01 00:00:00missing92f51af1-e917-49bc-a8ed-014ed3a77becmissingAedes albopictus (Skuse, 1894)missingmissing2011-01-01missing1MATERIAL_CITATIONInsectaAnimalia33614778-513a-4ec0-814d-125021cca5femissingmissing12648539391651430GEODETIC_DATUM_ASSUMED_WGS84;OCCURRENCE_STATUS_UNPARSABLEmissingmissingmissing4461Aedes2D PointPRESENTArthropodaTRmissing2011DipteraSPECIESmissingmissingCulicidaemissing
13893Aedes albopictusCC0_1_0missing2022-01-30 11:39:38Aedes albopictusmissingmissing16514302010-01-01 00:00:00missing92f51af1-e917-49bc-a8ed-014ed3a77becmissingAedes albopictus (Skuse, 1894)missingmissing2010-01-01missing1MATERIAL_CITATIONInsectaAnimalia33614778-513a-4ec0-814d-125021cca5femissingmissing12648538881651430GEODETIC_DATUM_ASSUMED_WGS84;OCCURRENCE_STATUS_UNPARSABLEmissingmissingmissing4460Aedes2D PointPRESENTArthropodaMEmissing2010DipteraSPECIESmissingmissingCulicidaemissing
13894Aedes albopictusCC_BY_NC_4_0filippoceccolini2022-04-05 23:28:48Aedes albopictusmissingiNaturalist16514302007-09-29 00:00:00missing28eb1a3f-1c15-4a95-931a-4af90ecb574d2016-01-01 20:22:56Aedes albopictus (Skuse, 1894)missing72007-09-29filippoceccolini1HUMAN_OBSERVATIONInsectaAnimalia50c9509d-22c7-4a22-a47d-8c48425ef4a7missingStillImage12277671471651430missingmissing29Toscanahttp://www.inaturalist.org/observations/2533926Aedes2D PointPRESENTArthropodaITObservations2007DipteraSPECIESfilippoceccolini2533926Culicidae9
13895Aedes albopictusCC_BY_NC_4_0Sergio2022-04-05 22:57:01Aedes albopictusmissingiNaturalist16514302015-08-22 06:27:57missing28eb1a3f-1c15-4a95-931a-4af90ecb574d2015-08-28 21:54:44Aedes albopictus (Skuse, 1894)missing252015-08-22Eduardo Martínez1HUMAN_OBSERVATIONInsectaAnimalia50c9509d-22c7-4a22-a47d-8c48425ef4a7missingStillImage11435237541651430COORDINATE_ROUNDEDmissing22Cataluñahttp://www.inaturalist.org/observations/1881457Aedes2D PointPRESENTArthropodaESObservations2015DipteraSPECIESSergio1881457Culicidae8
13896Aedes albopictusCC_BY_4_0Marcello Consolo2022-04-05 23:26:50Aedes albopictusmissingiNaturalist16514302014-09-30 16:57:39missing28eb1a3f-1c15-4a95-931a-4af90ecb574d2014-10-02 11:47:31Aedes albopictus (Skuse, 1894)missingmissing2014-09-30Marcello Consolo1HUMAN_OBSERVATIONInsectaAnimalia50c9509d-22c7-4a22-a47d-8c48425ef4a7missingStillImage10243333281651430missingmissing30Venetohttp://www.inaturalist.org/observations/905732Aedes2D PointPRESENTArthropodaITObservations2014DipteraSPECIESMarcello Consolo905732Culicidae9
13897Aedes albopictusCC_BY_NC_4_0molluria2022-04-05 22:56:54Aedes albopictusmissingiNaturalist16514302014-09-08 21:27:32missing28eb1a3f-1c15-4a95-931a-4af90ecb574d2014-09-08 19:28:30Aedes albopictus (Skuse, 1894)missing5002014-09-08molluria1HUMAN_OBSERVATIONInsectaAnimalia50c9509d-22c7-4a22-a47d-8c48425ef4a7missingStillImage10242233711651430missingmissing8Cataluñahttp://www.inaturalist.org/observations/867653Aedes2D PointPRESENTArthropodaESObservations2014DipteraSPECIESmolluria867653Culicidae9
13898Aedes albopictusCC_BY_4_0Marcello Consolo2022-04-05 23:20:48Aedes albopictusmissingiNaturalist16514302014-09-01 16:02:18missing28eb1a3f-1c15-4a95-931a-4af90ecb574d2014-09-01 21:17:57Aedes albopictus (Skuse, 1894)missingmissing2014-09-01Marcello Consolo1HUMAN_OBSERVATIONInsectaAnimalia50c9509d-22c7-4a22-a47d-8c48425ef4a7missingStillImage10242196201651430missingmissing1Venetohttp://www.inaturalist.org/observations/857721Aedes2D PointPRESENTArthropodaITObservations2014DipteraSPECIESMarcello Consolo857721Culicidae9
13899Aedes albopictusCC_BY_4_0missing2022-02-24 22:31:39Aedes albopictusmissingnaturgucker16514302012-06-16 00:00:00missingbb646dff-a905-4403-a49b-6d378c2cf0d9missingAedes albopictus (Skuse, 1894)Bischweier2502012-06-16missing1HUMAN_OBSERVATIONInsectaAnimalia6ac3f774-d9fb-4796-b3e9-92bf6c81c084missingmissing9202403161651430COORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS84missing16missingmissingAedes2D PointPRESENTArthropodaDEnaturgucker2012DipteraSPECIES-430290170481639899Culicidae6
13900Aedes albopictusCC_BY_4_0missing2022-02-24 22:32:57Aedes albopictusmissingnaturgucker16514302007-05-12 00:00:00missingbb646dff-a905-4403-a49b-6d378c2cf0d9missingAedes albopictus (Skuse, 1894)Bischweier2502007-05-12missing1HUMAN_OBSERVATIONInsectaAnimalia6ac3f774-d9fb-4796-b3e9-92bf6c81c084missingmissing9202356261651430COORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS84missing12missingmissingAedes2D PointPRESENTArthropodaDEnaturgucker2007DipteraSPECIES-430290170-470102427Culicidae5
13901Aedes albopictusCC_BY_4_0Marcello Consolo2022-04-05 23:27:15Aedes albopictusmissingiNaturalist16514302012-09-23 00:43:47missing28eb1a3f-1c15-4a95-931a-4af90ecb574d2013-05-07 15:46:38Aedes albopictus (Skuse, 1894)missingmissing2012-09-23Marcello Consolo1HUMAN_OBSERVATIONInsectaAnimalia50c9509d-22c7-4a22-a47d-8c48425ef4a7missingmissing8911488471651430missingmissing23Venetohttp://www.inaturalist.org/observations/258032Aedes2D PointPRESENTArthropodaITObservations2012DipteraSPECIESMarcello Consolo258032Culicidae9
13902Aedes albopictusCC_BY_4_0Marcello Consolo2022-04-05 22:56:55Aedes albopictusmissingiNaturalist16514302013-10-18 17:39:28missing28eb1a3f-1c15-4a95-931a-4af90ecb574d2013-10-27 21:08:54Aedes albopictus (Skuse, 1894)missing12013-10-18Marcello Consolo1HUMAN_OBSERVATIONInsectaAnimalia50c9509d-22c7-4a22-a47d-8c48425ef4a7missingStillImage8910289881651430missingmissing18Venetohttp://www.inaturalist.org/observations/441906Aedes2D PointPRESENTArthropodaITObservations2013DipteraSPECIESMarcello Consolo441906Culicidae10
13903Aedes (Stegomyia) albopictusCC_BY_4_0missing2022-02-28 13:59:54Aedes albopictusmissingMCNB16514302010-08-20 00:00:00missinge8eada63-4a33-44aa-b2fd-4f71efb222a02010-08-21 00:00:00Aedes albopictus (Skuse, 1894)missing8633.082010-08-20Mederos López, Jorge Luis1PRESERVED_SPECIMENInsectaAnimalia7a498826-f762-11e1-a439-00145eb45e9amissingmissing7686464531651430OCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT;COLLECTION_MATCH_NONE;INSTITUTION_MATCH_FUZZY28020BarcelonaMCNB:MCNB-Art:MZB 2010-1153Aedes2D PointPRESENTArthropodaESMCNB-Art2010DipteraSPECIESMederos López, Jorge LuisMZB 2010-1153Culicidae8

GeoInterface¶

It might be unclear one can do with all these different types of tables and geometries. Many packages define their own Point like objects, and at first sight, that might make combining packages difficult.

In [23]:
geodataf_geom = df.geom[1]
Out[23]:
Geometry: POINT (3.206186 41.977133)
In [24]:
?geodataf_geom
search: geodataf_geom

Out[24]:

No documentation found.

geodataf_geom is of type ArchGDAL.IGeometry{ArchGDAL.wkbPoint}.

Summary¶

mutable struct ArchGDAL.IGeometry{ArchGDAL.wkbPoint}

Fields¶

ptr :: Ptr{Nothing}

Supertype Hierarchy¶

ArchGDAL.IGeometry{ArchGDAL.wkbPoint} <: ArchGDAL.AbstractGeometry{ArchGDAL.wkbPoint} <: Any

Similarly, we have the Point from the GeoJSON we read earlier.

In [25]:
geojson_geom = first(fcg);
In [26]:
?geojson_geom
search: geojson_geom

Out[26]:

No documentation found.

geojson_geom is of type GeoJSON.Point{2, Float32}.

Summary¶

struct GeoJSON.Point{2, Float32}

Fields¶

bbox        :: Union{Nothing, Vector{Float32}}
coordinates :: Union{Nothing, Tuple{Float32, Float32}}

Supertype Hierarchy¶

GeoJSON.Point{2, Float32} <: GeoJSON.AbstractGeometry{2, Float32} <: GeoJSON.GeoJSONT{2, Float32} <: Any
In [27]:
Pkg.add("Tables")
using Tables
   Resolving package versions...
  No Changes to `~/code/Project.toml`
  No Changes to `~/code/Manifest.toml`

Interfaces¶

While not originally designed in base Julia, multiple dispatch has lead to the implementation of traits. That is, a property of type that we can dispatch on. In such a way, we can build interfaces for common objects in Julia. The most implemented is probably either the Array interface, or the Tables interface.


Tables.jl defines several functions that one has to implement on their own table-like type. These include the basic istable (by default false for anything), which if it returns true for a type, one expects that columns also works on it.

In [28]:
Tables.istable(df)
Out[28]:
true
In [29]:
Tables.columns(df)[1]  # first column of the DataFrame (from DataFrames.jl).
Out[29]:
13903-element Vector{ArchGDAL.IGeometry{ArchGDAL.wkbPoint}}:
 Geometry: POINT (3.206186 41.977133)
 Geometry: POINT (-0.349167 43.306944)
 Geometry: POINT (4.863264 45.796704)
 Geometry: POINT (-0.647022 38.130955)
 Geometry: POINT (12.725833 42.136389)
 Geometry: POINT (29.039686 41.233929)
 Geometry: POINT (15.88896 45.81166)
 Geometry: POINT (12.731667 42.150556)
 Geometry: POINT (2.04 41.525)
 Geometry: POINT (20.000187 39.873289)
 Geometry: POINT (12.818611 42.131944)
 Geometry: POINT (2.620506 39.546583)
 Geometry: POINT (-2.895006 43.247069)
 ⋮
 Geometry: POINT (26.53 41.3)
 Geometry: POINT (19.4 42.7)
 Geometry: POINT (11.262063 43.778973)
 Geometry: POINT (2.759273 41.693739)
 Geometry: POINT (11.939499 45.39915)
 Geometry: POINT (1.72644 41.22143)
 Geometry: POINT (11.939499 45.39915)
 Geometry: POINT (8.273545 48.842892)
 Geometry: POINT (8.273545 48.842892)
 Geometry: POINT (11.939381 45.399271)
 Geometry: POINT (11.939481 45.399232)
 Geometry: POINT (2.1529 41.3937)

Similarly, other I/O packages can just accept your table and try to write it:

In [30]:
Pkg.add("CSV")
using CSV
CSV.write("test.csv", df)
readlines("test.csv")[2]  # geometry was converted by string, which is probably not what you want
   Resolving package versions...
  No Changes to `~/code/Project.toml`
  No Changes to `~/code/Manifest.toml`
Out[30]:
"Geometry: POINT (3.206186 41.977133),3.723517781e9,8a863029-f435-446a-821e-275f4f641165,https://observation.org/observation/226030224,Animalia,Arthropoda,Insecta,Diptera,Culicidae,Aedes,Aedes albopictus,,SPECIES,\"Aedes albopictus (Skuse, 1894)\",Aedes albopictus,,ES,Spain" ⋯ 45 bytes ⋯ "-6b805d26fc5f,43.0,,,,,,2021-09-21 00:00:00,21.0,9.0,2021.0,1.65143e6,1.65143e6,HUMAN_OBSERVATION,,Observations,OBS.226030224,,,,CC_BY_NC_4_0,Stichting Observation International,,,,2022-03-24 21:07:39,StillImage,OCCURRENCE_STATUS_INFERRED_FROM_INDIVIDUAL_COUNT,2021-09-21"

The GeoInterface.jl package describe a set of traits based on the Simple Features standard (SF) for geospatial vector data, including the SQL/MM extension with support for circular geometry. Using these traits, it should be easy to parse, serialize and use different geometries in the Julia ecosystem, without knowing the specifics of each individual package. In that regard it is similar to Tables.jl, but for geometries instead of tables.

In [31]:
using GeoInterface
In [32]:
GeoInterface.isgeometry(geodataf_geom)  # from the geopackage, based on ArchGDAL
Out[32]:
true
In [33]:
GeoInterface.isgeometry(geojson_geom)  # from GeoJSON
Out[33]:
true
In [34]:
GeoInterface.geomtrait(geodataf_geom)
Out[34]:
PointTrait()
In [35]:
GeoInterface.ncoord(geodataf_geom)
Out[35]:
2
In [36]:
GeoInterface.coordinates(geodataf_geom)
Out[36]:
2-element Vector{Float64}:
  3.206186
 41.977133
In [37]:
GeoInterface.coordinates(geojson_geom)
Out[37]:
(3.206186f0, 41.977135f0)

With the above interface, we can reconstruct geometries as other types. Packages that implement convert make this easy, as I also don't know how to construct a custom Point like type in ArchGDAL (createpoint).

In [38]:
cg = GeoInterface.convert(ArchGDAL, geojson_geom)  # convert GeoJSON point to ArchGDAL point
Out[38]:
Geometry: POINT (3.20618605613708 41.9771347045898)
In [39]:
typeof(cg)
Out[39]:
ArchGDAL.IGeometry{ArchGDAL.wkbPoint}