Selection from a mysql/ogr layer in php mapscript

A little phpsnippet for filtering out items from a layer. I have a layer “mobil” which may be on or off. This layer consists of a number of dataset collected at various times. There is one field ‘visible’ that is used to indicate if the dataset is of general interest (eg testing and calibration datasets are set with visible to false) The datasets do also belong to a project, indicated with a projectid in the table. There are also going to be some more items to filter on. Since I don’t know a priori how many items there will be filtered on, I am putting the filter expressions in an array and combining them with ‘and’ before I set the filter on the layer.

if($_GET['mobil']=='ON'){ // no reason to do this if the layer is not visible
	if(!($_GET['invisible']=='ON')){$filters[]="visible = 1";}
	if($_GET['project']*1){$filters[]="projectid = ".$_GET['project']*1;}
	if(count($filters)){ // if there are any items to filter on
		$qLayer = $map->getlayerbyname('mobil');
		$filter="where ".implode(" and ",$filters);
		$qLayer->setfilter($filter);
	}
}

This works for sql-based layers and maybe some others, for some types of layers, one needs to set filter and filteritem.

Posted in mapserver | Comments Off on Selection from a mysql/ogr layer in php mapscript

svn copy problem

Being a bit to eager when cleaning up a repository, I managed to remove a file too many from revision control. I still had the file sitting around, so I just readded it – but then the revision history had gone… I found a quite promising post at Markphip’s blog, but when I tried to follow that description,

svn copy -r498 -m “Restore history” file
:///home/users/radioecology/svn/AMAPds/branches/mobilweb/WaterfallApplet.java
file:///home/users/radioecology/svn/AMAPds/branches/mobilweb

(revision 499 was the one with the unfortunate remove) svn told me that “svn: Unable to find repository location for ‘file:///home/users/radioecology/svn
/AMAPds/branches/mobilweb/WaterfallApplet.java’ in revision 498”

No idea why, it definiately was there..

I am using Syntevos SmartSVN foundation as a front end on windows, tried to do a Modify -> copy within repository – that did not work either. At last I came across the mention of peg revisions and one
” svn cp file:///home/users/radioecology/svn/AMAPds/branches/mobilweb/WaterfallApplet.java@498 file:///home/users/radioecology/svn/AMAPds/branches/mobilweb/ -m “Restore”
” later and the file and history was back.No idea why the others did not work. Seems like a bit of black magic within svn – or maybe someone can explain exactly what happened.

Posted in Data | Comments Off on svn copy problem

Clas Olssons kortleser

Advarsel! Ikke kjøp Clas Olssons 3,5″ interne minnekortleser om du har en PC du må få montert den i. Den er tilsynelatende et par mm både høyere og bredere enn hva en 3,5″ enhet skal være, trenger skohorn for montering. dvs så langt har jeg bare prøvd to forskjellige maskiner, den går ikke inn i noen av dem, så det kan jo være at det finnes en odde maskin der ute et sted med litt for stor 3,5″ holder, evt at de to maskinene jeg har prøvd har krympet. Jeg har montert både 3,5″ harddisker, floppydisker og en tape stasjon eller to i mitt liv, men har så langt ikke opplevd noen som fysisk ikke passer.

Edit: På tredje forsøk fikk jeg stappet leseren inn, riktignok fikk jeg bare festet den med en skrue på hver side og så viste det seg at den maskinen jeg hadde funnet ikke hadde noen intern USB-head 😛

edit igjen: Det fikk jeg stappet den på plass i et chieftec kabinett. Det mente også at en 3.5″ skulle være litt smalere og var ikke enig i hvor skruehullene for en frontmontert enhet skulle være, men nå henger den da på plass der på et vis…

Posted in Diverse | Comments Off on Clas Olssons kortleser

Snøpakking…

Snøfreseren gav opp i går formiddag, dvs var nok sikkerhetssplit som røyk, men jeg har ikke funnet ut av hvor den sitter, men fant ut at kryddervogna (spice, eeh, space wagon 4×4) hånderte 30 cm våt snø overraskende bra og gjorde noen runder snøkomprimering før gjestene kom (vet jeg må betale for den når snøen begynner å smelte… Som en datter sa til noen som kjørte henne hjem for et par vintere siden; “Har du firehjulstrekk?” – “Nei vel, da bør du ikke kjøre inn innkjørselen vår”)

Posted in Data | Comments Off on Snøpakking…

Parsing json array using uLkjson

Back into delphi7…

Needing to transfer some data over the net from a server to my delphi application, it seemed like a good idea to use JSON and according to json.org there are no less than three libraries for parsing json in delphi. The first one webstart / Delphi web utils looked pretty good, but all documentation and examples was in Spanish… Well, learning Spanish is no bad plan, but not today.

The next one, JSON Delphi Library, uLkJSON seemed a bit more simple. No documentation but a few examples – of which none covered arrays which I needed to use…

At last, JSON superobject seemed to have everything, but didn’t compile under delphi 7.

Well, then, use the source, Luke,

Digging through the source of uLkJSON, i managed at least to dig information out of the arrays I had put up. Having a form with a Memo named Memo1, this lists the names and values of the arrays into the Memo:

procedure listarray(returnval: string);
var
  systems : TStrings;
  returnval: string;
  json,item:TlkJSONbase;
  i,j: integer;
  list: TlkJSONObject;
begin
  json:= TlkJSON.ParseText(returnval);
  for i:=0 to pred(json.Count) do begin
    item:=TlkJSONObject(json).child[i]; 
// This is the named array, name in name, the array in Objvalue
    Memo1.Lines.Add(TlkJSONobjectmethod(item).Name);
    list:=TlkJSONobject(TlkJSONobjectmethod(item).Objvalue);
{   list is the array it self. This may be too much jiggling back and forth between object types, but at least it works...}
    for j := 0 to pred(TlkJSONobject(list).count) do
      Memo1.Lines.add('->'+tlkJSONlist(list).Child[j].Value);
    end;
  end;
end;

Not too hard, — if it just had been some documentation or an example on this, that would have saved me a day. Hopefully this saves a day for someone else.

Posted in Data | 3 Comments

Lebkuchen

Siden vi ikke fikk kjøpt lebkuchen til oss selv da vi var i Gotha i slutten av november, har vi bakt det selv etter oppskriften i oldefar Sickels kokebok fra Konditorei Lösche i Gotha. Om enn, med 52 egg er den kanskje litt i største laget for de fleste…

3 kg sukker
52 egg, piskes lett
250 gr ristede mandler
375 gr sitronat eller apsikat
4 sitroner (står det, men det må være skall fra sitronene)
120 gram kanel
30 gram nellik
50 gram hjortetakksalt
4 kg siktet hvetemel
100 gram honning

10 kg deig, kaker a ca 30 gram, skulle bli 350 kaker. – prøvde meg fram med å delepå 10, men dette var så vellykket at neste år blir det 1/5 av konditorposjonen.

Ingen videre beskrivelse, slikt kan konditoren, men det blir vel omtrent som beskrevet her.

Vel for å komme til saken – mine mål – kan sikkert halveres …

600 g sukker
10 egg, piskes lett
50 gr ristede mandler
75 gr sitronat eller apsikat
skall av 1/2 sitron
25 gram kanel
6 gram nellik
10 gram hjortetakksalt
800 g siktet hvetemel
20 gram honning

Visp lett sammen egg og sukker og rør inn honning. Hakk mandler og apsikat. Bland sammen mel, hjortetakk, krydder, mandler og aspikat og bland det deretter med eggeblandingen. La deigen så en times tid etter at den er rørt sammen. Om mulig, skaff oblater til underlag, sett deigen med en teskje (kakene hever mye og er mektige) og stek på 210-220 grader i ca 10 minutter. NB kakene kan sette seg svært godt fast i underlaget. Bruk eventuelt bakepapir smurt ekstra med smør om man ikke har oblater.

Neste år blir det med bakeoblater.

Kakene hever mye og flyter litt utover, så gi dem god plass, ikke la brettet med kaker få stå noe særlig tid før det settes i ovnen.

Lag melisglasur med sitronsaft og stryk over mens kaken fortsatt er varm. For å unngå at de blir tørre, la dem kjøle en stund på bakeplaten og legg dem i tett boks eller pose så raskt som mulig.

Posted in Julekaker, Mat | Comments Off on Lebkuchen

ECEF – lat/lon conversion

I needed to do a ecef (earth centered earth fixed) to lat lon conversion in delphi. Following the formulaes found in Wikipedia the following procedure was made:

procedure ecef2latlon(X,Y,Z : extended; var lat,lon,h : real);
// returns lat with 6 digs accuracy, eg approx 0.1 m uncertainty.
// Lon as accurate as the intrisic arctan2() function

var
  r, e2, f, g,c,s,p,q,r0,u,v,z0,phi,lambda : extended;
const
    // These constants are for wgs84
   a=6378137.0;
   b=6356752.3142;
   ecc2=6.69437999014E-3; // 
   ecc22=6.73949674228E-3;
begin
  r:=sqrt(x*x+y*y);
  e2:=a*a-b*b;
  f:=54.0*b*b*Z*Z;
  g:=r*r+(1-ecc2)*Z*Z+ecc2*e2;
  c:=ecc2*ecc2*f*r*r/(g*g*g);
  s:=power((1+c+sqrt(c*(c+2))),1/3);
  p:=f/(3*power((s+1/s+1),2)*g*g);
  q:=sqrt(1+2*ecc2*ecc2*p);
  r0:=-(p*ecc2*r)/1+q+sqrt(0.5*a*a*(1+1/q)-p*(1-ecc2)*z*z/(q*(1+q))-0.5*p*r*r);
  u:=sqrt(power((r-ecc2*r0),2)+z*z);
  v:=sqrt(power((r-ecc2*r0),2)+(1-ecc2)*z*z);
  z0:=b*b*z/(a*v);
  h:=u*(1-b*b/(a*v));
  phi:=arctan((z+ecc22*z0)/r);
  lambda:=arctan2(y,x);
  lat:=phi/pi*180;
  lon:=lambda/pi*180;
end;

To check the result, I ported the code to bc:

define cbrt(x) {
return(e(l(x)/3)) } 

define sgn(x) {
        if (x == 0) {
                return(0);
        } else if (x < 0) {
                return(-1);
        } else if (x > 0) {
                return(1);
        }
}

define abs(x) {
        if (x < 0) {
                return(-1 * x);
        } else {
                return(x);
        }
}

define atan2(y, x) {
        auto pi, fi;
        pi = 4 * a(1);
        if (y == 0) {
                if (x > 0) {
                        return(0);
                } else if (x == 0) {
                        print "undefined\n";
                        halt;
                } else if (x < 0) {
                        return(pi);
                }
        }
        fi = a(abs(y/x));
        if (x > 0) {
                return(fi * sgn(y));
        } else if (x == 0) {
                return(pi * sgn(y) / 2);
        } else if (x < 0) {
                return((pi - fi) * sgn(y));
        }
}


pi=a(1)*4

x=3147484.89
y=589403.67
z=5497533.82

a=6378137.00000000000000000;
b=6356752.31420000000000000000;
ecc2=6.694379990140000000000000E-3;
ecc22=6.73949674228000000000000E-3;

   r=sqrt(x*x+y*y);
  e2=a*a-b*b;
  f=54.0*b*b*z*z;
  g=r^2+(1-ecc2)*z^2+ecc2*e2;
  c=ecc2*ecc2*f*r*r/(g*g*g);
  s=cbrt(1+c+sqrt(c*(c+2)));
  p=f/(3*(s+1/s+1)^2*g*g);
  q=sqrt(1+2*ecc2*ecc2*p);
  r0=-(p*ecc2*r)/1+q+sqrt(0.5*a*a*(1+1/q)-p*(1-ecc2)*z*z/(q*(1+q))-0.5*p*r*r);
  u=sqrt((r-ecc2*r0)^2+z*z);
  v=sqrt((r-ecc2*r0)^2+(1-ecc2)*z*z);
  z0=b*b*z/(a*v);
  h=u*(1-b*b/(a*v));
  phi=a((z+ecc22*z0)/r);
  lambda=atan2(y,x);
  lat=phi/pi*180;
  lon=lambda/pi*180;

lat
lon

Saving this as a file, eg ecef.bc and piping it through bc (i.e. bc -l < ecef.bc) should yield the result

59.94721465915728162420
10.60647008394438896040

Using the above set x,y and z values in delphi should of cource yield the same result, give or take rounding errors.
Delphi (v7) and bc gives the same result to the 7th decimal place for latitude (59.9472147) that is approx mm presicion, which should be sufficient in most cases. A commersial, closed source, although mathlab based system I am using agrees with those two to the 5th decimal, eg 10cm presicion. As it is not possible to see what kind of data types are used in the commersial application, I would put the highest trust on bc. Although the code only has been tested in delphi, it is written in pretty general pascal and should work just as well for most pascal compilers.

In php, I use the following function:


function ecef2lla($x,$y,$z){
// WGS84- parameters:
$a = 6378137;
$e = 8.1819190842622e-2;
$b   = sqrt(pow($a,2)*(1-pow($e,2))); // ok 2517.0298622171
$ep  = sqrt(($a*$a-$b*$b)/pow($b,2)); // ok 2533.9931794567
$p   = sqrt($x*$x+$y*$y); // ok
$th  = atan2($a*$z,$b*$p);
$lon = atan2($y,$x); // ok
$lat = atan2(($z+($ep*$ep*$b*pow(sin($th),3))),($p-($e*$e*$a*pow(cos($th),3))));
$N   = $a/sqrt(1-$e*$e*pow(sin($lat),2));
$alt = $p/cos($lat)-$N;
# return lon in range [0,2*pi)
//$lon = $lon%(2*pi());
$lat=$lat/pi()*180;
$lon=$lon/pi()*180;
$ret['lat']=$lat;
$ret['lon']=$lon;
$ret['alt']=$alt;
return $ret;
}

This yields:
lat=59.947216007022
lon=10.606470083944

I.e. about meter presicion – maybe good enough, maybe not.

Posted in Data | Comments Off on ECEF – lat/lon conversion

Undeleting in Linux

På Norsk

I accidentially deleted a lot of files from a memory card (xd-card, but the type shouldn’t matter). As I am only running Linux at home, the commersial solutions for windows that turned up on google were not usable, but the soulution turned out already to be there, just under my desktop, fsck.vfat:

carex:/home/morten# fsck.vfat -r -y -u /dcim/100_fuji/dscf2389.jpg /dev/sda1
dosfsck 2.11, 12 Mar 2005, FAT32, LFN
Undeleting DSCF2389.JPG
Performing changes.
/dev/sda1: 69 files, 3343/15994 clusters

Luckily, I knew a file name. I started off with the last file, and worked backwards until fsck.vfat didn’t yield any more files. As I lost my cound, I managed to try to unerase some files twice, which truncated the file to 0 bytes, but the file showed up at the root of the file system:

[morten@carex ~]$ ls -l /mnt/cam/fsck000*
-rwxr-xr-x  1 morten morten 868352 1979-12-31 23:00 /mnt/cam/fsck0000.rec
-rwxr-xr-x  1 morten morten 868352 1979-12-31 23:00 /mnt/cam/fsck0001.rec
-rwxr-xr-x  1 morten morten 851968 1979-12-31 23:00 /mnt/cam/fsck0002.rec

Three mvs later everyting was OK.

This job looked quite scriptable, but for some reason, that did not work:

carex:/home/morten# for i in 9 8 7 6 5 4 3 2 1 0; do 
>fsck.vfat -y -r -u /mnt/cam/dcim/100_fuji/dscf242$i.jpg /dev/sda1
>done
dosfsck 2.11, 12 Mar 2005, FAT32, LFN
Warning: did not undelete file DSCF2429.JPG
/dev/sda1: 27 files, 1303/15994 clusters
dosfsck 2.11, 12 Mar 2005, FAT32, LFN
Warning: did not undelete file DSCF2428.JPG
/dev/sda1: 27 files, 1303/15994 clusters

Of cource, all this has to be done as root

Hope this can help somebody else aswell. At least, it saved my marriage as the pictures were taken by my wife in her job…

Posted in Data | 1 Comment

Ingen ble syke!

men kan journalistikken friskmeldes?

NRK Hedmark og Oppland skriver med litt sjokkerte undertoner om et forsøk som har vært gjort med tilsetning av adjuvans, eller snarere, slik jeg forstår beskrivelsen i Store Norske Leksikon en adjuvans i vaksine. Det ser ut som om det er virkelig skummelt og ille at man har testet dette på mennesker (til og med folk fra innlandet!). Fra forsiden henvises det med “1000 personer i omstridt svineinfluensa-forsøk” uten å finne noen som peker på noe som helst problem med forsøket. Hva mener egentlig NRK, skal man la være å videreutvikle medisin, eller mener de at man skal bruke den direkte uten å teste den ut først?

Og som om ikke det var ille nok med at man tester stoffet på innlendinger: “Forsøkspersonene vet ikke om de har fått det omstridte stoffet i seg. Forsøket er nemlig så hemmelig at verken lege eller forsøksperson vet hvem som har fått hva.” Det er meg bekjent helt standard prosedyre ved uttesting av medisin. Placebo er en reel og av og til kraftig effekt og legene kan også bevisst eller ubevisst tippe forsøket i en gitt reting.

La aldri fakta komme i veien for et godt oppslag er jo etter sigende en gammel journalistist leveregel. Og du verden hvor kjedelig det ville være å være journalist om man ikke kunne overdramatisere når nødvendig…

Posted in Diverse | Comments Off on Ingen ble syke!

Eplejekk v 1.1

Eplejekken har blitt litt reparert og modifisert siden sist. Toppbjelken brakk i fjor, den er nå erstattet og avstivet med et metallstykke. Dessuten er selve avtappingen endret. Tidligere rant juicen rett gjennom og ned i en balje, nå samles den opp i en voksduk og føres ned i et kar ved siden av pressen.

Dette systemet er mye enklere å håndtere, da det ikke er nødvendig å flytte pressen for å få tak i juicen. Det blir også mindre svinn, og fare for uhell, med at det blir en overhelling mindre. Juicen helles nå fra karet den samles opp i over i et 1-liters litermål og deretter til melkekartonger for frysing. Tidligere var det nødvendig å helle den over fra baljen til en stor gryte el.l. siden en balje som er stor nok til å plassere pressen på samtidig blir uhåndterlig å helle av.

Grei bruk av pressa med ca 12 kg epler pr runde. Dette gir ca 6 liter saft med litt ekstra arbeide.

Fler (eller var det mer) eplesider

Fler bilder på picasaweb.

Posted in epler | Comments Off on Eplejekk v 1.1