Repository 'ecoregion_eco_map'
hg clone https://toolshed.g2.bx.psu.edu/repos/ecology/ecoregion_eco_map

Changeset 0:3d750279158b (2023-10-18)
Next changeset 1:b38b954b92b9 (2024-01-24)
Commit message:
planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/master/tools/Ecoregionalization_workflow commit 2a2ae892fa2dbc1eff9c6a59c3ad8f3c27c1c78d
added:
brt.R
cluster_ceamarc.R
crea_carte_G.R
eco_map.xml
nb_clust_G.R
recup_liste_taxon.R
test-data/1_brts_pred_ceamarc.txt
test-data/Data.bio_table.tsv
test-data/Data_to_cluster.tsv
test-data/List_of_taxa.txt
test-data/List_of_taxa_clean.txt
test-data/SIH_index_plot.png
test-data/Summary_of_taxa_model.csv
test-data/ceamarc_env.csv
test-data/cnidaria_filtered.csv
test-data/ecoregions.png
test-data/points_clus.txt
b
diff -r 000000000000 -r 3d750279158b brt.R
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/brt.R Wed Oct 18 09:58:34 2023 +0000
[
@@ -0,0 +1,109 @@
+#16/02/2023
+## Analyse BRT data Ceamarc
+
+### Clean environment 
+rm(list = ls(all.names = TRUE))
+options(warn=-1)
+
+### load packages
+
+library(dismo, warn.conflicts = FALSE)
+library(gbm, warn.conflicts = FALSE)
+library(ggplot2, warn.conflicts = FALSE)
+
+
+#load arguments
+args = commandArgs(trailingOnly=TRUE) 
+if (length(args)==0)
+{
+    stop("This tool needs at least one argument")
+}else{
+    enviro <- args[1]
+    species_files <- args[2]
+    abio_para <- args[3]
+}
+
+### load data
+
+env = read.table(enviro, header = TRUE, dec = ".", na.strings = "-9999")
+pred.vars = strsplit(abio_para, ",")[[1]] 
+data_files = strsplit(species_files,",")
+
+#environemental parameters
+#Carbo,Grav,Maxbearing,Maxmagnit,Meancurmag,Meansal,Meantheta,Mud,Prof,Rugosity,Sand,Seaice_prod,Sili,Slope,Standcurmag,Standsal,Standtheta
+
+#Load functions
+
+make.brt <- function(spe,data,pred.vars,env,nb_file){
+   brt_step <- gbm.step(data= data, gbm.x = pred.vars, gbm.y = spe, family = "bernoulli", tree.complexity = 2, learning.rate = 0.0001,max.trees = 10000,plot.main = F)
+   #plot
+   if (is.null(brt_step)==FALSE){
+     pdf(file = paste("BRT-",spe,".pdf"))
+     gbm.plot(brt_step, write.title = T,show.contrib = T, y.label = "fitted function",plot.layout = c(3,3))
+     dev.off()
+     #total deviance explained as (Leathwick et al., 2006)
+     total_deviance <- brt_step$self.statistics$mean.null
+     cross_validated_residual_deviance <- brt_step$cv.statistics$deviance.mean
+     total_deviance_explained <- (total_deviance - cross_validated_residual_deviance)/total_deviance
+     #Validation file
+     valid = cbind(spe,brt_step$cv.statistics$discrimination.mean,brt_step$gbm.call$tree.complexity,total_deviance_explained)
+     write.table(valid, paste(nb_file,"_brts_validation_ceamarc.tsv",sep=""), quote=FALSE, dec=".",sep="\t" ,row.names=F, col.names=F,append = T)}
+   
+   return(brt_step)
+   }
+
+make.prediction.brt <- function(brt_step){
+  #predictions
+  preds <- predict.gbm(brt_step,env,n.trees=brt_step$gbm.call$best.trees, type="response")
+  preds <- as.data.frame(cbind(env$lat,env$long,preds))
+  colnames(preds) <- c("lat","long","Prediction.index")
+  #carto
+  ggplot()+
+    geom_raster(data = preds , aes(x = long, y = lat, fill = Prediction.index))+
+    geom_raster(data = preds , aes(x = long, y = lat, alpha = Prediction.index))+
+    scale_alpha(range = c(0,1), guide = "none")+
+    scale_fill_viridis_c(
+      alpha = 1,
+      begin = 0,
+      end = 1,
+      direction = -1,
+      option = "D",
+      values = NULL,
+      space = "Lab",
+      na.value = "grey50",
+      guide = "colourbar",
+      aesthetics = "fill")+
+    xlab("Longitude") + ylab("Latitude")+ ggtitle(paste(spe,"Plot of BRT predictions"))+
+    theme(plot.title = element_text(size = 10))+
+    theme(axis.title.y = element_text(size = 10))+
+    theme(axis.title.x = element_text(size = 10))+
+    theme(axis.text.y = element_text(size = 10))+
+    theme(axis.text.x = element_text(size = 10))+
+    theme(legend.text = element_text(size = 10))+
+    theme(legend.title = element_text(size = 10))+ 
+    coord_quickmap()
+  output_directory <- ggsave(paste("BRT-",spe,"_pred_plot.png"))
+  
+  #Write prediction in a file
+  preds <- cbind(preds,spe)
+  write.table(preds, paste(nb_file,"_brts_pred_ceamarc.txt",sep=""), quote=FALSE, dec=".", row.names=F, col.names=T,append = T)
+}
+
+#### RUN BRT ####
+nb_file = 0
+
+for (file in data_files[[1]]) {
+  species_data <- read.table(file, dec = ",", sep = ";", header = TRUE, na.strings = "na", colClasses = "numeric")
+  nb_file = nb_file + 1
+  `%!in%` <- Negate(`%in%`)
+  sp = list()
+  for (n in names(species_data)) {
+    if (n %!in% names(env) && n != 'station'){
+       sp = cbind(sp,n)
+    }
+  }
+  
+  for (spe in sp){
+   try(make.prediction.brt(make.brt(spe,species_data,pred.vars,env,nb_file)))
+   }
+}
b
diff -r 000000000000 -r 3d750279158b cluster_ceamarc.R
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cluster_ceamarc.R Wed Oct 18 09:58:34 2023 +0000
[
@@ -0,0 +1,52 @@
+##13/04/2023
+##Seguineau Pauline
+### Clustering with Clara algorithm
+
+#load library 
+library(cluster)
+library(dplyr)
+library(tidyverse)
+
+#load arguments
+args = commandArgs(trailingOnly=TRUE) 
+if (length(args)==0)
+{
+    stop("This tool needs at least one argument")
+}else{
+    data <- args[1]
+    enviro <- args[2]
+    data.bio <- args[3]
+    k <- as.numeric(args[4])
+    metric <- args[5]
+    sample <- as.numeric(args[6])
+}
+
+#load data 
+env.data <- read.table(enviro, header=TRUE, sep=" ",dec = ".", na.strings = "-9999.00")
+data.bio <- read.table(data.bio, header=TRUE, sep="\t")
+test3 <- read.table(data, header = TRUE, sep="\t") 
+
+######################################################################################################
+#Make clustering
+
+k <- k  #number of clusters
+test5 <- clara(test3, k, metric = metric,  samples = sample, sampsize = min(nrow(test3), (nrow(data.bio)/nrow(test3))+2*k))
+
+#######################################################################################################
+#save results
+
+png("sih.png")
+plot(silhouette(test5))
+dev.off()
+
+clus <- cbind(data.bio[1:nrow(test3), 1:2],test5$clustering)
+names(clus) <- c("lat", "long", "cluster")
+clus <- cbind(clus,test3,env.data[,3:19])
+
+write.table(clus[1:3], file = "points_clus.txt",quote = FALSE, row.names = FALSE)
+write.table(clus, file = "clus.txt",quote = FALSE, row.names = FALSE)
+
+
+
+
+
b
diff -r 000000000000 -r 3d750279158b crea_carte_G.R
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/crea_carte_G.R Wed Oct 18 09:58:34 2023 +0000
[
@@ -0,0 +1,38 @@
+#Author : Seguineau Pauline
+
+
+#Create a map from cluster
+
+library(sf)
+library(tmap)
+library(dplyr)
+
+args = commandArgs(trailingOnly=TRUE) 
+if (length(args)==0)
+{
+    stop("This tool needs at least one argument")
+}else{
+    data <- args[1]
+}
+
+clus <- read.table(data, header=TRUE, na.strings = "na")
+
+#tmap method
+
+sf_data <- st_as_sf(clus, coords = c("long", "lat"), crs =4326)
+
+grouped_data <- sf_data %>%
+  group_by(cluster) %>%
+  summarize()
+
+map <- tm_shape(grouped_data) + 
+  tm_dots(col = "cluster", palette = "Accent", size = 0.1, title = "écorégions")+
+  tm_scale_bar(position = c("right","top"))+
+  tm_compass(position = c("right","top"))+
+  tm_layout(frame = FALSE,legend.position = c("left","bottom"))+
+  tm_xlab("Longitude")+
+  tm_ylab("Latitude")+
+  tm_grid(alpha = 0.2)
+
+#Save the map 
+tmap_save(map, "ecoregions.png")
b
diff -r 000000000000 -r 3d750279158b eco_map.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/eco_map.xml Wed Oct 18 09:58:34 2023 +0000
[
@@ -0,0 +1,52 @@
+<tool id="ecoregion_eco_map" name="EcoMap" version="0.1.0+galaxy0" profile="22.05">
+    <description>Create map from cluster to visualize ecoregions</description>
+    <requirements>
+       <requirement type="package" version="4.2.3">r-base</requirement>
+       <requirement type="package" version="3.3">r-tmap</requirement>
+       <requirement type="package" version="1.0_12">r-sf</requirement>
+       <requirement type="package" version="1.1.1">r-dplyr</requirement>
+    </requirements>
+    <command detect_errors="exit_code"><![CDATA[
+        Rscript
+        '$__tool_directory__/crea_carte_G.R'
+        '$cluster'
+        '$output'
+    ]]>
+    </command>
+    <inputs>
+      <param name="cluster" type="data" format="txt" label="Source file (cluster points from previous step)"/>
+    </inputs>
+    <outputs>
+      <data name="output" from_work_dir="ecoregions.png" format="png" label="Map"/>
+    </outputs>
+    <tests>
+        <test>
+            <param name='cluster' value="points_clus.txt"/>
+            <output name='output' value="ecoregions.png"/>
+        </test>
+    </tests>
+    <help><![CDATA[
+==================    
+**What it does ?**
+==================
+
+The clusters obtained in the previous step are projected on a map to obtain the spatial distribution of each ecoregion.
+
+===================         
+**How to use it ?**
+===================
+
+This script takes as input a file containing for each environmental pixel its associated cluster. See example below. The output of this script is a map representing ecoregions.
+
++--------+--------+---------+
+|  lat   | long   | cluster |
++--------+--------+---------+
+| -65.57 | 139.22 |    1    |
++--------+--------+---------+
+| -65.57 | 139.22 |    1    |
++--------+--------+---------+
+|   ...  |  ...   |   ...   |
++--------+--------+---------+
+
+    ]]></help>
+</tool>
b
diff -r 000000000000 -r 3d750279158b nb_clust_G.R
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nb_clust_G.R Wed Oct 18 09:58:34 2023 +0000
[
@@ -0,0 +1,73 @@
+# Script to determine the optimal number of clusters thanks to the optimization of the SIH index and to produce the files needed in the next step of clustering
+
+#load packages
+library(cluster)
+library(dplyr)
+library(tidyverse)
+
+#load arguments
+args = commandArgs(trailingOnly=TRUE) 
+if (length(args)==0)
+{
+    stop("This tool needs at least one argument")
+}else{
+    enviro <- args[1]
+    taxa_list <- args[2]
+    preds <- args[3]
+    max_k <- as.numeric(args[4])
+    metric <- args[5]
+    sample <- as.numeric(args[6])
+}
+
+#load data 
+
+env.data <- read.table(enviro, header = TRUE, dec = ".", na.strings = "-9999.00") 
+
+##List of modelled taxa used for clustering
+tv <- read.table(taxa_list, dec=".", sep=" ", header=F, na.strings = "NA") 
+names(tv) <- c("a")
+
+################Grouping of taxa if multiple prediction files entered ################
+
+data_split = str_split(preds,",")
+data.bio = NULL
+
+for (i in 1:length(data_split[[1]])) {
+data.bio1 <- read.table(data_split[[1]][i], dec=".", sep=" ", header=T, na.strings = "NA")
+data.bio <- rbind(data.bio,data.bio1)
+remove(data.bio1)
+}
+
+names(data.bio) <- c("lat", "long", "pred", "taxon")
+
+#keep selected taxa
+data.bio <- data.bio[which(data.bio$taxon %in% tv$a),]
+
+write.table(data.bio,file="data_bio.tsv",sep="\t",quote=F,row.names=F)
+
+#format data
+
+test3 <- matrix(data.bio$pred , nrow = nrow(env.data),  ncol = nrow(data.bio)/nrow(env.data))
+test3 <- data.frame(test3)
+names(test3) <- unique(data.bio$taxon)
+
+write.table(test3, file="data_to_clus.tsv", sep="\t",quote=F,row.names=F)
+
+#Max number of clusters to test
+max_k <- max_k
+
+# Initialization of vectors to store SIH indices
+sih_values <- rep(0, max_k)
+
+# Calculation of the SIH index for each number of clusters
+for (k in 2:max_k) {
+  # Clara execution
+  clara_res <- clara(test3, k,  metric =metric,  samples = sample, sampsize = min(nrow(test3), (nrow(data.bio)/nrow(test3))+2*k))
+  # Calculation of the SIH index
+  sih_values[k] <- clara_res$silinfo$avg.width
+}
+
+# Plot SIH Index Chart by Number of Clusters
+png("Indices_SIH.png")
+plot(2:max_k, sih_values[2:max_k], type = "b", xlab = "Nombre de clusters", ylab = "Indice SIH")
+dev.off()
b
diff -r 000000000000 -r 3d750279158b recup_liste_taxon.R
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/recup_liste_taxon.R Wed Oct 18 09:58:34 2023 +0000
[
@@ -0,0 +1,93 @@
+#This script allows us to create a file telling us for each taxon if we obtained a BRT model. As well as the list of taxa.
+
+#load packages
+library(dplyr, warn.conflicts = FALSE)
+library(taxonomyCleanr, warn.conflicts = FALSE)
+library(stringr, warn.conflicts = FALSE)

+#load arguments
+args = commandArgs(trailingOnly=TRUE) 
+
+if (length(args)==0){
+    stop("This tool needs at least one argument")
+}else{
+    data <- args[1]
+    preds <- args[2]
+    enviro <- args[3]
+}
+
+env = read.table(enviro, header=T, na.strings = "na")
+occurrence_files = strsplit(data,",")
+preds_files = strsplit(preds,",")
+
+#########functions##########
+
+`%!in%` <- Negate(`%in%`)
+
+have_model = data.frame()
+pres = 0
+
+have.model <- function(taxon_phylum,noms_sp,comptage_sp,brt_phylum){
+  for (tax in taxon_phylum) {
+    if (tax %in% names(noms_sp)){
+      pres = sum(comptage_sp[tax])
+    }
+    if (tax %in% brt_phylum$spe  ) {
+      brt = c(tax,"Yes", pres)
+      have_model = rbind(have_model,brt, make.row.names = F)}
+    else {
+      brt = c(tax,"No", pres)
+      have_model = rbind(have_model,brt, make.row.names = F)}
+  }
+  colnames(have_model) = c("Taxa","Model","Occurences")
+  return(have_model)}
+
+##########Execution########
+brt = NULL
+for (j in 1:length(preds_files[[1]])){
+    brt <- rbind(brt,read.table(preds_files[[1]][j], header = TRUE, na.strings = "na"))
+}
+
+for (i in 1:length(occurrence_files[[1]])) {
+  occurrence <- NULL
+  cmpt <- NULL
+  taxon <- list()
+  
+  occurrence <- read.table(occurrence_files[[1]][i], dec = ",", sep = ";", header = TRUE, na.strings = "na")
+  
+  taxon_names <- names(occurrence)
+  new_taxon <- taxon_names[!(taxon_names %in% names(env)) & taxon_names != "station"]
+  taxon <- c(taxon, new_taxon)
+  
+  cmpt <- occurrence[, new_taxon]
+  cmpt <- as.data.frame(cmpt)
+  
+  have_model <- have.model(taxon, occurrence, cmpt, brt)
+}
+
+#Taxa for which a model was obtained
+have_model2 = subset(have_model, have_model$`Model` != "N")
+have_model3 = subset(have_model, have_model$`Model` != "N")
+
+#Obtain a list of taxa (cleaned) that have obtained a BRT model (file that can be submitted to the match taxa tool of the WoRMS database to obtain their classification and be able to sort duplicates between taxonomic ranks)
+
+have_model2$Taxa <- as.character(trim_taxa(have_model2$Taxa))
+
+#Second clean-up (elimination of all taxa ending in sp1./sp2 etc which represents a duplicate)
+
+have_model2 <- have_model2 %>% filter(!str_ends(Taxa, "sp.1|sp[0-9]"))
+have_model3 <- have_model3 %>% filter(!str_ends(Taxa, "sp.1|sp[0-9]"))
+have_model <- have_model %>% filter(!str_ends(Taxa, "sp.1|sp[0-9]"))
+
+#extraction of the have_model object
+write.csv(have_model,file = "have_model.csv", quote = F, row.names = F)
+
+#getting list of taxa for next if not using worms
+list_taxon = have_model3$Taxa
+write.table(list_taxon, file= "list_taxa.txt", quote = F, row.names = F, col.names = F)
+
+#getting the final list to submit to worms
+liste_taxon = have_model2$Taxa
+write.table(liste_taxon,file = "list_taxa_clean.txt", quote = F, row.names = F, col.names = F)
+
+
b
diff -r 000000000000 -r 3d750279158b test-data/1_brts_pred_ceamarc.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/1_brts_pred_ceamarc.txt Wed Oct 18 09:58:34 2023 +0000
b
@@ -0,0 +1,16 @@
+lat long Prediction.index spe
+-65.57 139.22 0.841029593071458 Actiniaria
+-65.57 139.22 0.84809523959125 Actiniaria
+-65.57 139.23 0.84593837029871 Actiniaria
+-65.57 139.24 0.845795319302531 Actiniaria
+-65.57 139.24 0.845803531789338 Actiniaria
+-65.57 139.25 0.838195173926856 Actiniaria
+-65.57 139.26 0.836419710602451 Actiniaria
+-65.57 139.26 0.836029330691246 Actiniaria
+-65.57 139.27 0.835738500636347 Actiniaria
+-65.57 139.28 0.835442888556642 Actiniaria
+-65.57 139.28 0.84289272242705 Actiniaria
+-65.57 139.29 0.843110664350552 Actiniaria
+-65.57 139.3 0.837595245997102 Actiniaria
+-65.57 139.3 0.791165108348526 Actiniaria
+-65.57 139.31 0.790943656953059 Actiniaria
b
diff -r 000000000000 -r 3d750279158b test-data/Data.bio_table.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Data.bio_table.tsv Wed Oct 18 09:58:34 2023 +0000
b
@@ -0,0 +1,16 @@
+lat long pred taxon
+-65.57 139.22 0.841029593071458 Actiniaria
+-65.57 139.22 0.84809523959125 Actiniaria
+-65.57 139.23 0.84593837029871 Actiniaria
+-65.57 139.24 0.845795319302531 Actiniaria
+-65.57 139.24 0.845803531789338 Actiniaria
+-65.57 139.25 0.838195173926856 Actiniaria
+-65.57 139.26 0.836419710602451 Actiniaria
+-65.57 139.26 0.836029330691246 Actiniaria
+-65.57 139.27 0.835738500636347 Actiniaria
+-65.57 139.28 0.835442888556642 Actiniaria
+-65.57 139.28 0.84289272242705 Actiniaria
+-65.57 139.29 0.843110664350552 Actiniaria
+-65.57 139.3 0.837595245997102 Actiniaria
+-65.57 139.3 0.791165108348526 Actiniaria
+-65.57 139.31 0.790943656953059 Actiniaria
b
diff -r 000000000000 -r 3d750279158b test-data/Data_to_cluster.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Data_to_cluster.tsv Wed Oct 18 09:58:34 2023 +0000
b
@@ -0,0 +1,16 @@
+Actiniaria
+0.841029593071458
+0.84809523959125
+0.84593837029871
+0.845795319302531
+0.845803531789338
+0.838195173926856
+0.836419710602451
+0.836029330691246
+0.835738500636347
+0.835442888556642
+0.84289272242705
+0.843110664350552
+0.837595245997102
+0.791165108348526
+0.790943656953059
b
diff -r 000000000000 -r 3d750279158b test-data/List_of_taxa.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/List_of_taxa.txt Wed Oct 18 09:58:34 2023 +0000
b
@@ -0,0 +1,7 @@
+Acanthogorgiidae
+Actiniaria
+Ainigmaptilon_edisto
+Alcyonacea
+Anthozoa
+Thouarella_variabilis
+Thouarella_vulpicauda
b
diff -r 000000000000 -r 3d750279158b test-data/List_of_taxa_clean.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/List_of_taxa_clean.txt Wed Oct 18 09:58:34 2023 +0000
b
@@ -0,0 +1,7 @@
+Acanthogorgiidae
+Actiniaria
+Ainigmaptilon edisto
+Alcyonacea
+Anthozoa
+Thouarella variabilis
+Thouarella vulpicauda
b
diff -r 000000000000 -r 3d750279158b test-data/SIH_index_plot.png
b
Binary file test-data/SIH_index_plot.png has changed
b
diff -r 000000000000 -r 3d750279158b test-data/Summary_of_taxa_model.csv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Summary_of_taxa_model.csv Wed Oct 18 09:58:34 2023 +0000
b
@@ -0,0 +1,8 @@
+Taxa,Model,Occurences
+Acanthogorgiidae,No,0
+Actiniaria,Yes,50
+Ainigmaptilon_edisto,No,2
+Alcyonacea,No,43
+Anthozoa,No,62
+Thouarella_variabilis,No,3
+Thouarella_vulpicauda,No,24
b
diff -r 000000000000 -r 3d750279158b test-data/ceamarc_env.csv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ceamarc_env.csv Wed Oct 18 09:58:34 2023 +0000
b
@@ -0,0 +1,16 @@
+long lat Carbo Grav Maxbearing Maxmagnit Meancurmag Meansal Meantheta Mud Prof Rugosity Sand Seaice_prod Sili Slope Standcurmag Standsal Standtheta long_round lat_round
+139.22 -65.57 0.88 28.59 3.67 0.03 0.03 34.62 -0.13 22.72 -441.00 -9999.00 55.76 0.24 3.27 0.28 0.01 0.01 0.18 139,22 -65,57
+139.22 -65.57 0.88 28.61 3.64 0.02 0.03 34.62 -0.13 22.48 -439.00 -9999.00 55.74 0.24 3.29 0.27 0.01 0.01 0.18 139,22 -65,57
+139.23 -65.57 0.92 28.62 3.59 0.02 0.03 34.62 -0.14 22.25 -438.00 -9999.00 56.28 0.25 3.32 0.22 0.01 0.01 0.19 139,23 -65,57
+139.24 -65.57 0.92 28.63 3.51 0.01 0.03 34.62 -0.14 21.95 -436.00 -9999.00 56.57 0.26 3.30 0.08 0.01 0.01 0.19 139,24 -65,57
+139.24 -65.57 0.92 28.64 3.35 0.01 0.03 34.62 -0.14 21.70 -437.00 -9999.00 56.58 0.26 3.28 0.05 0.01 0.01 0.19 139,24 -65,57
+139.25 -65.57 0.93 28.65 3.00 9.6293305978179e-03 0.03 34.62 -0.15 21.44 -436.00 -9999.00 56.63 0.26 3.26 0.29 0.01 0.01 0.19 139,25 -65,57
+139.26 -65.57 0.93 28.63 2.49 8.71255807578564e-03 0.03 34.62 -0.15 21.11 -432.00 -9999.00 56.67 0.26 3.23 0.43 0.01 0.01 0.19 139,26 -65,57
+139.26 -65.57 0.93 28.64 2.01 0.01 0.03 34.62 -0.16 20.83 -429.00 -9999.00 56.71 0.26 3.21 0.37 0.01 0.01 0.19 139,26 -65,57
+139.27 -65.57 0.94 28.65 1.71 0.01 0.03 34.62 -0.16 20.55 -427.00 -9999.00 56.75 0.26 3.19 0.32 0.01 0.01 0.20 139,27 -65,57
+139.28 -65.57 0.94 28.66 1.54 0.01 0.03 34.62 -0.16 20.21 -424.00 -9999.00 56.80 0.26 3.17 0.28 0.01 0.01 0.20 139,28 -65,57
+139.28 -65.57 0.94 28.67 1.44 0.02 0.03 34.62 -0.17 19.74 -422.00 -9999.00 56.84 0.26 3.14 0.26 0.01 0.01 0.20 139,28 -65,57
+139.29 -65.57 0.94 28.68 1.74 0.01 0.03 34.62 -0.17 20.86 -421.00 -9999.00 56.87 0.26 3.13 0.22 0.01 0.01 0.20 139,29 -65,57
+139.30 -65.57 0.95 28.70 3.46 0.01 0.03 34.62 -0.17 21.30 -420.00 -9999.00 56.91 0.26 3.11 0.32 0.01 0.01 0.20 139,30 -65,57
+139.30 -65.57 0.95 28.71 3.91 0.03 0.03 34.62 -0.18 21.01 -414.00 -9999.00 57.18 0.26 3.09 0.59 0.01 0.01 0.21 139,30 -65,57
+139.31 -65.57 0.96 28.72 4.03 0.05 0.03 34.62 -0.18 20.76 -406.00 -9999.00 57.54 0.26 3.07 0.53 0.01 0.01 0.21 139,31 -65,57
b
diff -r 000000000000 -r 3d750279158b test-data/cnidaria_filtered.csv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/cnidaria_filtered.csv Wed Oct 18 09:58:34 2023 +0000
b
@@ -0,0 +1,64 @@
+station;lat;long;Carbo;Grav;Maxbearing;Maxmagnit;Meancurmag;Meansal;Meantheta;Mud;Prof;Rugosity;Sand;Seaice_prod;Sili;Slope;Standcurmag;Standsal;Standtheta;Acanthogorgiidae;Actiniaria;Ainigmaptilon_edisto;Alcyonacea;Anthozoa;Thouarella_variabilis;Thouarella_vulpicauda
+1;-65,99;142,33;5,51;12,59;2,03;0,16;0,07;34,6;-1,47;29,8;-233;1;56,16;0,11;3,94;0,05;0,03;0,03;0,24;0;1;0;0;1;0;0
+10;-66,33;141,3;3,17;5,31;5,2;0,18;0,08;34,61;-1,35;21,5;-215;1;67,39;0,17;5,8;0,24;0,03;0,02;0,28;0;1;0;1;1;0;0
+11;-66,56;141,29;3,1;3,28;4,93;0,2;0,08;34,65;-1,73;34,89;-192;1;73,13;0,87;4,48;0,71;0,03;0,04;0,24;0;0;0;1;1;0;0
+12;-66,55;140,82;2,78;3,08;3,74;0,34;0,1;34,59;-1,19;25,83;-217;1;68,37;2,62;4,05;2,57;0,06;0,02;0,24;0;1;0;1;1;1;0
+13;-66,15;140,65;2,06;7,62;5,36;0,21;0,09;34,56;-1,04;13,18;-217;1;71,68;0,07;2,89;0,37;0,04;0,02;0,26;0;1;0;0;1;0;0
+14;-66,33;140,67;2,96;3,12;2,42;0,16;0,08;34,54;-1,02;12,15;-171;1;73,16;0,78;1,17;0,08;0,03;0,01;0,22;0;1;0;0;1;0;0
+15;-66,38;139,8;1,06;1,65;1,87;0,14;0,05;34,64;-1,53;69,08;-855;1;48,44;1,43;13,55;2,94;0,03;0,01;0,06;0;1;0;1;1;0;0
+16;-66,34;139,99;1,34;2,78;1,61;0,15;0,05;34,6;-1,12;41,06;-538;1;54,72;1,23;5,97;3,7;0,03;0,00839;0,08;0;1;0;0;1;0;0
+17;-66,17;139,96;1,71;8,13;4,39;0,31;0,12;34,54;-0,96;17,16;-151;1;61,42;0,54;1,99;0,25;0,05;0,02;0,3;0;1;0;1;1;1;0
+18;-66,16;139,65;1,49;7,75;2,24;0,15;0,06;34,59;-1,01;32,71;-432;1;51,4;0,56;3,35;0,42;0,03;0,01;0,26;0;1;0;1;1;0;1
+19;-66,15;139,31;1,18;8,58;5,7;0,12;0,04;34,61;-1,36;47,4;-674;1;46,41;0,34;9,92;0,31;0,02;0,00722;0,09;0;1;0;0;1;0;0
+2;-65,99;141,32;3,3;14,21;5,01;0,16;0,07;34,6;-1,26;14,05;-235;1;67,07;-0,01;2,09;0,13;0,03;0,03;0,32;0;1;1;1;1;0;1
+20;-66;139,99;1,95;20,59;4,98;0,19;0,09;34,56;-1,05;13,25;-192;1;63,46;0,27;1,92;0,21;0,03;0,03;0,26;0;1;0;0;1;0;0
+21;-66;139,64;2,26;18,21;2,85;0,16;0,07;34,58;-1,04;44,81;-277;1;57,14;0,76;5,88;1,66;0,03;0,01;0,26;0;1;0;0;1;0;0
+22;-66;139,31;1,39;19,2;4,87;0,1;0,04;34,6;-1,05;37,84;-476;1;49,4;0,65;7,09;0,25;0,02;0,00884;0,15;0;1;0;1;1;0;0
+26;-66,52;140,02;1,51;1,47;4,4;0,12;0,05;34,6;-1,11;49,11;-247;1;49,52;2,38;10,29;3,16;0,02;0,00984;0,16;0;1;0;0;1;0;0
+27;-66,02;142,74;2,61;11,58;5,42;0,13;0,05;34,64;-1,73;25,07;-440;1;46,97;0,24;2,19;0,23;0,02;0,03;0,17;0;1;0;1;1;0;1
+28;-65,99;143,02;2,15;11,5;5,37;0,14;0,05;34,64;-1,77;39,29;-467;1;38,66;0,24;2,07;0,32;0,02;0,03;0,12;0;1;0;1;1;0;1
+29;-66,02;143,29;1,77;9,98;5,41;0,14;0,05;34,64;-1,78;62,2;-470;1;38,73;0,33;4,81;0,19;0,02;0,03;0,1;0;1;0;1;1;0;1
+3;-65,99;141,98;5,27;14,32;5,31;0,01;0,06;34,6;-1,4;22,84;-245;1;61,04;-0,00886;3,93;0,15;0,03;0,03;0,25;0;1;0;0;1;0;0
+30;-66;143,68;2,06;9,47;5,42;0,15;0,06;34,61;-1,71;54,73;-429;1;41,27;0,39;1,03;0,22;0,03;0,03;0,19;0;1;0;0;1;0;0
+31;-66,55;144,99;1,05;19,55;5,28;0,12;0,03;34,62;-1,73;35,57;-437;1;39,47;5,14;1,77;0,45;0,02;0,03;0,16;0;0;0;1;1;0;1
+34;-66,33;144,34;1,26;6,31;4,92;0,13;0,04;34,63;-1,77;44,96;-455;1;40,49;1,87;2,96;0,39;0,02;0,03;0,12;0;1;0;1;1;0;1
+35;-66,33;144,01;1,2;4,9;2,11;0,12;0,04;34,64;-1,78;49,09;-511;1;39,41;1,54;4,15;0,32;0,02;0,02;0,1;0;1;0;1;1;0;0
+36;-66,32;143,65;1,12;4,29;2,16;0,12;0,04;34,64;-1,79;53,85;-565;1;38,83;1,26;8,68;0,38;0,02;0,02;0,13;0;1;0;1;1;0;1
+37;-66,55;143,31;1,34;4,32;2,02;0,12;0,04;34,66;-1,82;78,15;-820;1;47,92;2,76;13,57;0,26;0,02;0,03;0,11;0;1;0;0;1;0;0
+38;-66,33;143,31;0,82;3,84;2,2;0,1;0,04;34,65;-1,8;84,13;-703;1;41,01;0,98;16,47;0,25;0,02;0,03;0,12;0;1;0;1;1;1;0
+39;-66,56;143,02;1,67;4,11;1,5;0,13;0,05;34,65;-1,8;47,63;-862;1;56,71;2,22;7,3;0,18;0,02;0,02;0,1;0;1;0;0;1;0;0
+40;-66,65;142,98;1,94;3,93;5,42;0,13;0,04;34,63;-1,75;41,4;-598;1;58,72;3,57;5,71;1,57;0,02;0,03;0,12;0;0;0;1;1;0;1
+41;-66,76;142,65;2,67;2,67;0,14;0,15;0,04;34,65;-1,76;38,32;-598;1;62,33;4,43;6,01;4,29;0,02;0,04;0,16;0;0;0;1;1;0;1
+42;-66,87;142,66;2,92;1,71;5,49;0,13;0,04;34,63;-1,72;47,93;-391;1;62,77;8,27;6,89;1,19;0,02;0,05;0,2;0;0;0;1;1;0;1
+43;-66,74;143,33;2;3,28;4,67;0,19;0,06;34,61;-1,74;62,82;-332;1;54,92;7,42;9,35;3,78;0,03;0,05;0,16;0;1;0;1;1;0;0
+45;-66,75;144;2,19;3,12;5,5;0,16;0,04;34,61;-1,8;42,36;-661;1;43,64;7,49;5,95;4,51;0,03;0,02;0,07;0;1;0;1;1;0;1
+46;-66,87;144,1;2,59;1,31;5,89;0,17;0,05;34,59;-1,78;38,87;-561;1;43,42;10,54;4,09;1,16;0,03;0,04;0,14;0;0;0;1;1;0;1
+48;-66,93;144,65;1,59;0,58;5,75;0,21;0,06;34,6;-1,83;73,19;-407;1;40,23;11,89;10,52;5,23;0,03;0,03;0,09;0;1;0;1;1;0;0
+5;-66,32;142,29;3,03;4,93;5,05;0,2;0,1;34,63;-1,61;39,53;-216;1;61,67;0,27;2,63;0,11;0,04;0,02;0,17;0;0;0;1;1;0;1
+50;-66,75;145,27;1,02;5,5;5,49;0,13;0,04;34,64;-1,77;52,4;-596;1;39,8;9,53;4,66;0,23;0,02;0,03;0,1;0;1;0;1;1;0;1
+51;-66,74;145,48;0,95;6,47;5,5;0,2;0,05;34,62;-1,78;49,32;-535;1;40,91;10,66;3,37;0,55;0,03;0,04;0,11;0;1;0;0;1;0;0
+52;-66,55;145,31;1,04;19,26;5,26;0,09;0,03;34,59;-1,67;36,48;-409;1;42,62;6,4;1,12;0,09;0,01;0,03;0,22;0;1;0;0;1;0;0
+53;-66,33;144,66;1,24;6,73;5,36;0,13;0,04;34,61;-1,71;62,77;-420;1;42,45;2,27;3,99;0,17;0,02;0,04;0,18;0;1;0;0;1;0;0
+54;-65,91;144,02;3,17;12,05;5,16;0,15;0,06;34,57;-0,92;31,38;-375;1;46,27;0,41;2,1;2,62;0,02;0,02;0,4;0;1;1;1;1;0;1
+55;-66,33;145,01;1,12;8,85;5,25;0,12;0,04;34,56;-1,68;40,75;-387;1;44,3;3,06;2,2;0,58;0,02;0,03;0,26;0;1;0;1;1;0;1
+56;-66,56;144,67;1,3;16,82;2,34;0,13;0,04;34,65;-1,79;45,94;-582;1;39,22;4,26;3,93;0,38;0,02;0,03;0,1;0;1;0;0;1;0;0
+57;-66,74;145;1,18;5,21;2,42;0,16;0,05;34,65;-1,8;53,42;-646;1;38,62;7,59;7,28;0,68;0,03;0,03;0,09;0;1;0;0;1;0;0
+58;-66,75;144,67;1,28;4,2;2,34;0,18;0,05;34,65;-1,81;79,28;-837;1;34,69;7,08;12,46;0,61;0,03;0,03;0,08;0;1;0;1;1;0;1
+6;-66,32;142,66;1,83;4,69;1,69;0,1;0,08;34,65;-1,74;18,2;-384;1;58,78;0,43;2,05;0,09;0,03;0,02;0,15;0;1;0;1;1;0;0
+60;-66,56;143,93;1,51;7,74;2,05;0,14;0,05;34,65;-1,82;47,04;-799;1;38,88;3,65;7,36;0,94;0,03;0,03;0,09;0;1;0;1;1;0;0
+61;-66,33;142,97;1,15;4,14;5,31;0,13;0,05;34,64;-1,74;52,04;-644;1;49,19;0,67;9,1;0,82;0,02;0,03;0,16;0;1;0;1;1;0;0
+62;-66,15;143,32;1,06;10,88;2,17;0,12;0,04;34,64;-1,76;59,46;-545;1;37,97;0,52;5,25;0,23;0,02;0,02;0,14;0;1;0;1;1;0;0
+63;-65,85;142,98;3,71;20,11;5,24;0,27;0,11;34,61;-1,22;24,73;-423;1;41,04;0,19;1,03;0,56;0,05;0,02;0,44;0;0;0;1;1;0;1
+65;-65,81;143;3,89;21,43;5,23;0,39;0,13;34,61;-0,67;25,78;-777;1;41,24;0,18;1,56;7,69;0,06;0,02;0,33;0;1;0;1;1;0;1
+66;-65,75;143,04;NA;NA;4,48;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;0;0;0;1;1;0;0
+7;-66,55;142,64;2,12;4,31;1,77;0,18;0,07;34,66;-1,75;15,34;-255;1;65,49;1,46;1,38;6,15;0,03;0,03;0,18;0;0;0;0;0;0;0
+70;-66,42;140,52;2,3;2,63;5,35;0,08;0,03;34,64;-1,49;20,33;-1109;1;67,5;1,56;3,67;5,9;0,01;0,01;0,05;0;1;0;0;1;0;0
+71;-66,39;140,48;2,22;2,24;5,27;0,06;0,02;34,62;-1,36;19,67;-768;1;67,65;1,36;3,1;7,04;0,01;0,01;0,04;0;1;0;1;1;0;1
+72;-66,34;140,48;2,18;2,6;2,34;0,09;0,04;34,58;-1,14;17,49;-407;1;67,61;1,01;2,1;2,74;0,01;0,01;0,11;0;1;0;1;1;0;0
+79;-65,7;140,56;1,83;25,43;4,77;0,34;0,16;34,6;-0,94;3,7;-506;1;66,84;0,09;1,91;5,63;0,06;0,02;0,38;0;1;0;1;1;0;1
+8;-66,56;142,33;3,36;3,2;1,96;0,16;0,06;34,68;-1,85;67,67;-374;1;60,65;1,04;11,68;1,03;0,03;0,03;0,1;0;1;0;1;1;0;1
+81;-65,65;140,44;1,42;28,49;4,93;0,3;0,15;34,62;-0,81;3,75;-1193;1;66,73;0,13;1,29;5,59;0,05;0,02;0,32;0;0;0;1;1;0;0
+84;-65,45;139,37;0,98;28,81;1,16;0,06;0,03;34,62;-0,21;17,56;-395;NA;58,04;0,28;2,92;0,29;0,01;0,01;0,22;0;0;0;1;1;0;0
+86;-65,47;139,35;0,96;28,78;2,13;0,00947;0,03;34,62;-0,2;18,67;-398;NA;57,91;0,27;2,96;0,26;0,01;0,01;0,22;0;1;0;1;1;0;0
+87;-65,49;139,33;0,95;28,75;4,01;0,05;0,03;34,62;-0,19;20,03;-400;NA;57,77;0,27;3,02;0,42;0,01;0,01;0,21;0;1;0;0;1;0;0
+9;-66,55;141,99;3,19;3,31;5,38;0,17;0,05;34,68;-1,85;40,51;-357;1;65,13;0,81;6,85;3,19;0,03;0,03;0,1;0;0;0;1;1;0;1
b
diff -r 000000000000 -r 3d750279158b test-data/ecoregions.png
b
Binary file test-data/ecoregions.png has changed
b
diff -r 000000000000 -r 3d750279158b test-data/points_clus.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/points_clus.txt Wed Oct 18 09:58:34 2023 +0000
b
b'@@ -0,0 +1,155824 @@\n+lat long cluster\n+-65.57 139.22 1\n+-65.57 139.22 1\n+-65.57 139.23 1\n+-65.57 139.24 1\n+-65.57 139.24 1\n+-65.57 139.25 1\n+-65.57 139.26 1\n+-65.57 139.26 1\n+-65.57 139.27 1\n+-65.57 139.28 1\n+-65.57 139.28 1\n+-65.57 139.29 1\n+-65.57 139.3 1\n+-65.57 139.3 1\n+-65.57 139.31 1\n+-65.57 139.32 1\n+-65.57 139.32 1\n+-65.57 139.33 1\n+-65.57 139.34 1\n+-65.57 139.34 1\n+-65.57 139.35 1\n+-65.57 139.36 1\n+-65.57 139.36 1\n+-65.57 139.37 1\n+-65.57 139.38 1\n+-65.57 139.38 1\n+-65.57 139.39 1\n+-65.57 139.4 1\n+-65.57 139.4 1\n+-65.57 139.41 1\n+-65.57 139.42 1\n+-65.57 139.42 2\n+-65.57 139.43 2\n+-65.57 139.44 2\n+-65.57 139.44 1\n+-65.57 139.45 1\n+-65.57 139.46 1\n+-65.57 139.46 1\n+-65.57 139.47 1\n+-65.57 139.48 1\n+-65.57 139.48 1\n+-65.57 139.49 1\n+-65.57 139.5 1\n+-65.57 139.5 1\n+-65.57 139.51 1\n+-65.57 139.52 1\n+-65.57 139.52 1\n+-65.57 139.53 1\n+-65.57 139.54 3\n+-65.57 139.54 3\n+-65.57 139.55 3\n+-65.57 139.56 3\n+-65.57 139.56 3\n+-65.57 139.57 3\n+-65.57 139.58 3\n+-65.57 139.58 3\n+-65.57 139.59 3\n+-65.57 139.6 3\n+-65.57 139.6 3\n+-65.57 139.61 3\n+-65.57 139.62 3\n+-65.57 139.62 3\n+-65.57 139.63 3\n+-65.57 139.64 3\n+-65.57 139.64 3\n+-65.57 139.65 3\n+-65.57 139.66 3\n+-65.57 139.66 3\n+-65.57 139.67 3\n+-65.57 139.68 3\n+-65.57 139.68 3\n+-65.57 139.69 3\n+-65.57 139.7 3\n+-65.57 139.7 3\n+-65.57 139.71 3\n+-65.57 139.72 3\n+-65.57 139.72 3\n+-65.57 139.73 3\n+-65.57 139.74 3\n+-65.57 139.74 3\n+-65.57 139.75 3\n+-65.57 139.76 3\n+-65.57 139.76 3\n+-65.57 139.77 3\n+-65.57 139.78 3\n+-65.57 139.78 3\n+-65.57 139.79 3\n+-65.57 139.8 3\n+-65.57 139.8 3\n+-65.57 139.81 3\n+-65.57 139.82 3\n+-65.57 139.82 3\n+-65.57 139.83 3\n+-65.57 139.84 3\n+-65.57 139.84 3\n+-65.57 139.85 3\n+-65.57 139.85 3\n+-65.57 139.86 3\n+-65.57 139.87 3\n+-65.57 139.87 3\n+-65.57 139.88 3\n+-65.57 139.89 3\n+-65.57 139.89 3\n+-65.57 139.9 3\n+-65.57 139.91 3\n+-65.57 139.91 3\n+-65.57 139.92 3\n+-65.57 139.93 3\n+-65.57 139.93 3\n+-65.57 139.94 3\n+-65.57 139.95 3\n+-65.57 139.95 3\n+-65.57 139.96 3\n+-65.57 139.97 3\n+-65.57 139.97 3\n+-65.57 139.98 3\n+-65.57 139.99 3\n+-65.57 139.99 3\n+-65.57 140 3\n+-65.57 140.01 3\n+-65.57 140.01 3\n+-65.57 140.02 3\n+-65.57 140.03 3\n+-65.57 140.03 3\n+-65.57 140.04 3\n+-65.57 140.05 3\n+-65.57 140.05 3\n+-65.57 140.06 3\n+-65.57 140.07 3\n+-65.57 140.07 3\n+-65.57 140.08 3\n+-65.57 140.09 3\n+-65.57 140.09 3\n+-65.57 140.1 3\n+-65.57 140.11 3\n+-65.57 140.11 3\n+-65.57 140.12 3\n+-65.57 140.13 3\n+-65.57 140.13 3\n+-65.57 140.14 3\n+-65.57 140.15 3\n+-65.57 140.15 3\n+-65.57 140.44 3\n+-65.57 140.45 3\n+-65.57 140.45 3\n+-65.57 140.46 3\n+-65.57 140.47 3\n+-65.57 140.47 3\n+-65.57 140.48 3\n+-65.57 140.49 3\n+-65.57 140.49 3\n+-65.57 140.5 3\n+-65.57 140.51 3\n+-65.57 140.51 3\n+-65.57 140.52 3\n+-65.57 140.53 3\n+-65.57 140.53 3\n+-65.57 140.54 3\n+-65.57 140.55 3\n+-65.57 140.55 3\n+-65.57 140.56 3\n+-65.57 140.57 3\n+-65.57 140.57 3\n+-65.57 140.58 3\n+-65.57 140.59 3\n+-65.57 140.59 3\n+-65.57 140.6 3\n+-65.57 140.61 3\n+-65.57 140.61 3\n+-65.57 140.62 3\n+-65.57 140.63 3\n+-65.57 140.63 3\n+-65.57 140.64 3\n+-65.57 140.65 3\n+-65.57 140.65 3\n+-65.57 140.66 3\n+-65.57 140.67 3\n+-65.57 140.67 3\n+-65.57 140.68 3\n+-65.57 140.69 3\n+-65.57 140.69 3\n+-65.57 140.7 3\n+-65.57 140.71 3\n+-65.57 140.71 3\n+-65.57 140.72 3\n+-65.57 140.73 3\n+-65.57 140.73 3\n+-65.57 140.74 3\n+-65.57 140.75 3\n+-65.57 140.75 3\n+-65.57 140.76 3\n+-65.57 140.76 3\n+-65.57 140.77 3\n+-65.57 140.78 3\n+-65.57 140.78 3\n+-65.57 140.79 3\n+-65.57 140.8 3\n+-65.57 140.8 3\n+-65.57 140.81 3\n+-65.57 140.82 3\n+-65.57 140.82 3\n+-65.57 140.83 3\n+-65.57 140.84 3\n+-65.57 140.84 3\n+-65.57 140.85 3\n+-65.57 140.86 3\n+-65.57 140.86 3\n+-65.57 140.92 3\n+-65.57 140.93 3\n+-65.57 140.94 3\n+-65.57 140.94 3\n+-65.57 140.95 3\n+-65.57 140.96 3\n+-65.57 140.96 3\n+-65.57 140.97 3\n+-65.57 140.98 3\n+-65.57 140.98 3\n+-65.57 140.99 3\n+-65.57 141 3\n+-65.57 141.4 3\n+-65.57 141.4 3\n+-65.57 141.41 3\n+-65.57 141.42 3\n+-65.57 141.42 3\n+-65.57 141.43 3\n+-65.57 141.44 3\n+-65.57 141.44 3\n+-65.57 141.45 3\n+-65.57 141.46 3\n+-65.57 141.46 3\n+-65.57 141.47 3\n+-65.57 141.48 3\n+-65.57 141.48 3\n+-65.57 141.49 3\n+-65.57 1'..b' 2\n+-67.01 144.82 1\n+-67.01 144.83 1\n+-67.01 144.84 1\n+-67.01 144.84 1\n+-67.01 144.85 1\n+-67.01 144.86 1\n+-67.01 144.86 1\n+-67.01 144.87 1\n+-67.01 144.88 1\n+-67.01 144.88 1\n+-67.01 144.89 1\n+-67.01 144.9 5\n+-67.01 144.9 5\n+-67.01 144.91 5\n+-67.01 144.92 5\n+-67.01 144.92 5\n+-67.01 144.93 5\n+-67.01 144.94 5\n+-67.01 144.94 5\n+-67.01 144.95 5\n+-67.01 144.96 5\n+-67.01 144.96 5\n+-67.01 144.97 5\n+-67.01 144.98 5\n+-67.01 144.98 5\n+-67.01 144.99 5\n+-67.01 145 5\n+-67.01 145 5\n+-67.01 145.01 5\n+-67.01 145.02 5\n+-67.01 145.02 5\n+-67.01 145.03 5\n+-67.01 145.04 5\n+-67.01 145.04 5\n+-67.01 145.05 5\n+-67.01 145.06 5\n+-67.01 145.06 5\n+-67.01 145.07 5\n+-67.01 145.08 5\n+-67.01 145.08 5\n+-67.01 145.09 5\n+-67.01 145.1 5\n+-67.01 145.1 5\n+-67.01 145.11 5\n+-67.01 145.12 5\n+-67.01 145.18 5\n+-67.01 145.18 5\n+-67.01 145.19 5\n+-67.01 145.2 5\n+-67.01 145.2 5\n+-67.01 145.21 5\n+-67.01 145.22 5\n+-67.01 145.22 5\n+-67.01 145.23 5\n+-67.01 145.24 5\n+-67.01 145.24 5\n+-67.01 145.25 5\n+-67.01 145.25 5\n+-67.01 145.26 5\n+-67.01 145.27 5\n+-67.01 145.27 5\n+-67.01 145.28 5\n+-67.01 145.29 5\n+-67.01 145.29 5\n+-67.01 145.3 5\n+-67.01 145.31 5\n+-67.01 145.31 5\n+-67.01 145.32 5\n+-67.01 145.33 5\n+-67.01 145.33 5\n+-67.01 145.34 5\n+-67.01 145.35 5\n+-67.01 145.35 5\n+-67.01 145.36 5\n+-67.01 145.37 5\n+-67.01 145.37 5\n+-67.01 145.38 5\n+-67.01 145.39 5\n+-67.01 145.39 5\n+-67.01 145.4 5\n+-67.01 145.41 5\n+-67.01 145.41 5\n+-67.01 145.42 5\n+-67.01 145.43 5\n+-67.01 145.43 5\n+-67.01 145.44 5\n+-67.01 145.45 5\n+-67.01 145.45 5\n+-67.01 145.46 5\n+-67.01 145.47 5\n+-67.01 145.47 5\n+-67.01 145.48 5\n+-67.01 145.49 5\n+-67.01 145.49 5\n+-67.01 145.5 5\n+-67.01 145.51 5\n+-67.01 145.51 5\n+-67.01 145.52 5\n+-67.01 145.53 5\n+-67.01 144.01 2\n+-67.01 144.02 1\n+-67.01 144.03 1\n+-67.01 144.03 1\n+-67.01 144.04 1\n+-67.01 144.05 1\n+-67.01 144.05 1\n+-67.01 144.06 1\n+-67.01 144.07 1\n+-67.01 144.07 1\n+-67.01 144.08 1\n+-67.01 144.09 1\n+-67.01 144.09 2\n+-67.01 144.1 2\n+-67.01 144.11 2\n+-67.01 144.11 2\n+-67.01 144.12 2\n+-67.01 144.13 2\n+-67.01 144.13 2\n+-67.01 144.14 2\n+-67.01 144.15 2\n+-67.01 144.15 2\n+-67.01 144.16 2\n+-67.01 144.64 2\n+-67.01 144.65 2\n+-67.01 144.66 2\n+-67.01 144.66 2\n+-67.01 144.68 2\n+-67.01 144.69 2\n+-67.01 144.7 2\n+-67.01 144.7 2\n+-67.01 144.71 2\n+-67.01 144.72 2\n+-67.01 144.72 2\n+-67.01 144.73 2\n+-67.01 144.74 2\n+-67.01 144.74 2\n+-67.01 144.75 2\n+-67.01 144.76 2\n+-67.01 144.76 2\n+-67.01 144.77 2\n+-67.01 144.78 2\n+-67.01 144.78 2\n+-67.01 144.79 2\n+-67.01 144.8 2\n+-67.01 144.8 2\n+-67.01 144.81 2\n+-67.01 144.82 2\n+-67.01 144.82 2\n+-67.01 144.83 1\n+-67.01 144.84 1\n+-67.01 144.84 1\n+-67.01 144.85 1\n+-67.01 144.86 1\n+-67.01 144.86 1\n+-67.01 144.87 1\n+-67.01 144.88 1\n+-67.01 144.88 1\n+-67.01 144.89 1\n+-67.01 144.9 5\n+-67.01 144.9 5\n+-67.01 144.91 5\n+-67.01 144.92 5\n+-67.01 144.92 5\n+-67.01 144.93 5\n+-67.01 144.94 5\n+-67.01 144.94 5\n+-67.01 144.95 5\n+-67.01 144.96 5\n+-67.01 144.96 5\n+-67.01 144.97 5\n+-67.01 144.98 5\n+-67.01 144.98 5\n+-67.01 144.99 5\n+-67.01 145 5\n+-67.01 145 5\n+-67.01 145.01 5\n+-67.01 145.02 5\n+-67.01 145.02 5\n+-67.01 145.03 5\n+-67.01 145.04 5\n+-67.01 145.06 5\n+-67.01 145.06 5\n+-67.01 145.07 5\n+-67.01 145.08 5\n+-67.01 145.08 5\n+-67.01 145.19 5\n+-67.01 145.2 5\n+-67.01 145.2 5\n+-67.01 145.21 5\n+-67.01 145.22 5\n+-67.01 145.22 5\n+-67.01 145.23 5\n+-67.01 145.24 5\n+-67.01 145.24 5\n+-67.01 145.25 5\n+-67.01 145.25 5\n+-67.01 145.26 5\n+-67.01 145.27 5\n+-67.01 145.27 5\n+-67.01 145.28 5\n+-67.01 145.29 5\n+-67.01 145.29 5\n+-67.01 145.3 5\n+-67.01 145.31 5\n+-67.01 145.31 5\n+-67.01 145.32 5\n+-67.01 145.33 5\n+-67.01 145.33 5\n+-67.01 145.34 5\n+-67.01 145.35 5\n+-67.01 145.35 5\n+-67.01 145.36 5\n+-67.01 145.37 5\n+-67.01 145.37 5\n+-67.01 145.38 5\n+-67.01 145.39 5\n+-67.01 145.39 5\n+-67.01 145.4 5\n+-67.01 145.41 5\n+-67.01 145.41 5\n+-67.01 145.42 5\n+-67.01 145.43 5\n+-67.01 145.43 5\n+-67.01 145.44 5\n+-67.01 145.45 5\n+-67.01 145.45 5\n+-67.01 145.46 5\n+-67.01 145.47 5\n+-67.01 145.47 5\n+-67.01 145.48 5\n+-67.01 145.49 5\n+-67.01 145.49 5\n+-67.01 145.5 5\n+-67.01 145.51 5\n+-67.01 145.51 1\n+-67.01 145.52 1\n+-67.01 145.53 1\n'