Wikipedia:Projekt Finlands sjöar/skript för att fixa Finlands insjööar

Från Wikipedia

Nedanstående skript har jag/Taxelson utvecklat för att hel- och halvautomatiskt komplettera Lsjbots artiklar om . Skriptet kan antingen laddas med en lista över alla öar i ett visst landskap, och skapar då dels filer för alla artiklar som kunde fixas utan att något konstigt upptäcktes, för att senare laddas upp med AWB, dels en lista med artiklar som behöver handpåläggning.

Vad som görs[redigera | redigera wikitext]

  • Identifiera sjö
  • Identifiera kommun
  • Identifiera ö-polygonen:
    • Om koordinaterna pekar i vattnet kollas om någon ö finns på någon av 8 punkter 7-10 meter ifrån - detta visar sig fånga huvuddelen av öarna med små koordinatfel, och riskerar knappast att identifiera någon annan ö än den avsedda.
    • Om koordinaterna pekar på land, kollas 4 punkter 100 meter ifrån och om minst en pekar i en sjö påstås "ön" vara en halvö.
  • Mäta öns maximala längd och riktningen för den
  • Kolla kommuntillhörighet (och landskap) för ändpunkterna av denna linje (detta fångar många men inte alla öar som ligger över kommungränser.
  • Kategoriserar ön efter kommun och lägger den i Kategori:Öar i insjöar i Finland. Den kategoriserar alltså inte efter sjö, utan detta behöver göras separat i ett senare skede.
  • Ta bort eventuell sjökoppling som gjorts av Lsjbot.
  • Tar bort uppgift om ekonomisk region om mer än en kommun, då skriptet bara håller reda på kommun och landskap.

Material/källor[redigera | redigera wikitext]

  • KML-filer från Lantmäteriverket och SYKE över kommuner och insjöar. Dessa filer har först konverterats till KML med hjälp av QGIS, och sedan bantats, så att dels värdena avrundats till 5 decimaler (meter-noggrannhet) - utom för de allra största sjöarnas strandlinje (inte öar) där 4 decimaler använts, dels de punkter som avviker mindre än 1.5 meter (för kommun och mindre sjöar och alla öar) respektive 8 meter (största sjöarna). Sjöpolygonerna behövs i två uppsättningar, med och utan öar. Skriptet behöver dessutom listor över kommunernas och sjöarnas "rektanglar", med konverteringslistor så att rätt wp-artikel kopplar till rätt sjö respektive kommun-polygon, samt en lista som håller reda på kopplingen mellan kommun och landskap.

Vad som gjorts[redigera | redigera wikitext]

Jag började med att direkt med AWB kategorisera öarna efter först landskap och sedan i vissa fall sjö, utifrån i vilka polygoner dess artikelkoordinaterna inföll. Det var först sedan jag kommit ett långt stycke med det arbetet, och efter hand blev varse behovet av alltfler ersättningssträngar som jag insåg behovet av att utveckla detta skript istället. Jag har nu kört igenom alla (ca 25700) som kunnat identifieras som öar (eller "halvöar") i tillgängliga insjöpolygoner. (ungefärlig ordning):

Det som inte kategoriseras i "Öar i insjöar" är således sådana öar som ligger i havet, i vattendrag, är oidentifierade halvöar, eller annat. Vissa sjöar saknar polygoner, och dessa behöver identifieras. Skriptet kan förhoppningsvis enkelt byggas om för att köras för vattendragsöarna, men det återstår att undersöka... Öar i havet behöver identifieras - om polygoner finns tillgängliga kan skriptet antagligen modifieras även för dessa? Koordinater har korrigerats, antingen (semi)manuellt efter koll på google-maps om det är säkert vilken ö som avses - annars kartplatsen, eller så har de kunnat korrigeras automatiskt om någon av 8 testpunkter 7-10 meter från ursprungskoordinaterna ligger på en ö.

Kända problem
  • Öar som ligger mellan olika sjöpolygoner eller (oftare) mellan en sjö- och en vattendragspolygon kan bli identifierad som halvö. Svårt att identifiera eller lösa automatiskt, och svårt att veta hur omfattande problemet är. Halvöarna borde ha fått en egen kategori...
  • Om flera öar sitter ihop med landförbindelse kommer de att räknas som en och samma ö. Dessa behöver identifieras genom att kolla i vilka fall flera artiklar avser samma ö-polygon. Detta får nog bli nästa del-projekt...

Filen förväntas heta "fiofix.php", hjälpfilerna ligger lite utspridda i min dator, varför sökvägarna behöver korrigeras om det ska köras pånågon annan dator. Undermappen "upload" måste skapas för hand. Jag kör på Windows med XAMPP, där maximala exekveringstiden ställts på många timmar (standard 30-60 sek) och där stora filer accepteras (>1 MB). Filerna laddas sedan upp med AWB enligt en:Wikipedia:AutoWikiBrowser/Create new pages (notera den modifierade .bat-filen på diskussionssidan).

<?PHP
/*

hämta koord och innehåll från $_GET('wp')
hämta kommunlista
hämta sjölista
identifiera kommun
identifiera sjö - om ej:halvö?
identifiera ö (dimension & kommuner i hörn?)

sök och ersätt

3 ingångar: 
1. Om GET[wp] --> enskild artikel, som ska skickas till editeringsfönster för att sparas på wp som ordinarie redigering
2. Om tom ges ett fönster där en lista med artiklar från t.ex petscan kan klistras in
3. Om sådant fönster finns, bearbeta listan och lägg behandlade utan anmärkning i /upload för att kunna laddas upp med AWB, och gör en länklista för övriga "hand.htm" (endast de med fel) och log.htm (alla)

Ett antal filer hämtas internt. I denna kod från den relativa plats de råkar ligga i min dator... För att hitta dem kan man söka efter komandot "file_get_contents" i hela koden. En optimeringsvinst kunde göras om en del av dessa flyttades ut från funktionen "huvudfunk" och gjordes globala istället...


*/

if (isset($_GET['wp'])){
	huvudfunk(str_replace(" ","_",$_GET['wp']));
}
elseif(!isset($_POST['list'])){
	echo "Mata in lista med Lsjbot-artiklar på svwp om finländska öar<br/>"; 
	echo '<form id="listf" name="listf" method="post" action="" enctype="multipart/form-data">';

	echo '<textarea id="list" cols="160" rows="25" style="" lang="sv" dir="ltr" name="list"></textarea>'."\n<br/>\n";
	echo '<input id="kor" name="kor" type="submit" tabindex="5" value="kör" title="kör" />'."\n";
}
else{
	echo "<a target='log' href='log.htm'>log</a> <a target='log' href='hand.htm'>att fixa</a> ";
	skriv("log.htm","</ul><hr/><ul>\n");
	skriv("hand.htm","</ol><hr/><ol>\n");
	$list=preg_replace("/\n[A-ZÅÄÖ]\s/","",$_POST['list']);
	$list=explode("\n",$list);
	for ($i=0;$i<count($list); $i++){
		$li=trim($list[$i]);
		if ($li){
			$a=huvudfunk(str_replace(" ","_",$li));
			echo $rad="<li><a target='wp' href='https://sv.wikipedia.org/wiki/".$li."'>".$li."</a> <a target='fiofix1' href='fiofix.php?wp=".$li."' target='wp'>fiofix</a> ".$a."</li>\n";
			skriv("log.htm",$rad);
			if ($a){skriv("hand.htm",$rad);}
			
		}
	}
	
}


function huvudfunk($namn){

$grk=1852*60; //omräkningstal : antal meter per grad (latitud)
$redkom="+geografisk data. ";
$anm=""; //om något blir skrivet i denna kommer artikeln ej all läggas i '/upload', utan skrivs i listan för annan åtgärd
$redkomDold="";
$tkn=explode("|","Å|Ä|Ö|å|ä|ö| ");$otkn=explode("|","AA|AE|OE|aa|ae|oe|_"); //polygon-filerna är skrivna med denna ändring, som alltså måste efterliknas 
//$namn=str_replace(" ","_",$_GET['wp']);

$wp = file_get_contents("https://sv.wikipedia.org/w/index.php?title=".$namn."&action=raw");
if (!isset($wp)){return("<b>kunde inte hitta filen</b>");}
$wp=str_replace("\r","",$wp);

$kommunuppdateringold=array("[[S:t Michel]]","[[S:t Karins]]","[[S:t Mårtens]]","[[Loppis]]","[[Bräkylä]]");
$kommunuppdateringnew=array("[[Sankt Michel]]","[[Sankt Karins]]","[[Sankt Mårtens]]","[Loppi]]","[[Rääkkylä]]");
$wp=str_replace($kommunuppdateringold,$kommunuppdateringnew,$wp); //skriver kommunerna med "Sankt", och undviker några föråldrade kommunnamn 
$wp=str_replace("hänvisar att ön har varit","åsyftar att ön har varit" ,$wp); //återkommande grammatikfel i vissa handskapade
$wp=str_replace(" ligger sjön "," ligger i sjön ",$wp); //återkommande fel i vissa som tidigare fått kommun/sjö med bot

$wp=str_replace("| range","| lake",$wp);
$wp=str_replace("= Arkipelag"," = Sjö",$wp);
$wp=str_replace("| lake ","| lake  ",$wp);//align

//Special: hanterar anomalier i specifika stora sjöar som tidigare har botkompletterats. Dessa bör nu vara obsoleta 
$wp=str_replace("norra delen av sjön [[Kallavesi]]","sjön [[Kallavesi (norra)|Kallavesi]]",$wp); 
$wp=str_replace("[[Kallavesi]] (norra delen)","[[Kallavesi (norra)|Kallavesi]]",$wp); 
$wp=str_replace("| lake                    = Onkivesi","| lake                    = [[Onkivesi]]",$wp); 
$wp=str_replace("= Kallavesi","= [[Kallavesi]]",$wp); 
$wp=str_replace("= [[Saimen]] (egentliga)","= ",$wp); 

//Tar bort botkomplettering med sjö
$wp=preg_replace("/\| *lake *\=.+\]\]/", "| lake                    = ",$wp);
$wp=preg_replace("/ligger i sjön \[\[.+?\]\] +och +/", "ligger ",$wp);
//slut borttag botkomplettering 

//Special Juankoski
$wp=str_replace(" (tidigare [[Juankoski]]) ","",$wp); //tidigare åtgärdats med bot måste tas bort - läggs åter senare

$xml=file_get_contents("https://sv.wikipedia.org/w/api.php?action=query&prop=coordinates&format=xml&titles=".str_replace(" ","_",$namn)); //koordinater hämtas

if (!isset($xml)){return("<b>kunde inte hämta koordinater</b>");}
unset($tmp);
preg_match("/lat\=\"(\d|\.)+\" lon\=\"(\d|\.)+\"/",$xml,$tmp);
if (!isset($tmp)){return("<b>saknas koordinater</b>");}

if (isset($tmp[0])){
	
	$l=explode('"',$tmp[0]);
	$lat=$l[1]; $long=$l[3];
	
	
	if (minut($lat,$long)){$anm.= "<font color='red'>kolla dåliga koordinater först!</font>";}
	
}
if (!isset($lat)){return ("<b>Inga koordinater!</b>");}

$latkorr=$longkorr="";
if (isset($_POST['latkorr']) || isset($_POST['longkorr'])){ //för hantering av manuell flyttning av koordinatpunkt angivet antal meter
	//echo $lat."|".$long."#";
	$latold=$lat; $longold=$long;
	$latkorr=0; if (isset($_POST['latkorr'])){$latkorr=$_POST['latkorr']; }
	$longkorr=0; if (isset($_POST['longkorr'])){$longkorr=$_POST['longkorr']; }
	$lat=round($lat+$latkorr/$grk , 5);
	$long=round($long+$longkorr/$grk/cos(pi()/180*$lat) , 5);
	$wp=str_replace($longold,$long,$wp); $wp=str_replace($latold,$lat,$wp);
}



//läs in sjölista (kml) först
$kom=file_get_contents("jarvi10/sjolista.txt"); //lista som innehåller uppgifter om varje sjös max-utsträckning. Denna återfinns sedan i $sjo ($kom används initiallt något förvirrande p.g.a kodåteranvändning, men återställs, se nästa)
$kom=str_replace("\r","",$kom);
$kom=explode("\n",trim($kom));
for ($i=0; $i<count($kom); $i++){
	$sjo[$i]=explode("\t",$kom[$i]);

} //1= longmin, 2=longmax, 3=latmin 4=latmax
unset($kom);
$kom=file_get_contents("kml_finlandskommuner/_ny_kommunlista.txt"); //motsvarande lista för kommunpolygonerna. Denna återfinns sedan i $kom
$kom=str_replace("\r","",$kom);
$kom=explode("\n",trim($kom));
for ($i=0; $i<count($kom); $i++){
	$kom[$i]=explode("\t",$kom[$i]);
//	echo count($kom[$i])." ";
	$kom[$i][8]=$kom[$i][1];	
	$kom[$i][8]=str_replace($tkn,$otkn,$kom[$i][8]);//anv 8 för länk till kml
} //1= longmin, 2=longmax, 3=latmin 4=latmax

$halvo=false; $olangd=false;
for ($j=0; $j<count($sjo); $j++){//kolla vilken sjö
	if ($lat > $sjo[$j][3] && $lat < $sjo[$j][4] && $long > $sjo[$j][1] && $long < $sjo[$j][2]){
		$kml=file_get_contents("jarvi10/strand/".$sjo[$j][0].".kml"); //hämtar sjöpolygon som bara innehåller strandlinjen

			//	skriv ("sjo/test",$kom[$j][0]." ");
//				if (true){
		if (kmltraff($kml,$lat,$long)){ //nu har en sjöpolygon hittats 
			$sjoid=$sjo[$j];//kml-namn (sjöid)
			$kml=file_get_contents("jarvi10/full/".$sjo[$j][0].".kml"); //hämtar samma polygon fast med öar
			
			//Nedanstående kollar upp till 9 punkter, först den angivna och om denna ligger i vattnet kollas 8 punkter $koff meter därifrån. Detta hittar många öar där koordinaterna är obetydligt fel.
				$testkoord=array("0|0","1|0","-1|0","0|1","0|-1","1|1","-1|-1","1|-1","-1|1"); $koff=7;//för att leta på originalpunkt samt 8 punkter med koff meters avstånd för att hitta öar som ligger bara obetydligt fel. Korrigerar i så fall lat och long. Ger en mening om öns maxlängd och ritningen för denna sträcka, eller varnar för att koordinaterna ligger i vattnet.
				for ($ki=0;$ki<9;$ki++){//9 för att testa omkring
					$lext=explode("|",$testkoord[$ki]);			
					$latext=$lext[0] * $koff / $grk; 
					$longext=$lext[1] * $koff / $grk / cos ($lat*pi()/180); 
					if (!kmltraff($kml,$lat+$latext,$long+$longext)){ //negativ=på land, och inom strandlinjen enl ovan, d.v.s på en ö! 
						$wp=str_replace($lat,(round($lat+$latext,5)),$wp);
						$wp=str_replace($long,(round($long+$longext,5)),$wp);
						$lat=round($lat+$latext,5); $long=round($long+$longext,5); 
						$olangd=islandsize($kml,$lat,$long);
						break;	
					}	
				}
				if (!$olangd){$anm.= "<font color='red'>Koordinaterna verkar inte ligga på någon ö <a target='map' href='http://wiki-map.com/map/?locale=sv&lat=".$lat."&lng=".$long."'>wm</a>! </font>"; }
				else {$langd=$olangd[0]; $riktning=$olangd[1]; } 
			break;
		} else {
			//leta brevid för halvö. Om i sjörektangel men utanför polygon kollas fyra punkter 100 meter åt varje håll, och om någon av dessa träffar vattenyta, anses det vara en halvö... (någon har ju redan klacifiserat den som ö tidigare) 

			$latext=array(100/$grk,0,-100/$grk,0);
			$longext=array(0,100/$grk/cos ($lat*pi()/180),0,-100/$grk/cos ($lat*pi()/180)); 
				for ($ii=0; $ii<4; $ii++){
					if (kmltraff($kml,$lat+$latext[$ii],$long+$longext[$ii])){
						$sjoid=$sjo[$j];
						$halvo=true;
						break;	
					}	
				}	
		}

	}
}
if (!isset($sjoid)){
	$anm.="<font color='green'>Ingen sjö? <a target='map' href='http://wiki-map.com/map/?locale=sv&lat=".$lat."&lng=".$long."'>wm</a>! ??</font>"; 
	if (!isset($_GET['wp'])){return($anm);}
}


unset($kml);
for ($j=0; $j<count($kom); $j++){//kolla kommun
	if ($lat > $kom[$j][4] && $lat < $kom[$j][6] && $long > $kom[$j][5] && $long < $kom[$j][7]){
					$kml=file_get_contents("kml_finlandskommuner/".str_replace($tkn,$otkn,$kom[$j][1]).".kml");
					if (kmltraff($kml,$lat,$long)){ //nu har en kommunpolygon hittats
						$kommun=$kom[$j];//kml-namn (sjöid)
						break;
					}
	}
}




if (trim($kommun[0])==trim($kommun[1])){
	$komwp[0]="[[".trim($kommun[0])."]]";

}
else{
	$komwp[0]="[[".trim($kommun[0])."|".trim($kommun[1])."]]";
}
 $komkat="[[Kategori:Öar i ".trim($kommun[0]," ][")."]]";
if (isset($komkatE)){$komkat.=$komkatE;}


//Om öns längd tidigare kunde beräknas kollas nu kommuntillhrighet för ändpunkterna på denna sträcka. Detta är tyvärr spagettikod med den andra if-satsen "if ($komunprobl)"... 
$komunprobl=false;
if (isset ($kml) && isset($olangd[0])){
	$komunprobl=true;
	unset($tmp); //tar vara på extremkoord och tar bort i dem den mån de är kända som samma. den andra kan dock vara samma
	$tmp[0][0]=$olangd[2]; $tmp[0][1]=$olangd[3]; $tmp[1][0]=$olangd[4]; $tmp[1][1]=$olangd[5];
	if (kmltraff($kml,$olangd[2],$olangd[3])){ //unset($tmp[0]);
		if (kmltraff($kml,$olangd[4],$olangd[5])){
			$komunprobl=false; //unset($tmp[1]);
		}
	}
}
if ($komunprobl){
	for ($i=0; $i<2; $i++){
		if (isset($tmp[$i])){//kolla efter den avvikande kommunen
		
			###### inkopierat från föreg
			unset($kml);
			for ($j=0; $j<count($kom); $j++){//kolla kommun
				if ($tmp[$i][0] > $kom[$j][4] && $tmp[$i][0] < $kom[$j][6] && $tmp[$i][1] > $kom[$j][5] && $tmp[$i][1] < $kom[$j][7]){
					$kml=file_get_contents("kml_finlandskommuner/".str_replace($tkn,$otkn,$kom[$j][1]).".kml");
					
					if (kmltraff($kml,$tmp[$i][0],$tmp[$i][1])){ //nu har en kommunpolygon hittats
						$kommunE=$kom[$j];//kml-namn (sjöid)
						break; 
					}
				}
			}
			######
			if(isset($kommunE)){
				if (trim($kommunE[0])==trim($kommunE[1])){
					$komwp[1+$i]="[[".trim($kommunE[0])."]]";
				}
				else{
					$komwp[1+$i]="[[".trim($kommunE[0])."|".trim($kommunE[1])."]]";
				}
				if ($komwp[1+$i] == $komwp[0]){unset($komwp[1+$i]);}
				if (isset($komwp[1+$i])){
					$komkat.="\n[[Kategori:Öar i ".trim($kommunE[0],"][ ")."]]";
				}
				
				
			}	
             #######################
		}
	}
}

//tar befintligt landskap (bara ett, då botartiklarna inte har fler) ur geoboxen: denna behövs på flera ställen
unset($tmp);
preg_match("/\| *state +\=.*/",$wp,$tmp);
$tmp[0]=explode("=",$tmp[0]);
$landsk=trim($tmp[0][1]," ][")."|";
$landsk=preg_replace("/\|.*/","",$landsk);


$landskapslista = " ".$landsk;
$kommunlista=file_get_contents("../sjoareakoll/finlandsKommuner.txt"); //återanvänder annan lista med kommunnamn (wp, finska svenska, samt landskap). 
$kommuner= explode("&&&",trim(implode("&&&",$komwp)," &|"));
for ($i=0; $i< count($kommuner); $i++){//obs! om det wikilänkade kommunnamnet i listan inte stämmer med vad som skickas in, så blir odefinierat landskap!
	$kommuner[$i]."#";
	$pos=strpos($kommunlista,$kommuner[$i]);
	$pos1=strpos($kommunlista,"\n",$pos+2);
	unset($tmp);
	$tmp=trim(substr($kommunlista,$pos,$pos1-$pos));
	$tmp=explode("\t",$tmp);
	if (!strpos($landskapslista,$tmp[3])){$landskapslista.="|".$tmp[3];}
}


$landskapslista=trim(preg_replace("/\|+/","|",$landskapslista),"| ");
$landskapslista=explode("|",trim($landskapslista));
if (count ($landskapslista)>1){
	for ($i=1; $i<count ($landskapslista); $i++){
		$wp=addtogeobox($wp,"state",wl(str_replace("_"," ",$landskapslista[$i])));
	}
	
	$wp=preg_replace("/och landskapet *(\<\!--ADM1--\>)* *\[\[.+?\]\]/", "och landskapen <!--ADM1--> ".upprakning($landskapslista) , $wp);
}
if (count($kommuner) < count ($landskapslista)){$anm.="<font color='red'>Fel landskap!</font>";}

if ($komunprobl && count($kommuner)<2){	$anm="<font color='red'>Kanske flera kommuner - kollas? <a target='map' href='http://wiki-map.com/map/?locale=sv&lat=".$lat."&lng=".$long."'>wm</a> . </font>";}

$str= trim(implode ("#",$kommuner),"#");
$str=preg_replace("/#+/","#",$str);
$kommunstr=preg_replace("/\|.+?\]\]/","",$str); 
$kommunstr=preg_replace("/(\[|\])*/","",$kommunstr);

unset($kommuner);
$kommuner=explode("#",$kommunstr);

$komkat="[[Kategori:Öar i **".implode("¤]]\n[[Kategori:Öar i **",$kommuner)."¤]]"; //ersätter, för mycket hakparenteser i kategorierna...
$tb=array("**[[","]]¤","**","¤"); //tabort-array
$komkat=str_replace($tb,"",$komkat);//fixar missen med hakparenteserna
$komkat=preg_replace("/\|.+?\]\]/","]]",$komkat);

if (isset($sjoid)){ //om en sjö hittats, behöver sjöid översättas till wp-artikelnamn. Sådan lista HÄMTAS i "sjo/wpsjo_sjoid"
 $wpsjo=file_get_contents("sjo/wpsjo_sjoid");
 unset($tmp);
 preg_match_all("/.+".$sjoid[0].".+/",$wpsjo,$tmp);

 if (isset($tmp[0])){
	if (count($tmp[0])==1){
		$tmp1=explode("\t",$tmp[0][0]);
		$wpsjo=$tmp1[0];
	}
	elseif(count($tmp[0])>1){
		$wpsjo="";
		for ($i=0; $i<count($tmp[0]); $i++){
			$tmp1=explode("\t",$tmp[0][0]);
			if (!strpos(" ".$wpsjo,$tmp1[0])){
				$wpsjo.=$tmp1[0].";";
			}
		}
		$wpsjo=trim($wpsjo,"; ");
		if (strpos($wpsjo,";")){	$anm.= "<font color='red'>Mer än en artiklel på detta sjöid!</font> "; }
	}
	else {
		$anm.= "<font color='red'>hittar inte sjöid ".$sjoid[0]." på wplista</font>  testa <a target='jvw' href='../sjoareakoll/ny_finsk_sjo.php?jarviwiki=".$sjoid[8]." (".$sjoid[0].")'>".$sjoid[8]." ".$sjoid[0]."</a> <a target='map' href='http://wiki-map.com/map/?locale=sv&lat=".$lat."&lng=".$long."'>wm</a>...";
		$wpsjo=$sjoid[8];
	}
 }
}
if (isset($wpsjo)){
	$repl=array("(",")","_"); $replT=array("\(","\)"," ");
	$wp=preg_replace("/i +(sjön)*? *\[\[".str_replace($repl,$replT,$wpsjo).".+?\[\[Finland\]\]\.\</","i [[Finland]].<",$wp);
}

//Om kommun redan satt och bara en, så tas den bort för att kunna lägga till igen
$kommunfinns=(regexpkoll($wp,"#municipality *\= *\[\[.+\]#"));
unset($tmp);
preg_match_all("/\| *municipality\d* *\= *\[\[.*\]\]/",$wp,$tmp);
if (count($tmp[0])==1){
	unset($tmp1);
	$tmp1=explode("=",$tmp[0][0]);
	$gammalkommunwp=trim($tmp1[1]);
	//$gammalkommun=preg_replace("/\|.*/"
	if ($gammalkommunwp){//ta bort alla kommun för att börja på nytt == $komwp[0]
		$wp=str_replace($gammalkommunwp,"QQ TABORT QQ",$wp);
		$wp=preg_replace("/i +kommunen +QQ TABORT QQ *(\<ref.*?\/ *\>)*/","",$wp);
		$wp=preg_replace("/i +QQ TABORT QQ *(kommun|stad)* *(\<ref.*?\/ *\>)*/","",$wp);
		$wp=str_replace("QQ TABORT QQ","",$wp);
		$kommunfinns=false;
		//echo"<textarea>$wp</textarea>";
	}
}
unset($komwp); $komwp=explode("#",$kommunstr);


$wp=preg_replace("/\| *\d +\= *I/","| I",$wp); //dålig rad
//$wp=preg_replace("/\| *\d *\=/","|",$wp); //dålig rad
$wp=preg_replace("/\> *De/","> De",$wp); //onödiga mellanslag
if (!$kommunfinns){
	for($i=0; $i<3; $i++){
		if (isset($komwp[$i])){$wp=addtogeobox($wp,"municipality",wl($komwp[$i]));}
	}	
}


if (!isset($wpsjo)){$wpsjo="";}

$wp=addtogeobox($wp,"lake",wl(str_replace("_"," ",$wpsjo)));
if (isset($langd)){
	$wp=addtogeobox($wp,'length',round($langd/1000,2));
	$wp=addtogeobox($wp,'length_orientation',$riktning);
}

if ($wpsjo){
	
	$var="sjön ".wl($wpsjo)."<ref name=\"jarvi10\"/> och i ";
	if (!$kommunfinns){
		if (count($komwp)>1){
			$var.="kommunerna ".upprakning($komwp)."<ref name=\"lmvkommun\"/> i ";
			if (count(explode("[[",$var))<4){$anm.="<font color='red'>Kommunproblem! (antagligen gräns)</font>";}
		}
		else{
			$var.="kommunen ".wl($komwp[0])."<ref name=\"lmvkommun\"/> i ";
		}
		
	}
	
	$wp=preg_replace("/\. .+? ligger i sjön \[\[.+?\]\]\.\{\{.+?Lsjbot-algoritmnot\}\}\}\}/",".",$wp);
	$wp=preg_replace("/\. .+? ligger i sjön \[\[.+?\]\]\./",".",$wp);
	$wp=str_replace("Den ligger den [[Ekonomisk","Den ligger i den [[Ekonomisk",$wp); //konstigt återkommande fel i handediterade artiklar

	unset($tmp);
	preg_match("/\'\'\'[\s\S]+\< *(r|R)eferences/",$wp,$tmp);
	if (strpos($tmp[0],"[[".str_replace("_"," ",$wpsjo))){$anm.=" <font color='orange'>dubblerat sjönamn?</font> ";}
	$len=strlen($wp);
	$wp=str_replace("ligger i ","ligger i ".$var,$wp);
	if ($len!==strlen($wp)-strlen($var)){
		if ($len==strlen($wp)){
			unset($tmp); 
			preg_match("/\'\'\'.+/" , $wp, $tmp);
			$wp=str_replace($tmp[0],$tmp[0]." Ön ligger i ".$var." och landskapet <!--ADM1--> ".upprakning($landskapslista).".<!--sluttext-->",$wp);
			$wp=str_replace(" i  och landskap"," och landskap",$wp);
			if (count($landskapslista)>1){$wp=str_replace('och landskapet <!--ADM1-->','och landskapen <!--ADM1-->',$wp);}
		}
		$anm.=" <font color='orange'>felaktig textinfogning!</font> ";
	}
}elseif (!$kommunfinns) {$var="kommunen ".$komwp[0]." ";}
else {$var="";}

unset($tmp);
$tmp=kolla_vp($wp);
$wp=$tmp[0]; $redkom.=$tmp[1];

$tabort=array("]","[");
$kommunstr=str_replace($tabort,"",$kommunstr); $kommunstr=str_replace("#","|",$kommunstr);
$wp=preg_replace("/\[\[ *(K|k)ategori\:Öar i (".trim($kommunstr,"][ ")."|".$landsk.") *\]\]/",$komkat,$wp);

$wp=str_replace("Trakten ingår i","== Klimat ==\nTrakten ingår i",$wp);
$wp=str_replace("\n[[Inlandsklimat]] råder","\n== Klimat ==\n[[Inlandsklimat]] råder",$wp);
$wp=preg_replace("/\=+ *Klimat *\=+\s+\=+ *Klimat *\=+/","== Klimat ==",$wp); 

unset($tmp);
preg_match("/\{\{klimatöversikt[\s|\S]+?\}\}/",$wp,$tmp); //snyggar till klimatöversikten lite

if (isset($tmp[0])){
	$tmp[1]=str_replace("| 0\n","|\n",$tmp[0]);
	$wp=str_replace($tmp[0],$tmp[1],$wp);
}
$komplt="";

if ($halvo){
	$re=array("= Ö","en [[ö (landområde)|ö]]","<!--T.ISL-->");
	$reny=array("= Halvö","en halvö<ref name=\"jarvi10\"/>","");
	$wp=str_replace($re,$reny,$wp);
	$redkom.=" Ändrar till halvö.";
}

if (isset($langd)){
	if ($langd <500){$ltxt=formatnum(round($langd,-1))." meter";}
	elseif ($langd >10000){$ltxt=formatnum(round($langd/1000))." kilometer";}
	else {$ltxt=formatnum(round($langd/1000,1))." kilometer";}
	
	$komplt=" Öns största längd är ".$ltxt." i ".$riktning." riktning.<ref name=\"jarvi10\"/>";
}


if (strpos($namn,"saaret")){$komplt.=" Notera att namnet antyder att det är fråga om flera öar."; }	
if (strpos($namn,"karit")){$komplt.=" Notera att namnet antyder att det är fråga om flera öar."; }	
if (strpos($namn,"luodot")){$komplt.=" Notera att namnet antyder att det är fråga om flera öar."; }	

if (strpos($wp,"huvudstaden [[Helsingfors]]")){
	$wp=str_replace("huvudstaden [[Helsingfors]].","huvudstaden [[Helsingfors]].".$komplt,$wp);
} 
elseif (strpos($wp,"<!--sluttext-->")){
	$wp=str_replace("<!--sluttext-->" , $komplt ,$wp);
}else {$anm.=$komplt;}


$ref ="\n<ref name=\"lmvkommun\"> Baserat på polygon från [[Lantmäteriverket]]s [http://www.maanmittauslaitos.fi/sv/filnedladdningstjansten filnedladdningstjänst]</ref>\n<ref name=\"jarvi10\">Baserat på sjöpolygon från [http://www.syke.fi/fi-FI/Avoin_tieto/Paikkatietoaineistot Finlands miljöcentral, SYKE]: shape-fil: Ranta10 - Järvet (2016-11-29)</ref>";
$wp=str_replace("<references>","<references>".$ref,$wp);


$wp.="\n[[Kategori:Öar i insjöar i Finland]]";


if (strpos($wp," lake1 ")){$anm.= "<font color='green'>Verkar redan vara kompletterad! </font>";} //om en sjö till läggs till, var den redan kompletterad på ett sätt som inte skriptet kunnat ogöra
if (strpos($wp,"kommunen [[]]")){$anm.= "<font color=red>VARNING: Hittar inte kommun!? </font>";} //p.g.a felaktig kommunpolygon (finns en del sådana fel, främst i Norra Savolax), eller riksgräns!


if (count($kommuner) > 1){//ta bort ekon region om flera kommuner, då det saknas kontroll på om alla kommuner hör till samma region
	unset($tmp);
	preg_match("/\| *region *\=.*/",$wp,$tmp);
	$tmp[1]=explode("=",$tmp[0]);
	$wp=str_replace($tmp[0],$tmp[1][0]."= ",$wp);
	$wp=preg_replace("/ *i den \[\[Ekonomisk region.*?\]\] *\<\!--ADM2--\> *\[\[.+?\]\] */"," ",$wp);
	$wp=preg_replace("/ *i den ekonomiska regionen *\<\!--ADM2--\>\[\[.+?\]\] */"," ",$wp);
}

//Några hårdkodade fixar för vissa sjöar och tidigare kommunen Juankoski, som har polygon fast den numer är del av Kuopio 
//Special Kallavesi (norra)
$wp=str_replace("[[Kallavesi (norra delen)|Kallavesi]]","[[Kallavesi]] (norra delen)", $wp);
$wp=str_replace("= [[Saimen]]","= [[Saimen]] (egentliga)",$wp); 
//Special Juankoski
$wp=str_replace("i kommunen [[Juankoski]]","i kommunen [[Kuopio]] (tidigare [[Juan##TABORT##koski]])",$wp);
$wp=str_replace("[[Juankoski]]","[[Kuopio]]",$wp);
$wp=str_replace("##TABORT##","",$wp);


if (strpos($wp,"[[]]") && !$anm){$anm.=" <font color='red'>Något är galet! - tom wikilänk!</font>";}//fångar upp om ändå detta slunkit igenom

$filfel=array(":","_");//tecken som behöver fixas i artikelnamn för att kunna hanteras som windowsfiler och laddas via AWB 
$filfelE=array("~kolon~"," ");

if (!$anm){	
	if (!isset($_GET['wp'])){ 
		file_put_contents("upload/".iconv("UTF-8","Windows-1252//IGNORE",str_replace($filfel,$filfelE,$namn)).".txt",$wp);
//	file_put_contents("upload/".$namn.".txt",$wp);
		skriv("upload/_lista.txt",str_replace("_"," ",$namn)."\r\n");
	}	
	skriv(iconv("UTF-8","Windows-1252//IGNORE","Ö_i_sjö"),$wpsjo."\t".$namn."\r\n");
}else {skriv("fiofixfel.txt",$namn."\t".$anm."\r\n");}


if (!isset($_GET['wp'])){return ($anm);}



echo $anm;
echo "<form id='koordfl' name='koordfl' method='post' action='fiofix.php?".$_SERVER['QUERY_STRING']."' size='5'><input name='latkorr' size='5' value='".$latkorr."'/><input name='longkorr' size='5' value='".$longkorr."'/><input type='submit' value='koordflytt (meter)'/></form>";
$wp=preg_replace("/\{\{robotskapad\|Lsjbot.*?\}\}/","",$wp); $wp=trim($wp);

echo "<a target='sjo' href='https://sv.wikipedia.org/wiki/".$wpsjo."'>".$wpsjo."</a>";
///echo "<a target='sjo' ref='../sjoareakoll/ny_finsk_sjo.php?jarviwiki=".
//echo 	$wpsjo." ".$komkat." ".$komwp;
//echo implode(" ",$sjoid)." ".implode(" ",$kommun);





$wpversion="sv";
	if ($_GET['wp']){
//		echo '<form id="editform" name="editform" method="post" action="https://'.$wpversion.'.wikipedia.org/w/index.php?title='.$qu.'&amp;action=submit" enctype="multipart/form-data">';

		echo '<form id="editform" name="editform" method="post" action="https://'.$wpversion.'.wikipedia.org/w/index.php?title='.$namn.'&amp;action=submit" enctype="multipart/form-data">';

		echo '<textarea tabindex="1" id="wpTextbox1" cols="160" rows="25" style="" lang="sv" dir="ltr" name="wpTextbox1">'.$wp.'</textarea>'."\n<br/>\n";

		echo '<input name="wpWatchthis" type="checkbox" value="1" tabindex="3" accesskey="w" id="wpWatchthis" checked />&#160;<label for=\'wpWatchthis\' id=\'mw-editpage-watch\' title="Lägg till den här sidan i din bevakningslista [w]">Bevaka denna sida</label>';

		echo '<span class="mw-summary" id="wpSummaryLabel"><label for="wpSummary"></label></span> <input class="mw-summary" id="wpSummary" maxlength="200" tabindex="1" size="150" spellcheck="true" title="Skriv en kort sammanfattning [b]" accesskey="b" name="wpSummary" value="'.$redkom.$redkomDold.'"/>';


//		echo '<input id="wpDiff" name="wpDiff" tabindex="7" title="Visa vilka ändringar du har gjort i texten. [v]" accesskey="v" type="submit" value="Visa ändringar" />';
		echo '<input id="wpPreview" name="wpPreview" type="submit" tabindex="5" value="Visa förhandsgranskning" accesskey="p" title="Förhandsgranska i Wikipedia! [p]" />'."\n";
	} else {
		echo "<font size='5' color='red'><b>Ingen sida angiven! Skriv grensidans namn efter ? sist i urlen!</b></font>";
	}


//echo $kommentar;

}//slut function main




function upprakning($arr){//gör array till wikilänkad uppräkning, om ej array, så bara wikilänkas
	if (!is_Array($arr)){return(wl($arr));}
	if (count($arr)==1){return(wl(implode("",$arr)));}
	$j=0;
	$str=trim(implode("#||#",$arr)," #|");
	$str=preg_replace("/(\#\|\|\#)+/","#||#",$str);
	unset($arr);
	$arr=explode("#||#",$str);
	if (!isset($arr[0])){$arr[0]="";}
	for ($i=0; $i<count($arr); $i++){
		if ($arr[$i]){
			if (strpos($arr[$i],"]]")){$brr[$j]=$arr[$i];}
			else{$brr[$j]=wl($arr[$i]);}
			$j++;
		}
	}
	if (count($brr)>1){
		$a=implode(", ",array_slice($brr,0,count($brr)-1))." och ".($brr[count($brr)-1]);
	} else {$a=$arr[0];}
	return($a);
}


function formatnum($a){//formatnum, men bara om det behövs
	if ($a>999 || $a<0 || $a!=round($a)){
		$a="{{formatnum:".$a."}}";
		return ($a);
	}
	return ($a);
}


function kolla_vp($wp){ //tar bort referens till vp, om denna inte längre används
	$vp=preg_match("/\<ref name \= \"*vp\"* *\/\>/",$wp,$tmp);
//	alert (vp);
	if (!isset($tmp[0])){

		$len=strlen($wp);
		$wp=preg_replace("/\<ref name *\= *\"vp\"\>{{Webbref *\|url\= *{{Viewfinderlänk}}\|titel\= Viewfinder Panoramas Digital elevation Model\|hämtdatum\=.*\|format\= \|verk\= }}\<\/ref\>\s*/",'',$wp);
		$kommentar="";

		if ($len > strlen($wp)){
			$kommentar.= ' Tog bort Viewfinder-ref.';
			// alert (len+'|'+wp.length);
		}
	}
	unset($tmp);
	preg_match("/({{anmärkning\||{{Lsjbot-Savannskog)/",$wp,$tmp);
//	alert (anm);

	if (! isset($tmp[0])){ 

	

	
		$len=strlen($wp);
		$wp=preg_replace("/\=+ *(K|k)ommentarer *\=+\s*{{anmärkningslista}}\s*/",'',$wp);
//		wp=wp.replace(/\=+ *(K|k)ommentarer *\=+s*/,'');

		if ($len > strlen($wp)){
			$kommentar.= ' Tog bort anmärkningslista.';
		}
	}
	if (!isset($kommentar)){$kommentar="";}
	$res[0]=$wp; $res[1]=$kommentar;
	return($res);
}




function minut($lat,$long){ //kollar om koordinatangivelsen är i jämna minuter - om så måste det kollas upp för hand!
	$la[0]=floor($lat);  $la[1]= $lat - $la[0];
	$lo[0]=floor($long);  $lo[1]= $long - $lo[0];
	if (round($la[1]*60 , 3)==round($la[1]*60) && round($lo[1]*60 , 3)==round($lo[1]*60)){
		return (true);
	} else {return (false);}
}


function skriv($fil,$inneh){ //skriver till loggfil (finns kanske egentligen inbyggt i php någonstans?)
	$f=fopen($fil,"a");
	fwrite($f,$inneh);
	fclose($f);
}


function wl($a){//wikilänkar med tillägg utan särskiljning om erfodras (komma eller parentes-särskiljning)
	$a=str_replace("_"," ",$a);
	$a=preg_replace("/(\[\[|\|.+?\]\]|\]\])*/","",$a); //om ingående redan är wikilänkat
	$ers=array(", "," (");
	$b=explode("|",str_replace($ers,"|",$a));
	if (count($b)>1){return ("[[".$a."|".$b[0]."]]");}
	else {return ("[[".$a."]]");}
}

function islandsize($kml,$lat,$long){ //letar reda på rätt ö i en kml-fil och begär längd på denna. Detta är mycket cpukrävande för stora, örika sjöar: borde skapa filer för varje ö-polygon som inte redan har en sådan, och en lista med öarnas min/max-rektanglar och använda den istället....
	preg_match_all("#<coordinates>[\s\S]+?</coordinates>#",$kml,$tmp);
	//echo "#".count($tmp[0])."#";
	for ($i=1; $i<count($tmp[0]); $i++){ //första är sjön
		if (kmltraff($tmp[0][$i],$lat,$long)){
			$langd=kmllangd($tmp[0][$i]);
			return ($langd);
		}
	}
	return (false);
}



function kmllangd($kml){ //beräknar den maximala diametern av en kmlfil, och riktning

	// echo "<textarea>".$kml."</textarea>"; //denna kan användas för att felsöka en ö-polygon där en punkt ligger helt fel, och öns längd blir jättelång (ofta 1000-tals mil!) Dessa borde ju lagas vid källan istället...
	 
	 $kml=str_replace("28.09385,61.09912 28.9397,61.09914","28.09385,61.09912 28.09397,61.09914",$kml); //upptäkt fel i en specifik polygon. Liknande fixar kan göras vid behov...
	 $kml=preg_replace("/ (0|1)\d*\,\d+\.\d*/","",$kml); //heltal (14,) verkar kunna vara fel
	 preg_match_all("/\d\d0\.\d/",$kml,$tmp); //tar bort en slags ofta återkommande fulingar typ 280.1234 istället för 28.1234
	 $i=0;
	 while (isset($tmp[0][$i])){
		$repl=str_replace("0.",".",$tmp[0][$i]);
		$kml=str_replace($tmp[0][$i],$repl,$kml);
		$i++;
	 }
	unset($tmp);
	
	//Nu är det dax att identifiera de punkter som ligger längst ifrån varandra. börjar med godtycklig punkt, tar den som ligger längst ifrån denna; utgår från den punkten, och söker punkten längst bort från den, etc, så länge det blir nya punkter. 
	preg_match_all("/((-|\d)+((\.|\d))* *, *(-|\d)+((\.|\d))* *)/",$kml,$tmp);
	
	for ($i=0; $i<count($tmp[0]); $i++){
		$coo[$i]=explode(",",$tmp[0][$i]);
	}
	$avstold=-1;
	$avst=0;
	$utgk=$coo[0];
	$maxcoo=$coo[0];
	$prop=cos ($coo[0][1]*pi()/180);
	$test=0;
	
	while ($avstold != $avst){ //
		$avstold=$avst; $avst=0;
		for ($i=0; $i<count($coo); $i++){
			$a=dist($utgk,$coo[$i],$prop);
			if ($a>$avst){
				$avst=$a; $maxcoo=$coo[$i];
			}
		}
		$oldutg=$utgk; 
		$utgk=$maxcoo;
	}
	//$oldutg & $maxcoo ger extrema koordinaterna
	$avs[0]=$avst;
	
	$avs[1]=riktning($oldutg[1],$oldutg[0],$maxcoo[1],$maxcoo[0]);
	$avs[2]=$oldutg[1];
	$avs[3]=$oldutg[0];
	$avs[4]=$maxcoo[1];
	$avs[5]=$maxcoo[0];
	
	return ($avs);
}

function dist($c1,$c2,$prop){ //ger distansen i meter mellan två koordinatpunkterpunkter givna som arrayer lat|long. $prop (propotionen mellan lat och long-avståndet, alltså cos lat) skickas in itället för att beräknas, då värdet för en koordinat duger som närmevärde för alla -sparar lite cpu
	
		$grk=1852*60; 
		$x=($c1[0]-$c2[0])*$prop*$grk;
		$y=($c1[1]-$c2[1])*$grk;
	 	$a=round(sqrt($x*$x+$y*$y));
		return($a);
}


function kmltraff($kml,$lat,$long){ //kollar om den angivna koordinaten ligger innanför polygonen kml-format, men <coordinat>-element räcker. ger true eller false

	unset($tmp2);
	$pass=0; //antalet gränspassager: udda=innaför, jämna=utanför
	preg_match_all("/\<coordinates *\>[^\<]*/",$kml,$tmp2);
//	echo "<textarea>".$tmp[0]."</textarea>";
	for ($j=0; $j<count($tmp2[0]); $j++){

		unset($km);
		unset ($tmp1);
		preg_match_all("/((-|\d)+((\.|\d))* *, *(-|\d)+((\.|\d))* *)/",$tmp2[0][$j],$tmp1);

		unset($tmp);
		$tmp= implode (",",str_replace(" ","",$tmp1[0]));
		$tmp=str_replace("<coordinates>","",$tmp);
		$km=explode(",",$tmp); //udda är lat, jämna long

		$pos=count($km);

		if($km[0]!=$km[$pos-2] || $km[1]!=$km[$pos-2]) {$km[$pos]=$km[0]; $km[$pos+1]=$km[1];}
//		$km[$pos]=$km[$pos-2]; $km[$pos+1]=$km[$pos-1]; $km[$pos+2]=$km[0]; $km[$pos+3]=$km[1]; $km[$pos+4]=$km[0]; $km[$pos+5]=$km[1];   //dubblerar slutvärde och sluter
		$n= ((count ($km)-1)/2)-1; //antar att figuren nu är sluten:

//	echo "<textarea>".implode(" ",$km)."</textarea>";

		for ($i=0; $i<$n-1; $i++){
			$offset=0; $test="";
			while ($lat==$km[2*$i+1+2*$offset]){
				$offset++;
				$test.=$km[2*$i].",".$km[2*$i+1]." ";
				if ($i+1+$offset > $n){$offset=$offset-$n;} //om kml sluts i horisontellt avsnitt
			} //så länge samma lat
			if ($i>$n-1-$offset){$offset=-$n+$offset;}//när nästa ligger i början
			if ( $lat<= max($km[2*$i+1] , $km[2*$i+3+2*$offset]) && $lat > min($km[2*$i+1],$km[2*$i+3+2*$offset]) ){

				if ($long>$km[2*$i] && $long>$km[2*$i+2+2*$offset]){ //när lat > båda
					$pass++; //echo"[$i]";
				}
				$skar=false;
				if ($long>$km[2*$i] && $long<$km[2*$i+2+2*$offset]){$skar=true;}
				if ($long<$km[2*$i] && $long>$km[2*$i+2+2*$offset]){$skar=true;}
				if ($skar){

					$coo[0]=$km[2*$i+1]."|".$km[2*$i];
					$coo[1]=$km[2*$i+3+2*$offset]."|".$km[2*$i+2+2*$offset];
					sort($coo);
					$coo[0]=explode("|",$coo[0]); $coo[1]=explode("|",$coo[1]);

				if ($coo[0][1]>$coo[1][1]){$hjd=$coo[1][0]-$lat;}
				else {$hjd=$lat-$coo[0][0];}

					$skx=$hjd* abs($coo[0][1]-$coo[1][1])/($coo[1][0]-$coo[0][0])  +  min($coo[0][1],$coo[1][1]);

					if ($long>$skx){
						$pass++;
					}
				}
			}
			if ($offset>0){$i+=$offset;}
		}
		}
	$res=($pass/2!=round($pass/2));//inuti -->true
//	echo "(".$pass.") ";
	return ($res);
}




function hitta_mall ($wp,$mall){ //hittar en mall i wikitext
	unset($tmp);

	preg_match_all("/\<\!--(.+?)--\>/",$wp,$tmp);

	if (isset($tmp[0])){
		$ers=array("%%¤¤","¤¤%%");
		$ers1=array("{{","}}");
		for ($i=0; $i<count($tmp[0]); $i++){
			$wp= str_replace($tmp[0][$i],  str_replace($ers1,$ers,$tmp[0][$i]) , $wp);
		}
	}

	preg_match("/\{\{ *".$mall."/i",$wp,$tmp);
	$pos=strpos($wp,$tmp[0]);
	$pos1=strpos($wp."}}","}}",$pos);
	$pos2=strpos($wp."{{","{{",$pos+2);
	$break=0;
	while ($pos2<$pos1){$break++;
		$pos1=strpos($wp."}}","}}",$pos2);
		$pos1=strpos($wp."}}","}}",$pos1+2);
		$pos2=strpos($wp."{{","{{",$pos2+2);
		if ($break>15){echo " break  "; break;}
	}
	$wp=substr($wp,$pos,$pos1-$pos+2);

	$wp=str_replace($ers,$ers1,$wp);
	return ($wp);
}

function addtogeobox($wp,$param,$varde,$def=false){
	/*
	identifiera geobox --> function hitta_mall
	läs av alla parmetrar av aktuellt slag
	Leta efter första tomma och lägg till värde, eller lägg till ny
	Om $def ange _type (skriver över befintlig)
	BUGG/olöst: Om parametern tidigare saknades, kan den inte stoppas in i Geobox
	*/
	$forelikamed=26; //position för =-tecknet
	$fyll="                                        ";
	$tom=true;
	$geo=$geobox=hitta_mall ($wp,'geobox');
	preg_match_all("/\|\s*".$param."\d* *\= *[^\|]*/i",$geobox,$par);
	$geobox=str_replace($par[0][0],"###HÄR&&&¤¤¤###",$geobox);
	$geobox=str_replace($par[0],"",$geobox);

	for ($i=0; $i<count($par[0]); $i++){
		$pa[$i]=explode("=",$par[0][$i]);
		$pa[$i][1]=trim(preg_replace("/\<\!--(.+?)--\>/","",$pa[$i][1]));
		if(!$pa[$i][1]){$pa[$i][1]=$varde; $tom=false; break;}
	}
//	echo $i;
	if ($tom){
		$pa[$i][0]="| ".$param.$i." ";
		$pa[$i][0]=str_replace("| ".$param."0 ","| ".$param." ",$pa[$i][0]);
		$pa[$i][1]=$varde;
		$pos=$forelikamed-strlen($pa[$i][0]);		//lagom många " ";
		if ($pos>0){$pa[$i][0].=substr($fyll,0,$pos);}
//		echo $pa[$i][0]."=".$pa[$i][1];
	}
	unset ($par);
	for ($i=0;$i<count($pa); $i++){
		$par[$i]=implode("= ",$pa[$i]);
	}

//	echo "<textarea>".implode("\r\n",$par)."</textarea>";

	if ($def){//lägger till/byter ut befintlig
		$geobox=preg_replace("/\|\s*".$param."_type\d* *\= *[^\|]*/i","",$geobox);
		$n=count($par);
		$pa[0][0]="| ".$param."_type ";
		$pa[0][1]=$def;
		$pos=$forelikamed-strlen($pa[0][0]);		//lagom många " ";
		if ($pos>0){$pa[0][0].=substr($fyll,0,$pos);}
		$par[count($par)]=$pa[0][0]."= ".$pa[0][1];

	}

	$geobox=str_replace("###HÄR&&&¤¤¤###",implode("\r\n",$par)."\r\n",$geobox);
	$wp=str_replace($geo,$geobox,$wp);
	return ($wp);

}


function riktning($lat1,$long1,$lat2,$long2){ //modifierad från ny_finsk_sjo

	$ns=1; if ($lat1-$lat2<0){$ns=-1;}
	$we=1; if ($long2-$long1<0){$we=-1;}
	
	$lat_m  = ($lat2-$lat1);
	$long_m = cos(($lat1+$lat2)/2*pi()/180)*($long1-$long2);
	
	if ($lat1==$lat2 && $long1==$long2){echo "<font color='red'>Varning! Identiska koordinater</font>"; return('På samma plats'); }
	
	if ($lat_m>abs(2*$long_m) ){$riktn="nord-sydlig";}
	elseif (-$lat_m>abs(2*$long_m) ){$riktn="nord-sydlig";}
	elseif ($long_m>abs(2*$lat_m) ){$riktn="öst-västlig";}
	elseif (-$long_m>abs(2*$lat_m) ){$riktn="öst-västlig";}
	elseif ($long_m > 0 && $lat_m > 0){$riktn="sydöst-nordvästlig";}
	elseif ($long_m < 0 && $lat_m > 0){$riktn="sydväst-nordöstlig";}
	elseif ($long_m > 0 && $lat_m < 0){$riktn="sydväst-nordöstlig";}
	elseif ($long_m < 0 && $lat_m < 0){$riktn="sydöst-nordvästlig";}

	return ($riktn);
}

function regexpkoll($txt,$regexp){
	preg_match($regexp,$txt,$tmp);
	return (isset($tmp[0]));
	
}
##################OANVÄNDA FUNKTIONER###############################

function bantakml($kml){ //polygoner från Lantmäteriverket o.d, konverterade med qgis är ofta mycket otympliga, med många onödiga punkter (varken centimeter eller namometernoggranhet är av nöden, meter räcker väl) och kan därför behöva bantas

	$avvikelse=1; //ta bort om mellersta punkten av 3 ligger mer än $avvikelse meter från linjen mellan intilliggande punkter. HÄR BORDE BORTSTÄDNING AV ORIMLIGA PUNKTER OCKSÅ GÖRAS!!!

	unset($tmp);
	$kml=preg_replace("/\<coordinates *\>/","<coordinates>",$kml);
	preg_match_all("/\<coordinates\>[^\<]*/",$kml,$tmp);
	for ($i=0; $i<count($tmp[0]); $i++){ //för att klara exklaver/enklaver
		unset ($tmp1);
		preg_match_all("/((-|\d)+((\.|\d))* *, *(-|\d)+((\.|\d))* *)/",$tmp[0][$i],$tmp1);

		unset($tmp2);
		$tmp2= implode (",",str_replace(" ","",$tmp1[0]));
		$km=explode(",",$tmp2); //udda är lat, jämna long
		//if ($km[0].$km[1] != $km[count($km)-2].$km[count($km)-1]){
		$pos=count($km);
		$km[$pos]=$km[$pos-2]; $km[$pos+1]=$km[$pos-1]; $km[$pos+2]=$km[0]; $km[$pos+3]=$km[1];   //dubblerar slutvärde och sluter
		$j=0;
		$redu=10; $oredu=1; //för att avgöra när det inte är meningsfullt att städa kml-filen mer
		$kmny[0]=$km[0]; $kmny[1]=$km[1];
		$prop=cos(pi()/180*($km[1+2*round(count($km)/4)]+$km[1])/2); //tar cos av medel av två lat-värde 0,5 varv isär ur kml-filen, som får duga generellt
		$kmny=$km;
		while($redu>2){
			$redu=0;
			unset($km);
			$km=$kmny;
			unset($kmny);
			$pos=count($km);
			$km[$pos]=$km[$pos-2]; $km[$pos+1]=$km[$pos-1]; $km[$pos+2]=$km[0]; $km[$pos+3]=$km[1];   //dubblerar slutvärde och sluter
			$j=0;
			while($j<count($km)-6){
				$x[0]=$km[$j]; $x[1]=$km[$j+2]; $x[2]=$km[$j+4];
				$y[0]=$km[$j+1]; $y[1]=$km[$j+3]; $y[2]=$km[$j+5];
				if (!isset($allax)){$alla=0;} else{$alla=count($allax);}
				$allax[$alla]=$km[$j]; $allay[$alla]=$km[$j+1];
				if(avv($x,$y,$prop)<$avvikelse){
					if (isset($kmny)){$pos=count($kmny);}else {$pos=0;}
					$kmny[$pos]=round($x[2],5);$kmny[$pos+1]=round($y[2],5);
					$j+=4;
					$redu++;

				} else{
					if (isset($kmny)){$pos=count($kmny);}else {$pos=0;}
					$kmny[$pos]=round($x[1],5);$kmny[$pos+1]=round($y[1],5);
					$j+=2;
					$oredu++;
				}
			}
			//echo "<br/>".$redu." av ".($j/2)." punkter har tagis bort.<br/>";
		}
		$pos=count($kmny);
		$kmny[$pos]=$kmny[0]; $kmny[$pos+1]=$kmny[1];
		$kmlny="";
		for ($j=0; $j<(-1+count($kmny))/2; $j++){
			$kmlny.=$kmny[$j*2].",".$kmny[$j*2+1]." ";
		}
		$kml=str_replace($tmp[0][$i],"<coordinates>".$kmlny,$kml);
	}
	//echo "<br/>\n<textarea>".$kml."</textarea>";


	$ret[0]=$kml; $ret[1]=min($allax); $ret[2]=max($allax); $ret[3]=min($allay); $ret[4]=max($allay);

	return ($ret);
}


function avv($x,$y,$prop){ //$x och $y har tre koordinatpar vardera. returnerar avstånet (meter) mellan mittersta paret och linjen mellan de andra.  prop är cos (lat) som importeras för att spara cpu, då värdet oftast inte är kritiskt
	if($x[0]==$x[2] && $y[0]==$y[2]){return(0);}//tar bort när xy0==xy2, vilket även kan ta bort ev. "skaft" antingen det är önskvärt eller inte
	$grk=1852*60; //m/grad

	$a=($x[2]-$x[0])/$prop*$grk;
	$b=($y[2]-$y[0])*$grk;
	$c=($x[1]-$x[0])/$prop*$grk;
	$d=($y[1]-$y[0])*$grk;

	$e=($a*$a*$c + $d*$a*$b)/($b*$b+$a*$a);
	$f=($a*$b*$c+$b*$b*$d)/($a*$a+$b*$b);

	$avs=(sqrt(($c-$e)*($c-$e)+($d-$f)*($d-$f)));
	//echo round($avs)." ";
	return($avs);
}

?>