praseTC=$(unzip -p "$1" tellico.xml | tr -d '\n' | sed -e $'s//<\/entry>\\\n/g' | grep -Pe '^yep" | sed -E 's/(^.*)(.*<\/locality>)(.*$)/\2\1\3/' | sort)
=== Prepinani vrstev ===
Nazvy vrstev musi byt v JS poli kvuli ovladacimu API (skryti/zobrazeni)
var laycon = [vectorLayer,ALL];
...
laycon.push(vrstva);
var controls = {
selector: new OpenLayers.Control.SelectFeature(laycon,{onSelect: createPopup, onUnselect: destroyPopup})
};
map.addControl(controls['selector']);
controls['selector'].activate();
=== Prepnuti viditelnych vrstev ===
function kinchange() {
kinsel=document.getElementById('kin');
kinopt=kinsel.options[kinsel.selectedIndex].text;
for (var i = map.layers.length - 1; i >= 1; i--) {
map.removeLayer(map.layers[i]);
}
map.addLayer(window[kinopt])
}
=== Nastaveni brmlabu do paticky map ===
OpenLayers.Layer.Vector('Overlay',{attribution:'Brmlab'});
=== Umisteni copyrightu ===
OSM maji defaultne copyright nesmyslne odsazeny od spodniho okraje mapy, CSS zmena na nejaky rozumny offset:
.olControlAttribution
{
bottom:0.5em;
}
==== parse_tellico.sh ====
#!/bin/bash
# Parse Tellico database to BioOSM index.htm
# $1 = tellico .tc file
# $2 = "" terminal stderr (default)
# = "html" html marked stderr (for web bioosm)
#
# Print result to /jsonrss/*.json
#
# find ./ -type f -name '*.jpg' -newermt "2023-09-03" -exec mogrify -verbose -layers Dispose -resize 1600\>x1600\> -quality 90% {} +
# echo "14.7345 48.7145" | gdallocationinfo -wgs84 ./cesko_big.tiff
# gdal_translate -of GTiff -a_srs WGS84 -a_ullr 11.6863 50.9745 19.9876 48.3729 ./source.tif ./result.tif
# https://data.geus.dk/egdi/#baslay=baseMapGEUS&extent=3953440,2399890,4757540,2763830&layers=igme5000
#bnds=new OpenLayers.Bounds(11.6863000,48.3729000 ,19.9876000,50.9745000);
#var geoimg = new OpenLayers.Layer.Image("geo","https://brmlab.s0c4.net/bioosm/eusr5000_600dpi_cesko.png", bnds,bnds.getSize(),{numZoomLevels: 20,isBaseLayer:false});
#map.addLayer(geoimg);
#
#
# // vectorLayer.removeFeatures(atol)
# // map.removeLayer(vectorLayer)
#
#
# Creates:
# (to stdout) HTML file with the map and static entries
# ./det/ID.htm details of each and every entry
# ./bioosm.json JSON of all entries
# ./bioosm.rss updated RSS feed
# ./plainlog.htm sorted entries for easy human/alg
#
rm -rfv "./det/*"
mkdir -p "./det"
ICON_animalia="animalia.png"
ICON_bacteria="bacteria.png"
ICON_fungi="fungi.png"
ICON_chromista="chromista.png"
ICON_plantae="plantae.svg"
ICON_plostenkoid="plostenkoid.png"
ICON_protista="protista.png"
ICON_biohazard="biohazard.svg"
json=""
geojson=""
rss=$'\n'
rss+=$'\n'
rss+=$'\n'
rss+=$'Brmlab BioOSM RSS feed \n'
rss+=$'New entries in the BioOSM database \n'
rss+=$'https://bioosm.s0c4.net\n'
rss+=$' \n'
rss+=$' \n'
rss+=$'86400 \n'
errhtml="$2"
# paticka (co, rok, odkaz)
function obioosm () {
r="Welcome to BioOSM! This site is owned and maintained by members of the hackerspace brmlab. See our wiki page for further details
License: CC BY-NC-ND. In case you have any questions, suggestions, please let us know at bioosms0c4.net.
To cite any material (including images) in your publication, please use following format:
Plskova, K., Sacha, M., brmlab. BioOSM"
if [[ "$1" != "" ]]; then
r+=" - $1"
fi
r+=". "
if [[ "$2" != "" ]]; then
r+="$2. "
else
r+="2023. "
fi
if [[ "$3" != "" ]]; then
r+="$3"
else
r+="https://bioosm.s0c4.net"
fi
r+="
"
echo "$r"
}
# HTML fajl per project
function genhtml() {
o=$(obioosm "$1" "" "" | sed -e 's/\//\\\//g') # make "\/" from "/" so sed below is OK
h=$(cat "./__BIOVZOR__.htm" | sed -e "s/__BIOVZOR_TIT__/$1/g" | sed -e "s/__BIOVZOR_CPRT__/$o/g" | sed -e "s/__BIOVZOR_J__/$1/g")
echo "$h" > "./jsonrss/$1.htm"
echo "*** $1 done ***"
}
# Return icon by Regnum
function geticon () {
case "$1" in
"Animalia")
echo "$ICON_animalia";;
"Bacteria")
echo "$ICON_bacteria";;
"Fungi")
echo "$ICON_fungi";;
"Chromista")
echo "$ICON_chromista";;
"Plantae")
echo "$ICON_plantae";;
"Protista")
echo "$ICON_protista";;
*)
echo "$ICON_biohazard";;
esac
}
function safehtml () {
echo "$1" | sed -e 's/#/%23/g' -e "s/'/\'/g" -e 's/"/\"/g' -e 's/\</g' -e 's/>/\>/g' -e 's/^[ ]*//g' -e 's/[ ]*$//g'
}
function getgeo () {
#g=$(echo "$1 $2" | gdallocationinfo -wgs84 ./geo/eusr5000_600dpi_cesko_8b_geo.tif | grep -v 255 | grep -oPe '[0-9]+$')
g=$(echo "$1 $2" | gdallocationinfo -wgs84 ./geo/eusr5000_600dpi_cesko_8b_geo.tif | grep -v 255 | grep -oE '[0-9]+$')
case "$g" in
"1")
echo "Fluvial deposits, sediments";;
"128")
echo "Weathering residues of different rocks, loess";;
"130")
echo "Volcanic rocks";;
"133")
echo "Igneous and metamorphic rocks, Palaeozoic sedimentary rocks, loess";;
"143")
echo "Loess, igneous and metamorphic rocks";;
"144")
echo "Loess, Cretaceous sandstone and marl";;
"147")
echo "Igneous, metamorphic and Palaeozoic sedimentary rocks, loess";;
"148")
echo "Igneous and metamorphic rocks, loess";;
"149")
echo "Igneous and metamorphic rocks, Palaeozoic sedimentary rocks, loess";; # asi fakt stejny jako 133 omg
"150")
echo "Igneous and metamorphic rocks, palaeozoic sedimentary rocks";;
"153")
echo "Sandy and loamy loess, Tertiary sediments, fluvial deposits";;
"205")
echo "Cretaceous and Tertiary flysch, marl, sandstone, limestone";;
*)
echo "";;
esac
}
i=1 # GLOBAL increment must persist multiple spagety() calls; incremented to infinity
# Core function generating entries matching selection criteria (ie Kingdom)
# !!! BEZ ODSAZENI !!!
# $1 = list of entries
# $2 = layer name = JSON filename without suffix
# $3 = icon of the points
function spagety () {
if [[ "$errhtml" == "" ]]; then
>&2 echo "===== $2 ====="
else
>&2 echo "$2
"
fi
bylo="" # Minula pozice
sam="" # HTML samostatneho zaznamu
osam="" # predchozi $sam
spoj="" # HTML had z popisu stejnych pozic
ospoj="" # Predchozi $spoj
ox="" # Old X
oy="" # Old Y
datelog="" # Entries sorted by date for plaintext log
json="var data='{\"version\":\"$(date --rfc-3339=seconds)\",\"fund\":\"$2\",\"arma\":["
geojson='{"type":"FeatureCollection","version":"BIOOSM_'
geojson+="$(date --rfc-3339=seconds)"
geojson+='","features":['
while IFS='' read -r radek || [[ -n "$radek" ]]; do
if [[ "$radek" = "" ]]; then
continue;
fi
entryid=$(echo "$radek" | sed -E 's/^.*.*$/\1/g;t;d')
co=$(echo "$radek" | sed -E 's/^.*(.*)<\/title>.*$/\1/g;t;d')
co=$(safehtml "$co")
obr=$(echo "$radek" | sed -E 's/^.*(.*)<\/image>.*$/\1/g;t;d' | sed -E 's/^.*\///g')
kde=$(echo "$radek" | sed -E 's/^.*(.*)<\/locality>.*$/\1/g;t;d')
kde=$(safehtml "$kde")
kdex=$(echo "$kde" | sed -E 's/^[0-9]+\.[0-9]+[, ]*//g;t;d') # keep second part
kdey=$(echo "$kde" | sed -E 's/[, ]*[0-9]+\.[0-9]+$//g;t;d') # keep first part
kdy=$(echo "$radek" | sed -E 's/^.*(.*)<\/taken-date>.*$/\1/g;t;d' | sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]{4})/\3-\2-\1/g' | sed -E 's/-([0-9])-/-0\1-/g' | sed -E 's/-([0-9])$/-0\1/g')
kdy=$(safehtml "$kdy")
skop_typ=$(echo "$radek" | sed -E 's/^.*(.*)<\/new-field-1>.*$/\1/g;t;d')
skop_typ=$(safehtml "$skop_typ")
skop=$(echo "$radek" | sed -E 's/^.*(.*)<\/microscope>.*$/\1/g;t;d')
skop=$(safehtml "$skop")
imp=$(echo "$radek" | sed -E 's/^.*(.*)<\/new-field-3>.*$/\1/g;t;d')
imp=$(safehtml "$imp")
reg=$(echo "$radek" | sed -E 's/^.*(.*)<\/new-field-4>.*$/\1/g;t;d')
reg=$(safehtml "$reg")
phy=$(echo "$radek" | sed -E 's/^.*(.*)<\/phylum>.*$/\1/g;t;d')
phy=$(safehtml "$phy")
cla=$(echo "$radek" | sed -E 's/^.*(.*)<\/class>.*$/\1/g;t;d')
cla=$(safehtml "$cla")
ord=$(echo "$radek" | sed -E 's/^.*(.*)<\/order>.*$/\1/g;t;d')
ord=$(safehtml "$ord")
fam=$(echo "$radek" | sed -E 's/^.*(.*)<\/family>.*$/\1/g;t;d')
fam=$(safehtml "$fam")
gen=$(echo "$radek" | sed -E 's/^.*(.*)<\/genus>.*$/\1/g;t;d')
gen=$(safehtml "$gen")
spe=$(echo "$radek" | sed -E 's/^.*(.*)<\/species>.*$/\1/g;t;d')
spe=$(safehtml "$spe")
loc=$(echo "$radek" | sed -E 's/^.*(.*)<\/locality---plaintext>.*$/\1/g;t;d')
loc=$(safehtml "$loc")
des=$(echo "$radek" | sed -E 's/^.*(.*)<\/description>.*$/\1/g;t;d')
des=$(safehtml "$des")
vid=$(echo "$radek" | sed -E 's/^.*(.*)<\/videolink>.*$/\1/g;t;d')
vid=$(safehtml "$vid")
bio=$(echo "$radek" | sed -E 's/^.*(.*)<\/biotope>.*$/\1/g;t;d')
bio=$(safehtml "$bio")
eng=$(echo "$radek" | sed -E 's/^.*(.*)<\/enlargement>.*$/\1/g;t;d')
eng=$(safehtml "$eng")
obs=$(echo "$radek" | sed -E 's/^.*(.*)<\/observer>.*$/\1/g;t;d')
obs=$(safehtml "$obs")
lnk=$(echo "$radek" | sed -E 's/^.*(.*)<\/localitylink>.*$/\1/g;t;d')
lnk=$(safehtml "$lnk")
har=$(echo "$radek" | sed -E 's/^.*(.*)<\/harvesting-method>.*$/\1/g;t;d')
den=$(echo "$radek" | sed -E 's/^.*(.*)<\/population-density>.*$/\1/g;t;d')
dur=$(echo "$radek" | sed -E 's/^.*(.*)<\/min>.*$/\1/g;t;d')
lor=$(echo "$radek" | sed -E 's/^.*(.*)<\/locality-reference>.*$/\1/g;t;d')
lrl=$(echo "$radek" | sed -E 's/^.*(.*)<\/locality-reference---link>.*$/\1/g;t;d')
lov=$(echo "$radek" | sed -E 's/^.*(.*)<\/locality---vobrazek>.*$/\1/g;t;d' | sed -E 's/^.*\///g')
lov=$(safehtml "$lov")
cls=$(echo "$radek" | sed -E 's/^.*([0-9]*)<\/cluster>.*$/\1/g;t;d')
mpi=$(echo "$radek" | grep -oe ' yep ')
elv=$(echo "$kdex $kdey" | gdallocationinfo -wgs84 ./elev/cesko_big.tiff | grep "Value" | grep -oe '[0-9]+$')
geo=$(getgeo "$kdex" "$kdey")
gra=$(echo "$radek" | sed -E 's/^.*(.*)<\/grant>.*$/\1/g;t;d')
tem=$(echo "$radek" | sed -E 's/^.*(.*)<\/temperature>.*$/\1/g;t;d')
cnd=$(echo "$radek" | sed -E 's/^.*(.*)<\/conductivity>.*$/\1/g;t;d')
ph=$(echo "$radek" | sed -E 's/^.*(.*)<\/ph>.*$/\1/g;t;d')
kar=$(echo "$radek" | sed -E 's/^.*(.*)<\/karyotype>.*$/\1/g;t;d')
lid=$(echo "$radek" | sed -E 's/^.*(.*)<\/localityid>.*$/\1/g;t;d')
# if [[ "$errhtml" == "" ]]; then
# >&2 echo "$co - $har - $den - $dur - $lor - $lrl - $lov - $elv"
# else
# >&2 echo "$co - $har - $den - $dur - $lor - $lrl - $lov - $elv
"
# fi
# continue;
detid=$(echo "brmlab$co$obr$kde$kdy" | md5sum | grep -oe '[a-zA-Z0-9]*')
if [[ "$kdex" = "" ]]; then
if [[ "$errhtml" == "" ]]; then
>&2 echo -e "\033[31m $lid KDEX '$kde' '$co' \033[0m"
>&2 echo -e "\033[31m $lid RADEK '$radek' \033[0m"
else
>&2 echo "$lid KDEX '$kde' '$co'
"
>&2 echo "$radek
"
fi
fi
zkurvenetellico=$(echo "$obr" | grep -oe '\.[a-zA-Z]*$')
odkurvenyobr=$(echo "$obr" | sed -e 's/%23/#/g')
#if [[ "$zkurvenetellico" = ".jpeg" ]]; then
if [[ ! -f "./img/$odkurvenyobr" ]]; then
if [[ "$gen" != "negative" ]]; then
if [[ "$errhtml" == "" ]]; then
>&2 echo -e "\033[31m $lid OBR $odkurvenyobr $co\033[0m"
else
>&2 echo "$lid OBR $odkurvenyobr $co"
fi
continue;
fi
fi
obr=$(safehtml "$obr")
if [[ "$spe" = "sp." ]]; then
wikisp="https://en.wikipedia.org/wiki/$gen"
else
wikisp="https://en.wikipedia.org/wiki/$gen $spe"
fi
povr=""
povs=""
pov=""
if [[ "$phy" = "Platyhelminthes" ]]; then
povr=$(cat "./povodi_r.json" | ./povodi.py "$kdey" "$kdex")
#povrf=$(echo "$povr" | grep -oPe '^[^ ]*' | tr 'e' 'E')
povrf=$(echo "$povr" | sed -e 's/ .*$//g' | tr 'e' 'E')
povrn=$(echo "$povr" | sed -e 's/^[^ ]* //g')
povs=$(cat "./povodi_s.json" | ./povodi.py "$kdey" "$kdex")
#povsf=$(echo "$povs" | grep -oPe '^[^ ]*' | tr 'e' 'E')
povsf=$(echo "$povs" | sed -e 's/ .*$//g' | tr 'e' 'E')
povsn=$(echo "$povs" | sed -e 's/^[^ ]* //g')
if (( $(echo "$povsf < $povrf" | bc -l) )) ; then
pov="$povsn - $povrn"
else
pov="$povrn"
fi
fi
if [[ "$cls" = "" ]]; then
cls=0
fi
if [[ "$mpi" = "" ]]; then
mpi=""
else
mpi="y"
fi
Tjson="{"
Tjson+=" \"title\":\"$co\"," # qualis
Tjson+=" \"imperium\":\"$imp\","
Tjson+=" \"regnum\":\"$reg\","
Tjson+=" \"phylum\":\"$phy\","
Tjson+=" \"classis\":\"$cla\","
Tjson+=" \"ordo\":\"$ord\","
Tjson+=" \"familia\":\"$fam\","
Tjson+=" \"genus\":\"$gen\","
Tjson+=" \"specie\":\"$spe\","
Tjson+=" \"locality\":\"$kde\"," # locus
Tjson+=" \"x\":\"$kdex\","
Tjson+=" \"y\":\"$kdey\","
Tjson+=" \"locplain\":\"$loc\","
Tjson+=" \"description\":\"$des\"," # depictio
Tjson+=" \"takendate\":\"$kdy\"," # quando
Tjson+=" \"obr\":\"$obr\","
Tjson+=" \"micro\":\"$skop\","
Tjson+=" \"microtyp\":\"$skop_typ\","
Tjson+=" \"videolink\":\"$vid\"," # vid
Tjson+=" \"biotope\":\"$bio\"," # bio
Tjson+=" \"enlargement\":\"$eng\"," # amp
Tjson+=" \"observer\":\"$obs\"," # spec
Tjson+=" \"detid\":\"$detid\","
Tjson+=" \"harvestingmethod\":\"$har\"," # har
Tjson+=" \"populationdensity\":\"$den\"," # den
Tjson+=" \"min\":\"$dur\"," # dur
Tjson+=" \"localityreference\":\"$lor\"," # lor
Tjson+=" \"localityreferencelink\":\"$lrl\"," #lrl
Tjson+=" \"localityvobrazek\":\"$lov\"," # lov
Tjson+=" \"localitylink\":\"$lnk\"," # lnk
Tjson+=" \"cluster\":$cls," # cls
Tjson+=" \"mainpic\":\"$mpi\"," # mpi
Tjson+=" \"pov\":\"$pov\","
Tjson+=" \"elv\":\"$elv\","
Tjson+=" \"geo\":\"$geo\","
Tjson+=" \"temperature\":\"$tem\"," # tem
Tjson+=" \"conductivity\":\"$cnd\"," # cnd
Tjson+=" \"ph\":\"$ph\","
Tjson+=" \"karyotype\":\"$kar\"" # kar # Last without ','
Tjson+="}"
json+="$Tjson,"
geojson+='{"type":"Feature","geometry":{"type":"point","coordinates":['
geojson+="$kdex,$kdey"
geojson+=']},"properties":'
geojson+="$Tjson},"
rss+=$'- \n'
rss+=$'
'"$co"$' \n'
rss+=$' '"$des"$' \n'
rss+=$' http://brmlab.s0c4.net/bioosm/det/'"$detid"$'.htm\n'
rss+=$' '"$detid"$' \n'
rss+=$' '"$kdy"$' \n'
rss+=$' \n'
# Generate detail page
detid=$(echo "brmlab$co$obr$kde$kdy" | md5sum | grep -oe '[a-zA-Z0-9]*')
detpg=""
detpg+=""
detpg+=""
detpg+="Brmlab - BioOSM $co $kde "
detpg+=""
detpg+=""
detpg+=""
detpg+=""
detpg+=""
detpg+=""
detpg+=""
detpg+=""
detpg+=""
if [[ "$cls" != "0" ]]; then
detpg+=""
detpg+=""
fi
detpg+=""
detpg+=""
detpg+="$co (wiki)
"
detpg+=""
if [[ "$imp" != "" ]]; then
detpg+="Domain: $imp
"
fi
if [[ "$reg" != "" ]]; then
detpg+="Kingdom: $reg
"
fi
if [[ "$phy" != "" ]]; then
detpg+="Phylum: $phy
"
fi
if [[ "$cla" != "" ]]; then
detpg+="Class: $cla
"
fi
if [[ "$ord" != "" ]]; then
detpg+="Order: $ord
"
fi
if [[ "$fam" != "" ]]; then
detpg+="Family: $fam
"
fi
if [[ "$gen" != "" ]]; then
detpg+="Genus: $gen
"
fi
if [[ "$spe" != "" ]]; then
detpg+="Species: $spe
"
fi
if [[ "$kar" != "" ]]; then
detpg+="Karyotype: $kar
"
fi
detpg+="
"
if [[ "$kdy" != "" ]]; then
detpg+="Date: $kdy
"
fi
if [[ "$lnk" != "" ]]; then
loc="$loc" # Yes, escaped "
fi
detpg+="Place: $kde ($loc)
"
if [[ "$elv" != "" ]]; then
detpg+="Elevation: $elv m
"
fi
if [[ "$obs" != "" ]]; then
detpg+="Observer: $obs
"
fi
if [[ "$bio" != "" ]]; then
detpg+="Biotope: $bio
"
fi
if [[ "$pov" != "" ]]; then
detpg+="River: $pov
"
fi
if [[ "$geo" != "" ]]; then
detpg+="Bedrock: $geo
"
fi
if [[ "$tem" != "" ]]; then
detpg+="Temperature: $tem °C
"
fi
if [[ "$cnd" != "" ]]; then
detpg+="Conductivity: $cnd mSv
"
fi
if [[ "$ph" != "" ]]; then
detpg+="pH: $ph
"
fi
detpg+=""
if [[ "$skop" != "" ]]; then
detpg+="Microscope: $skop ($skop_typ)
"
fi
detpg+=""
detpg+=""
if [[ "$eng" != "" ]]; then
detpg+="Amplification: $eng
"
fi
detpg+=""
if [[ "$vid" != "" ]]; then
detpg+="Video: $vid
"
fi
if [[ "$har" != "" ]]; then
detpg+="Collecting method: $har
"
fi
if [[ "$den" != "" ]]; then
detpg+="Individuals found: $den
"
fi
if [[ "$dur" != "" ]]; then
detpg+="Duration on stage: $dur
"
fi
if [[ "$lrl" != "" ]]; then
detpg+="Locality reference: $lor
"
elif [[ "$lor" != "" ]]; then
detpg+="Locality reference: $lor
"
fi
detpg+=""
if [[ "$des" != "" ]]; then
detpg+="Description: $des
"
fi
detpg+=""
detpg+="
More on BioOSM map
"
detpg+="
"
lhx=$(echo "$kdex-0.022" | bc)
lhy=$(echo "$kdey-0.010" | bc)
pdx=$(echo "$kdex+0.022" | bc)
pdy=$(echo "$kdey+0.010" | bc)
detpg+=""
detpg+=" "
if [[ "$obr" != "" ]]; then
detpg+=""
detpg+=""
else
if [[ "$vid" != "" ]]; then
detyt=$(echo "$vid" | sed -e 's/youtube.com\/watch?v=/youtube.com\/embed\//g')
detpg+=""
else
if [[ "$gen" == "negative" ]]; then
detpg+=""
else
detpg+=""
fi
fi
fi
if [[ "$lov" != "" ]]; then
detpg+="
"
fi
detpg+="
"
detpg+=$(obioosm "$co" "$quando" "https://brmlab.s0c4.net/bioosm/det/$detid.htm")
detpg+=""
echo "$detpg" > "./det/$detid.htm"
# Plain log of entries
datelog+="$kdy $kde $co
\n"
if [[ "$errhtml" == "" ]]; then
>&2 echo -e "\033[32m$lid $co $obs\033[0m"
else
>&2 echo "$lid $co $obs"
fi
ox="$kdex"
oy="$kdey"
i=$(($i+1))
done <<< $(echo "$1") # Zere parametr spaget, nikoli $1 scriptu !!!
echo -e "$json{}]}" | sed -e "s/^var data='//g" > "./jsonrss/$2.json"
# echo -e "$json{}]}'"
echo -e "$geojson{}]}" > "./jsonrss/geo_$2.geojson"
rss+=$' \n'
rss+=$' \n'
echo "$rss" > "./jsonrss/$2.rss"
} # KONEC FCE SPAGETY
# Sorted unique Kingdoms (to be passed as selection criteria)
#kingdoms=$(unzip -p "$1" tellico.xml | grep -oe '.* ' | sed -E 's/( )*<(\/)?new-field-4>( )*//g' | sort | uniq)
kingdoms=$(unzip -p "$1" tellico.xml | sed -E 's/^.*(.*)<\/new-field-4>.*$/\1/g;t;d' | sort | uniq)
#echo ''
#echo ''
#echo ''
#echo ' '
#echo ' brmlab - BioOSM '
#echo ' '
#echo ' '
#echo ' '
#echo ''
#echo ''
## Generate select
#echo ""
##echo "BioOSM - arma biologica in tuis vicinia
"
#echo "BioOSM - creatures around us
"
#
#ksel=""
#echo "Kingdom: $ksel "
#echo "Phylum: "
#echo "Class: "
#echo "Order: "
#echo "Family: "
#echo "Genus: "
#echo "Species: "
#
#echo "
"
#echo ""
##echo ""
#echo ""
#echo "
"
#echo $(obioosm "" "" "")
#echo ""
#
#echo "'
#echo '' # Must be after JSON
#echo ""
# Create plaintext log
dateloghtm=""
dateloghtm+=""
dateloghtm+=""
dateloghtm+="Brmlab - BioOSM plaintext log "
dateloghtm+=""
datelogsort=$(echo -e "$datelog" | sort -r | uniq)
dateloghtm+="$datelogsort"
dateloghtm+=""
echo "$dateloghtm" > "./plainlog.htm"
==== bioosm.js ====
window.blob=JSON.parse('{}');
window.arma=null;
//
// MAIN LOAD START HERE
// https://web.archive.org/web/20200502112446/http://dev.openlayers.org/releases/OpenLayers-2.13.1/doc/apidocs/files/OpenLayers-js.html
//
//
function getJSONbioosm()
{
url="./bioosm.json";
var request;
if(window.XMLHttpRequest)
request=new XMLHttpRequest();
else
request=new ActiveXObject("Microsoft.XMLHTTP");
request.onreadystatechange=function()
{
if(request.readyState==4)
{
window.blob=JSON.parse(request.responseText);
window.arma=blob.arma;
// Display ONLY platyhelminthes if reguired
pus=document.URL.match(/platyhelminthes=understone/);
console.log(pus);
if(pus)
plostenkoidy();
else
// Else initial load
armageddon()
}
}
request.open("GET","./"+ubermaster+".json",true); // defined in html
request.send();
}
getJSONbioosm();
var stud=JSON.parse('{}');
var vectorLayerDynamic = new OpenLayers.Layer.Vector('Overlay',{attribution:'Brmlab'});
var vectorLayerPonygon = new OpenLayers.Layer.Vector('Overlay',{attribution:'Brmlab'});
map.addLayer(vectorLayerPonygon);
map.addLayer(vectorLayerDynamic);
//map.setLayerZIndex(vectorLayerDynamic,999);
//map.raiseLayer(vectorLayerDynamic,map.layers.length);
var studlay = new OpenLayers.Layer.Vector("Overlay",{attribution:"Brmlab"}); // studanky
map.addLayer(studlay);
var regsel=document.getElementById("reg")
var physel=document.getElementById("phy")
var clasel=document.getElementById("cla")
var ordsel=document.getElementById("ord")
var famsel=document.getElementById("fam")
var gensel=document.getElementById("gen")
var spesel=document.getElementById("spe")
var ICON_animalia="animalia.png"
var ICON_bacteria="bacteria.png"
var ICON_fungi="fungi.png"
var ICON_chromista="chromista.png"
var ICON_plantae="plantae.svg"
var ICON_plostenkoid="plostenkoid.png"
var ICON_protista="protista.png"
var ICON_biohazard="biohazard.svg"
var ICON_studanka="studanka.png"
var ICON_negative="negative.png"
function getJSONstud()
{
url="./stud.json";
var request;
if(window.XMLHttpRequest)
request=new XMLHttpRequest();
else
request=new ActiveXObject("Microsoft.XMLHTTP");
request.onreadystatechange=function()
{
if(request.readyState==4)
{
stud=JSON.parse(request.responseText);
studdraw(stud);
}
}
request.open("GET",url,true);
request.send();
}
function studdraw(sj)
{
studlay.destroyFeatures();
sjs=stud.std;
s=[];
for(i=0;i"+sjs[i].name+""},{'externalGraphic':ICON_studanka,'graphicHeight':24,'graphicWidth':24,'graphicXOffset':-12,'graphicYOffset':-12});
studlay.addFeatures(s[i]);
}
}
function studdrv()
{
box=document.getElementById("studchecker");
if(box.checked)
getJSONstud();
else
studlay.destroyFeatures();
}
// Return icon by Regnum
function geticon (a,i)
{
if(a[i].genus=="negative")
return ICON_negative;
var p=true;
var r=""
if(document.getElementById("reg").value!="ALL")
{
r=document.getElementById("reg").value
p=false;
}
else
{
r=a[i].regnum
for(var e=i;e>=0 && a[e].locality==a[i].locality;e--)
{
if(a[e].phylum!="Platyhelminthes")
p=false;
if(a[e].regnum!=a[i].regnum)
{
r="ALL";
break;
}
}
}
switch (r)
{
case "Animalia":
{
if(p)
return ICON_plostenkoid;
return ICON_animalia;
}
case "Bacteria":
return ICON_bacteria;
case "Fungi":
return ICON_fungi;
case "Chromista":
return ICON_chromista;
case "Plantae":
return ICON_plantae;
case "Protista":
return ICON_protista;
default:
return ICON_biohazard
}
}
function genphy() {
physel.innerHTML=""
clasel.innerHTML=""
ordsel.innerHTML=""
famsel.innerHTML=""
gensel.innerHTML=""
spesel.innerHTML=""
var phyarr=[]
for (var i=0;i"+phyarr[0]+""
continue
}
if(phyarr[i]!=phyarr[i-1])
physel.innerHTML+=""
}
armageddon() // Populate the map with monsters...
}
function gencla() {
clasel.innerHTML=""
ordsel.innerHTML=""
famsel.innerHTML=""
gensel.innerHTML=""
spesel.innerHTML=""
var claarr=[]
for (var i=0;i"+claarr[0]+""
continue
}
if(claarr[i]!=claarr[i-1])
clasel.innerHTML+=""
}
armageddon() // Populate the map with monsters...
}
function genord() {
ordsel.innerHTML=""
famsel.innerHTML=""
gensel.innerHTML=""
spesel.innerHTML=""
var ordarr=[]
for (var i=0;i"+ordarr[0]+""
continue
}
if(ordarr[i]!=ordarr[i-1])
ordsel.innerHTML+=""
}
armageddon() // Populate the map with monsters...
}
function genfam() {
famsel.innerHTML=""
gensel.innerHTML=""
spesel.innerHTML=""
var famarr=[]
for (var i=0;i"+famarr[0]+""
continue
}
if(famarr[i]!=famarr[i-1])
famsel.innerHTML+=""
}
armageddon() // Populate the map with monsters...
}
function gengen() {
gensel.innerHTML=""
spesel.innerHTML=""
var genarr=[]
for (var i=0;i"+genarr[0]+""
continue
}
if(genarr[i]!=genarr[i-1])
gensel.innerHTML+=""
}
//genspe() // ...and here we go
armageddon() // Populate the map with monsters...
}
function genspe()
{
spesel.innerHTML=""
var spearr=[]
for (var i=0;i"+spearr[0]+""
continue
}
if(spearr[i]!=spearr[i-1])
spesel.innerHTML+=""
}
armageddon() // Populate the map with monsters...
}
function armageddon()
{
console.log("a "+window.arma.length);
var speval=document.getElementById("spe").value
var genval=document.getElementById("gen").value
var famval=document.getElementById("fam").value
var ordval=document.getElementById("ord").value
var claval=document.getElementById("cla").value
var phyval=document.getElementById("phy").value
var regval=document.getElementById("reg").value
var a=[]
if(speval!="ALL")
{
for(var i=0;i"
spoj+=''
if(a[i].obr != "")
spoj+=' '
else
spoj+=''
spoj+=""+a[i].title+"
"+a[i].takendate+" "
spoj+=""
ox=a[i].x
oy=a[i].y
continue;
}
switch(a[i].specie)
{
case "sp.":
{
wikisp="https://en.wikipedia.org/wiki/"+a[i].genus
break;
}
case "negative":
case "":
{
wikisp="https://en.wikipedia.org/wiki/Null_result"
break;
}
default:
{
wikisp="https://en.wikipedia.org/wiki/"+a[i].genus+" "+a[i].specie
break;
}
}
// Bud prvni zaznam, nebo zmena pozice
// Predchozi pozice jen 1 zaznam?
if(sam != "")
{
samicon=geticon(a,i-1)
n[i] = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(ox,oy).transform(epsg4326,projectTo),{'description':sam},{'externalGraphic':samicon,'graphicHeight':24,'graphicWidth':24,'graphicXOffset':-12,'graphicYOffset':-12});
vectorLayerDynamic.addFeatures(n[i]);
spoj=""
sam=""
} // ELSE vytvori prazdny radek
// Predchozi pozice vic zaznamu?
if(spoj!="")
{
spojicon=geticon(a,i-1)
n[i] = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(ox,oy).transform(epsg4326,projectTo),{'description':""+spoj+"
"},{'externalGraphic':spojicon,'graphicHeight':24,'graphicWidth':24,'graphicXOffset':-12,'graphicYOffset':-12});
vectorLayerDynamic.addFeatures(n[i]);
spoj=""
sam=""
}
bylo=a[i].locality
spoj=''
if(a[i].obr != "")
spoj+=' '
else
spoj+=''
spoj+=''+a[i].title+'
'+a[i].takendate+' '
spoj+=" "
sam=''
sam+='
'
sam+=''+(a[i].title=="negative"?"Negative observation":a[i].title)+'
'
if(a[i].imperium != "")
sam+='Domain: '+a[i].imperium+'
'
if(a[i].regnum != "")
sam+='Kingdom: '+a[i].regnum+'
'
if(a[i].phylum != "")
sam+='Phylum: '+a[i].phylum+'
'
if(a[i].classis != "")
sam+='Class: '+a[i].classis+'
'
if(a[i].ordo != "")
sam+='Order: '+a[i].ordo+'
'
if(a[i].familia != "")
sam+='Family: '+a[i].familia+'
'
if(a[i].genus != "" && a[i].genus!="negative")
sam+='Genus: '+a[i].genus+'
'
if(a[i].specie != "")
sam+='Species: '+a[i].specie+'
'
if(a[i].biotope != "")
sam+="Biotope: "+a[i].biotope+"
"
if(a[i].pov != "")
sam+="River: "+a[i].pov+"
"
if(a[i].temperature != "")
sam+="Temperature: "+a[i].temperature+" °C
"
if(a[i].pov != "")
sam+="Conductivity: "+a[i].conductivity+" mSv
"
if(a[i].pov != "")
sam+="pH: "+a[i].ph+"
"
if(a[i].takendate != "")
sam+="Date: "+a[i].takendate+"
"
sam+="Location: "+a[i].locality+" ("+a[i].locplain+")
"
if(a[i].observer != "")
sam+="Spectator: "+a[i].observer+"
"
if(a[i].micro != "")
sam+="Microscope: "+a[i].micro+" ("+a[i].microtyp+")
"
if(a[i].enlargement != "")
sam+="Amplification: "+a[i].enlargement+"
"
/* if [[ "$des" != "" ]]; then
# sam="$samDepictio: $des
"
# fi */
//if(a[i].videolink != "")
// sam+='Video: '+a[i].videolink+'
'
sam+=""
ox=a[i].x
oy=a[i].y
} // Konec prochazeni a[]
// Do not forget to print last line when FOR ends!
samicon=geticon(a,i-1)
if(sam == "")
sam=''+spoj+'
'
n[i]=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(a[i-1].x,a[i-1].y).transform(epsg4326,projectTo),{description:"'"+sam+"'"},{externalGraphic:samicon,graphicHeight:24,graphicWidth:24,graphicXOffset:-12,graphicYOffset:-12});
vectorLayerDynamic.addFeatures(n[i]);
} // Konec armageddonu
//var laycon = [vectorLayer,vectorLayerPonygon,vectorLayerDynamic,studlay];
var laycon = [vectorLayer,vectorLayerDynamic,studlay];
var controls = {selector: new OpenLayers.Control.SelectFeature(laycon, { onSelect: createPopup, onUnselect: destroyPopup })};
map.addControl(controls['selector']);
controls['selector'].activate();
function createPopup(feature)
{
feature.popup = new OpenLayers.Popup.FramedCloud('pop',
feature.geometry.getBounds().getCenterLonLat(),
null,
''+feature.attributes.description+'',
null,
false, // Close button?
function() { controls['selector'].unselectAll(); }
);
//feature.popup.closeOnMove = true;
map.addPopup(feature.popup);
}
function destroyPopup(feature) {
feature.popup.destroy();
feature.popup = null;
}
// Vyhledavani
function limit()
{
srch=document.getElementById("srch").value.toLowerCase();
var p=[]
for(var i=0;i=0||
window.arma[i].imperium.toLowerCase().indexOf(srch)>=0||
window.arma[i].regnum.toLowerCase().indexOf(srch)>=0||
window.arma[i].phylum.toLowerCase().indexOf(srch)>=0||
window.arma[i].classis.toLowerCase().indexOf(srch)>=0||
window.arma[i].ordo.toLowerCase().indexOf(srch)>=0||
window.arma[i].familia.toLowerCase().indexOf(srch)>=0||
//window.arma[i].genus.toLowerCase().indexOf(srch)>=0|| // v "qualis"
//window.arma[i].observerie.toLowerCase().indexOf(srch)>=0||
window.arma[i].locplain.toLowerCase().indexOf(srch)>=0||
window.arma[i].description.toLowerCase().indexOf(srch)>=0||
window.arma[i].takendate.toLowerCase().indexOf(srch)>=0||
window.arma[i].micro.toLowerCase().indexOf(srch)>=0||
window.arma[i].microtyp.toLowerCase().indexOf(srch)>=0||
window.arma[i].biotope.toLowerCase().indexOf(srch)>=0||
window.arma[i].pov.toLowerCase().indexOf(srch)>=0)
p.push(arma[i])
}
icongeddon(p)
}
// ====== GEOJSON ======
var metageo=JSON.parse("{}");
var geje=[];
var gejbarva="";
function placegeo(coor,gejbarva)
{
var geja=new Array;
epsg4326 = new OpenLayers.Projection("EPSG:4326"); //WGS 1984 projection
projectTo = map.getProjectionObject();
for(i=0;i#[0-9a-fA-F]*<\/se:SvgParameter/)[0].match(/#[0-9a-fA-F]*/)[0];
getgeo(url,g,tmpc);
//console.log(tmpc);
}
}
request.open("GET",url+s,true);
request.send();
}
function getgeo(url,g,c)
{
var request;
if(window.XMLHttpRequest)
request=new XMLHttpRequest();
else
request=new ActiveXObject("Microsoft.XMLHTTP");
request.overrideMimeType("application/geo+json");
request.onreadystatechange=function()
{
if(request.readyState==4)
{
tmpg=JSON.parse(request.responseText);
for(var e=0;e
==== Springs ====
To be able to better plan routes for collecting planarians, the knowledge of locations of springs seems to be important. So BioOSM can show them! Below is a script to get the locations from OSM XMLs obtainable from [[http://osm.kyblsoft.cz/archiv/]].
#!/bin/bash
# generate BioOSM compatible "springs"
# Usage: studanky.sh osmdump.xml
#
# Download OSM file to be passed as $1
# wget "http://osm.kyblsoft.cz/archiv/czech_republic-2019-11-03.osm.gz"
# gzip -kd ./czech_republic-2019-11-03.osm.gz
#
# Pozor ^^ sezere spoustu rameti
#
osm=$(cat "$1" | sed -e 's//<\/node\'$'\a/g' -e 's//<\/way>\'$'\a/g' -e 's//<\/relation>\'$'\a/g' | tr -d '\n' | tr '\a' '\n' | grep 'v="spring"' | grep 'k="natural"')
json='{"version":"'$(date --rfc-3339=seconds)'","std":['
while IFS='' read -r spr || [[ -n "$spr" ]]; do
n=$(echo "$spr" | grep -oPe 'k="name" v="[^"]*"' | sed -e 's/k="name" v="//g' -e 's/"$//g')
lat=$(echo "$spr" | grep -oPe ' lat="[^"]*"' | sed -e 's/ lat="//g' -e 's/"$//g')
lon=$(echo "$spr" | grep -oPe ' lon="[^"]*"' | sed -e 's/ lon="//g' -e 's/"$//g')
if [ "$lat" = "" ] || [ "$lon" = "" ]; then
continue; # a tak
fi
if [[ "$n" = "" ]]; then
n="inkognito"
>&2 echo -e "\033[34m $lat $lon \033[0m";
fi
json+="{"
json+=" \"name\":\"$n\","
json+=" \"lon\":\"$lon\","
json+=" \"lat\":\"$lat\""
json+="},"
>&2 echo -e "\033[32m $n $lat $lon\033[0m"
done <<< $(echo "$osm")
echo "$json{}]}"
=== LocalityID ===
#!/bin/bash
T=$(mktemp)
unzip -p "$1" tellico.xml | tr -d '\n' | sed -e $'s//<\/entry>\\\n/g' > "$T"
hf=$(cat "$T" | grep -Pe '^.* ' | sed -E 's/( )*<(\/)?taken-date>( )*//g' | sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]{4})/\3-\2-\1/g' | sed -E 's/-([0-9])-/-0\1-/g' | sed -E 's/-([0-9])$/-0\1/g')
l=$(echo "$r" | grep -oe '.* ' | grep -oPe '[0-9]+\.[0-9]+[, ]*[0-9]+\.[0-9]+')
echo "$t@$l"
done <<< $(echo "$1")
}
srt=$(ll "$hf" | sort -u)
uid=$mid
while IFS='' read -r r || [[ -n "$r" ]]; do
l=$(echo "$r" | grep -oPe '@.*$' | tr -d '@')
lid=$(cat "$T" | grep " $l " | grep -oe ' .* ' | grep -oPe '[0-9]+')
if [[ "$lid" = "" ]]; then
sedexp="s/( $l<\/locality> .*yep<\/hasflatworms> )/ \\1 $uid<\/localityid> /g"
#echo "$sedexp"
sed -E "$sedexp" -i "$T"
uid=$(($uid+1))
fi
done <<< $(echo "$srt")
D=$(mktemp -d)
cp -f "$T" "$D/tellico.xml"
zip -j "./micro_new.tc" "$D/tellico.xml"
rm -rfv "$T"
rm -rfv "$D"