Lsjbot använder i skapandet av geografiartiklar ett antal olika algoritmer för att räkna ut olika aspekter av hur landskapet ser ut på den plats den skriver om. På den här sidan beskrivs dessa algoritmer i mer detalj än vad som är rimligt att göra i varje artikel. Frågor och synpunkter kring algoritmerna är hjärtligt välkomna på projektsidan: Användardiskussion:Lsjbot/Projekt alla platser.
Boten kombinerar data från två olika källor i sina beräkningar, dels platsdata från GeoNames, och dels höjddata från Viewfinder Panoramas. Beräkningarna faller under det undantag som finns i WP:Ingen originalforskning#Undantag: "icke-kontroversiella artiklar där icke-kontroversiella beräkningar, sammanfattningar och sammanställningar görs som logisk följd av redovisat källmaterial". Man kan också se det så här: En människa som skriver en geografiartikel kan mycket väl skriva in i artikeln sådant som en människa kan se vid en snabb blick på en karta, utan att bli anklagad för egen forskning, t.ex. "Kungshamn är beläget på en halvö på västkusten strax norr om Lysekil." (ur artikeln Kungshamn). Det boten gör är i grund och botten samma sak, fast "en snabb blick på en karta" sker med andra metoder.
Botkoden i sin helhet finns här: Wikipedia:Projekt DotNetWikiBot Framework/Lsjbot/Make-Geonames. I de olika avsnitten nedan hänvisas till "nyckelmetoder"; detta syftar på den metod i botkoden där kärnan i algoritmen beräknas.
Avstånd mellan platser
redigeraBygger på latitud och longitud för de båda platserna. För avstånd under 1000 km räknas avståndet ut med plangeometri; för större avstånd beräknas storcirkelavstånd. Nyckelmetod: get_distance_latlong
Riktning från en plats till en annan
redigeraAvstånden i rent nord-sydlig riktning (dlat) och rent öst-västlig riktning (dlong) räknas ut var för sig. Om abs(dlat) är minst 4 ggr större än abs(dlon) kallas riktningen nordlig eller sydlig, beroende på tecken. Motsvarande för öst/väst (dlong > 4*dlat). Övriga värden ger riktning nordost/sydost/sydväst/nordväst beroende på vilka tecken dlat och dlong har. Nyckelmetod: get_direction_latlong
Avstånd och riktning till huvudstaden
redigeraAvstånd beräknas enligt #Avstånd mellan platser, och riktning enligt #Riktning från en plats till en annan. Om avståndet i km är mindre än 1.5 + 0.004*huvudstadsbefolkning betraktas platsen som liggande inom huvudstaden. Nyckelmetod: from_capital
Allmänt om höjddata från Viewfinder Panoramas
redigeraHöjddata finns för i princip all fast mark på jorden. Upplösningen horisontellt är 3", vilket är ungefär 90 meter vid ekvatorn. Den höjd som anges kan ses som ett medelvärde inom en sådan 90-meters pixel. Det betyder att höjden för t.ex. en vass bergstopp inte blir höjden för den absolut högsta punkten, utan blir snitthöjden inom den pixel som innefattar bergstoppens koordinater. Den länk som anges i varje artikel går till sajtens huvudsida. Därifrån kan man klicka på länken 3" upptill i mitten. Den leder till en karta, och i kartan klickar man på den plats vars höjddata man vill ha. Det man då får är en zip-fil med ett antal filer i hgt-format som innehåller själva data. Filformatet finns beskrivet långt ner på huvudsidan. Nyckelmetod för att packa upp hgt-filer: get_hgt_array
När boten använder kartdata, så laddar den in ett "kartblad" på 3x3 grader (ca 300x300 km vid ekvatorn, smalare på högre breddgrader) kring den aktuella platsen. Alla beräkningar utförs inom det kartbladet, och leder beräkningen utanför kartan så avbryts den. Det betyder att landformer större än 300x300 km inte kan identifieras. Detta är dock sällan ett problem, det betyder att den hanterar t.ex. sjöar upp till ungefär Vänerns storlek, och större sjöar än så har vi normalt redan artiklar om. Nyckelmetod: get_3x3map
Att identifiera öar, sjöar, och bergskedjor
redigeraI princip samma algoritm används för dessa tre. Höjddata från Viewfinder Panoramas används. Boten börjar med en "såddpunkt" i den pixel som innehåller platsens koordinater. Sedan söker den intilliggande pixlar som uppfyller ett visst villkor, och fortsätter rekursivt tills den inte hittar fler (eller når kartans kant). Resultatet är en markering på kartan som i princip täcker öns eller sjöns form. För öar är villkoret att höjden ska vara större än noll, för sjöar att höjden ska vara lika med såddpunktens höjd (som bör vara sjöns ytnivå). För bergskedjor är det mer komplicerat; boten utgår från en basnivå som sätts i relation både till bergskedjans höjd och till genomsnittshöjden inom kartan. Boten fyller sedan pixlar på samma sätt som för öar, men med villkoret att höjden i en pixel är högre än basnivån. Om det resulterar i en "ö" som håller sig inom kartan och inte innehåller någon annan bergskedja, så är boten nöjd. Annars höjs basnivån och proceduren upprepas. Detta fortsätter tills proceduren lyckas eller basnivån blir högre än bergskedjans höjd.
Därefter är det rättframt att leta igenom GeoNames efter platser inom det markerade området. Den platslistan används sedan för att skriva saker som "X ligger på ön Y" i artiklarna. För sjöar letar boten också efter platser som ligger strax utanför det markerade området, för att skriva att "X ligger vid sjön Y".
Att leta sjöar, öar och bergskedjor på det här sättet tar mycket datortid. Därför görs det i separata körningar i förväg, och boten sparar datafiler med data för alla öar/sjöar/bergskedjor som sedan används i artikelskapandet.
Algoritmen fungerar överlag bra för öar och sjöar. Den har dock några svagheter:
- Den begränsade upplösningen gör att boten ibland inte hittar mycket små öar och sjöar, och arean är opålitlig under ca 0.1 km2.
- Samma begränsade upplösning gör att boten inte "ser" sådant som är smalare än något hundratal meter.
- Två angränsande öar (eller ö och fastland) med mindre än 100 meter vatten emellan kan kopplas ihop till en enda ö. Boten kollar i efterhand så att två öar inte sammanfaller, och tar bort problemfallen. Samma sak kan i princip hända med sjöar, men är mer sällsynt eftersom det bara händer om de ligger på exakt samma höjd.
- Både sjöar och öar kan bli "avsnörda" om ett mycket smalt sund eller näs förbinder två delar av sjön/ön. T.ex. om botens algoritm används på Mälaren blir sjön avskuren vid Kvicksund.
- Eftersom algoritmen för öar utgår från havsytans nivå fungerar den bara för öar i havet. Öar i insjöar får den inte fram ett område för. Däremot kan sjö-algoritmen ofta identifiera vilka öar som ligger i en viss sjö.
- Eftersom algoritmen för öar utgår från havsytans nivå fungerar den inte för öar som Schouwen i Holland, vars areal till stor del ligger under havsnivån.
För bergskedjor fungerar algoritmen för bergsmassiv som är någorlunda fristående och inte alltför stora. För en delkedja i en större bergskedja fungerar metoden dåligt, och ger oftast inget resultat alls.
Nyckelmetoder: check_islands
, make_lakes
, make_ranges
Ett bergs primärfaktor
redigeraPrimärfaktorn för ett berg beräknas med en algoritm där boten utgår från en "såddpunkt" vid bergets koordinater, och markerar den pixel som innehåller såddpunkten. Boten söker sedan igenom alla grannar till den markerade pixeln, och markerar den högsta av dem. Sedan fortsätter den så, markerar den högsta grannen till de dittills markerade pixlarna, tills den stöter på en pixel som är högre än startpunkten. Den lägsta pixel som passerats på vägen är en hyfsad approximation av höjden på den lägsta höjdkurva inom vilken toppen är den högsta, varifrån primärfaktorn beräknas. Nyckelmetod: get_prominence
Ett bergs bredd vid basen
redigeraEfter att primärfaktorberäkningen (se ovan) har identifierat den lägsta höjdkurva inom vilken toppen är den högsta, mäter boten det längsta avståndet mellan två punkter på den höjdkurvan, och kallar detta för bergets bredd vid basen. Nyckelmetod: get_prominence
Terrängen i ett område
redigeraHöjddata från Viewfinder Panoramas används. Boten går igenom alla pixlar inom området, och beräknar dels höjdernas medelvärde, och dels deras varians (och därmed standardavvikelse). Därefter klassificeras terrängen i första hand utifrån variansen. Om variansen är mycket liten kallas området "mycket platt", etc.
- Mycket platt: Varians mindre än 100 (standardavvikelse mindre än 10 meter).
- Platt: Standardavvikelse 10-50 meter.
- Lite kuperad: Standardavvikelse 50-140 meter.
- Kuperad: Standardavvikelse 140-250 meter.
- Lite bergig: Standardavvikelse 250-350 meter.
- Bergig: Standardavvikelse 350-500 meter.
- Mycket bergig: Standardavvikelse mer än 500 meter.
Höjdernas medelvärde används för att identifiera högplatåer (platt terräng på hög höjd).
Hav ignoreras i beräkningen.
Nyckelmetoder: classify_terrain
, get_terrain_type_latlong
Terrängen runt en plats
redigeraBoten beaktar terrängen inom en cirkel med 10 km radie kring platsens koordinater. Den cirkeln delas in i nio delar: en central del inom 2.5 km radie, och åtta "tårtbitar" i den yttre delen. Terrängen i varje del klassificeras enligt #Terrängen i ett område ovan. Om alla nio delarna har samma huvudklassning (platt/kuperad/bergig) får terrängen runt platsen denna klassning. Om det är stor variation i klassningen, eller krånglig fördelning av terrängtyper, kallas terrängen "varierad". Om nästan alla delarna har samma terrängtyp skrivs i artikeln t.ex. "Terrängen runt X är i huvudsak platt, men åt norr är den kuperad." Om det är den centrala delen som är avvikande blir det istället: "...men den allra närmaste omgivningen är kuperad." Om det istället är två terrängtyper som väger jämnt skrivs: "Terrängen runt X är platt åt söder, men åt norr är den kuperad." (den terrängtyp som har flest tårtbitar nämns först).
Nyckelmetoder: terrain_text
, get_terrain_type_latlong
Terrängen på en ö
redigeraDet område som ön upptar räknas fram enligt #Att identifiera öar, sjöar, och bergskedjor. Därefter beräknas terrängen i det området enligt #Terrängen i ett område.
Terrängen i en administrativ enhet
redigeraBeräknas på samma sätt som terrängen runt en plats, men med skillnaden att radien inte är 10 km, utan istället radien på den cirkel som har samma area som den administrativa enheten. För administrativa enheter med någorlunda samlad form (Örebro län) är detta en god approximation, men den kan bli missvisande för enheter som är mycket avlånga eller oregelbundna (Hallands län, Västernorrlands län) och har avvikande terräng utanför gränsen.
Hitta den bergstopp som en plats hänger ihop med
redigeraHöjddata från Viewfinder Panoramas används. Boten börjar med en "såddpunkt" i den pixel som innehåller platsens koordinater. Sedan söker den igenom alla grannar till den markerade pixeln, och markerar den högsta av dem. Sedan fortsätter den så, markerar den högsta grannen till de dittills markerade pixlarna, tills den antingen stöter på en pixel som innehåller en namngiven bergstopp, eller högsta grannpixeln är mer än 10 meter lägre än startpunkten.
Den här beräkningen används på två sätt:
- Utlöpare och liknande som normalt är en del av ett berg. Här beräknas vilket berg de är en del av.
- Bergspass och liknande som normalt ligger mellan två berg. Den här algoritmen körs då två gånger. Först hittas det ena berget, sedan blockeras den delen av kartan och algoritmen körs igen för att hitta det andra berget.
Nyckelmetoder: seek_mountain
, between_mountains
Justera koordinater
redigeraDet är vanligt att avrundningsfel i koordinaterna för ett berg gör att positionen hamnar en bit ifrån högsta punkten. Avrundningen är ofta till hela bågminuter. Boten åtgärdar detta genom att leta efter den topografiskt högsta punkten på ett berg med samma grundalgoritm som i #Hitta den bergstopp som en plats hänger ihop med, söker sig uppåt i terrängen tills den hittar en topp. Om toppen inte är en annan namngiven bergstopp, och ligger högst en nautisk mil från koordinatpunkten utan mellanliggande svackor, flyttas koordinaterna dit. Lsj (diskussion) 17 november 2015 kl. 08.43 (CET)
Närmaste större samhälle
redigeraVad som är "närmaste större samhälle" operationaliseras så här:
- Gå igenom alla samhällen inom en viss radie runt den aktuella platsen (normalt 20 km).
- Hitta det största av dessa samhällen. Låt oss kalla det P1.
- Hitta det närmaste av alla samhällen som har minst tre gånger större befolkning än den aktuella platsen. Låt oss kalla det P2.
- Om den aktuella platsen själv är störst, skriv "X är det största samhället i trakten."
- Annars:
- Om P1 är mer än tre gånger större än P2, skriv att P1 är största samhället i trakten.
- Annars skriv att P2 är största samhället i trakten.