ITI0011-13-HW2-Panoramio

Allikas: Lambda

Tagasi ITI0011 lehele.

Panoramio

Kirjutada programm, mis käsurealt ette antud argumenti tõlgendab geograafilise asukohana (linn/piirkond/riik vms) ning küsib vastava asukoha kohta piltide nimekirja Panoramiost.

Programmile etteantav argument tuleb kõigepealt teisendada geokoordinaatideks. Selleks kasutada Google Maps API-t, näiteks: http://maps.googleapis.com/maps/api/geocode/xml?address=Tallinn&sensor=false . Täpsemalt võib API kohta lugeda siit: https://developers.google.com/maps/documentation/geocoding/

Sealt tuleb välja otsida koordinaadid bounding box elemendi "bounds" seest.

<GeocodeResponse>
 <status>OK</status>
 <result>
  ..
  <geometry>
   ..
   <bounds>
    <southwest><lat>59.3518090</lat><lng>24.5501939</lng></southwest>
    <northeast><lat>59.5914239</lat><lng>24.9262889</lng></northeast>
   </bounds>
  </geometry>
 </result>
</GeocodeResponse>


Samad koordinaadid tuleb anda ette Panoramio API-le, näiteks: http://www.panoramio.com/map/get_panoramas.php?set=public&from=0&to=20&minx=24.550193&miny=59.351809&maxx=24.9262889&maxy=59.5914239&size=medium&mapfilter=true . Täpsemalt võib Panoramio API kohta lugeda siit: http://www.panoramio.com/api/data/api.html

Panoramio API annab vastuseks JSON formaadis tulemuse. Piltide andmed asuvad "photos" massiivis. Iga pildi kohta tuleb välja parsida ja salvestada pildi nimi (photo_title), pildi tegemise kuupäev (upload_date) ja pildi autor (owner_name).

{"count":1875,"has_more":true,"map_location":{"lat":59.438560500000001,"lon":24.752405745157176,"panoramio_zoom":7},
"photos":[{"height":335,"latitude":59.444141000000002,"longitude":24.765032000000001,"owner_id":6304679,
"owner_name":"Kalev Vask","owner_url":"http://www.panoramio.com/user/6304679",
"photo_file_url":"http://mw2.google.com/mw-panoramio/photos/medium/81410373.jpg","photo_id":81410373,
"photo_title":"Barque Kruzenshtern, Tallinn Maritime days 2011",
"photo_url":"http://www.panoramio.com/photo/81410373","upload_date":"31 October 2012","width":500},
...
]}

JSON-i stringid sisaldavad multibyte sümboleid escape'itud kujul (näiteks \u044e). Selleks, et see muuta vastavaks sümboliks, võite kasutada järgmist koodijuppi:


	/**
	 * A quick and dirty function to parse json encoded unicode
	 * string into Java String.<p>
	 * 
	 * The function finds all multi-byte symbols in the form \\uXXXX 
	 * (with one \). The part after u is treated as hexadecimal number
	 * representing the code of one symbol.
	 *  
	 * @param jsonString Encoded json string
	 * @return Java String
	 */
	public static String parseUnicodeJsonString(String jsonString) {
		String s = "";
		int i;
		for (i = 0; i < jsonString.length() - 5; i++) {
			String part = jsonString.substring(i, i + 6);
			Matcher m = Pattern.compile("\\\\u([0-9a-zA-Z]{4})").matcher(part);
			if (m.matches()) {
				s += Character.toString((char) Integer.parseInt(m.group(1), 16));
				i += 5;
				continue;
			}
			s += jsonString.charAt(i);
		}
		while (i < jsonString.length()) {
			s += jsonString.charAt(i++);
		}
		return s;
	}

Encoding

Lisainfot tähekodeeringutest.

Väljastades kirillitsa tähestiku võivad tähed olla loetamatud. See on tähekodeeringu (encoding)-u probleem. Kui programm käivitada Eclipse-i sees ja määrata console-i väljundi kodeeringuks UTF-8, siis peaks kõik ilusti töötama.

  • Eclipse console
    • Piisab, kui väljund töötab ja on loetav Eclipse-i sees 'console'-s
    • Kontrolli, et "run configuration" > "common" > "Encoding" oleks "UTF-8" (mitte Cp1257)

Windows-i käsureal töötamiseks tuleb enne programmi käivitamist muuta tähekodeering chcp käsuga. (ik. change codepage) ja kasutatavat "font"-i.

  • Käsurida (Windows)
    • chcp 65001
    • properties > font > "Lucida console"
  • Linuxi (Ubuntu) käsurida töötab teadaolevalt lisakonfigureerimiseta

Punktid

Põhiosa - 5p

Programm suudab etteantud asukoha pildid trükkida välja suvalises järjestuses (näiteks selles samas, mis nad olid Panoramio API-st saades). Välja tuleb printida pildi nimi, pildi tegemise kuupäev ja pildi autor.

Nõuded:

  • Programm peab olema juhitav käsurea parameetritega (kujul: java -jar Panoramio.jar -sort title Tallinn). Programm ei tohiks käivitamise ajal kasutajalt sisendit küsida (kui juba küsib, siis ümber ei pea tegema; oluline on, et kõiki asju saab juhtida ka käsurea parameetritega).
  • Kui programmi käivitamisel ei anta kaasa parameetreid, tuleks vastav teade kuvada koos juhendiga.
  • Arvestama peaks olukordadega (tuleks kasutajale anda vastav "ilus" teade):
    • kui ei saa serveriga ühendust
    • kui google maps'ist tulev vastus on tühi (sellist asukohta ei leita)
    • panoramiost tulev vastus on tühi (pilte ei leitud)
  • Kõik meetodid ja objekti muutujad peaksid olema dokumenteeritud (javadoc).

Puhverdamine - 3p

Programm puhverdab tulemused kõvakettale (faili). Iga asukoha kohta on eraldi puhver (fail).

Võimaldab käsurea parameetriga forsseerida veebist lugemist, isegi kui puhvrifail on olemas. Sellisel juhul kirjutatakse puhvrifail üle. (puhver + forsseerimine, 1p)

Võimaldab käsurea parameetriga lugeda veebist uued andmed ja kuvada välja vaid need, mida puhvris veel ei ole (kui puhver puudub, siis kuvatakse kõik tulemused). Seda saad testida selliselt, et kustutad oma puhvrifailist mõned kirjed ära ja kordad päringut. (2p)

Nõuded:

  • tuleb arvestada olukordadega (ja anda vastav "ilus" teade):
    • kui faili ei saa luua
    • kui tekib viga andmete lugemisel, siis vigast sisu ei tasuks puhverdada. Ehk siis kui forsseeritud lugemisel tekib ühenduse viga ja tulemuseks on 0 pilti, siis seda ei tasuks puhverdada.
  • Tallinn ja tallinn võiks samasse faili olla puhverdatud
  • Puhvrifail võiks olla tekstifail (sedasi saab testida, kas süsteem leiab mittepuhverdatud pildid üles). Kui mingil põhjusel kasutate binaarfaili, siis küll leiame lahenduse selle punkti testimiseks (teil on endal võib-olla raskem testida).

Sorteerimine - 2p

Võimaldab tulemusi sorteerida pildi nime, pildi autori nime, pildi tegemise kuupäeva järgi. (1p)

Sorteerida saab ka tagurpidises järjekorras (reverse / descending). (1p)

Nõuded:

  • Sortimine tekstiväljade järgi peaks olema mitte tõstutundlik (ignore case). Ehk siis a ja A on mõlemad eespool (või tagapool, kui kasutatakse tagurpidi sortimist) kui b ja B.