Google MapAPI – Zobrazení Google mapy definované v komponentě

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Oli
Člen | 1215
+
0
-
  • Nette: >= 2.0 nebo novější
  • PHP: >= 5.3 nebo novější
  • Git

Jedná se o komponentu, která vykresluje Google mapu na základě hodnot definovaných v presenteru.

Je to můj první pokus o doplněk a první práce s Gitem, tak mě prosím nekamenujte, jestli je něco blbě. :-)

Editoval Oli (17. 1. 2014 13:52)

Šaman
Člen | 2659
+
0
-

Tak mě ve FF nejde ani přetahovat, ani vytvářet nové body. A to hned po příchodu na stránku, bez refreshe.

Oli
Člen | 1215
+
0
-

Šaman: Sorry, asi jsem to špatně vysvětlil. Musíš jít na stránku Uložení bodů do databáze. Tam je navkládáš a to kam odkazuje odkaz na demo je ta „produkční část“, kde se po kliknutí zobrazí bublinka.

Mělo by to takhle jít, alespoň teď jsem to zkoušel na serveru a šlo to ;-) (Mám myslím nejnovější FF)

Šaman
Člen | 2659
+
0
-

Zajímavé, teď to funguje jak píšeš, předtím jsem samozřejmě zkoušel i ten odkaz a nějak mi to body nevkládalo.. nevím, kde může být chyba, v tom kódu ji nevidím, osobně bych ji tipoval někde v AJAXu.

Oli
Člen | 1215
+
0
-

Je možný, že se to nenačetlo celé, ono tam bylo necelých 500 markerů, tak jsem promazal databazi…

Problém je, že by to mělo vkládat stejný kód. Foreachem projdu všechny už přidané markery a zavolám tu funkci, která se volá na onlick na mapu. Tam by žádný rozdíl být neměl. Jinak tenhle problém řeším v AJAX vlákně. Každopádně díky. ;-)

BTW. Je tenhle doplněk vubec smysluplný? Ještě jsem si říkal, že bych ho rozšířil o vyhledávání podle adresy a vlstní ikonky markerů. Pro mou potřebu to ale zatím nepotřebuju. Tak jestli je ten doplněk useless, tak bych se na to vykašlal, dokud to nebudu potřebovat.

Případně kdyby měl někdo nějaké nápady na vylepšení/rozšíření, tak sem s nimi.

Oli
Člen | 1215
+
0
-

Vydání přepracované verze: https://github.com/…ek/GoogleAPI

1.0

  • Odstranění vkládání markerů, se kterými byl problém
  • Rozdělení mapy a markerů do tříd
  • Odesílání markerů lazy až po načtení mapy pomocí JSONu
  • Obarvování defaultních markerů 10 barvami
  • Vlastní ikonky markerů

Příklady použití a základní popis metod v gitu.

JL
Člen | 24
+
0
-

Zkoušel jsem nasadit a narazil jsem na dvě věci:

  • myslím že by měl boundsListener dostávat na řádku 43 šablony template.latte aktuální obsah proměnné zoom, jinak nemá konstruktor třídy žádný vliv
  • pokud si stáhnu zdrojové kódy do složky others ve vendor, pak mi to běží v pohodě, když si stáhnu přes composer, tak mi sice NetBeans napoví úplně stejnou cestu, ale Nette hlásí Class 'Oli\GoogleAPI\MapAPI' not found, což asi úplně nesouvisí s doplňkem, ale je to divné, temp smazaný, když složku přesunu do složky jiného doplňku, nebo i nette tak to nepomůže, když ho strčím do others, jako zázrakem vše běží

Díky, J.

Michal Vyšinský
Člen | 608
+
0
-

Předpokládám, že z others ti načítá RobotLoader – takže to pak funguje.

Nefunkčnost při instalaci přes composer je způsobena absencí nastavení autoloadingu v ‚olicek/google-map-api‘

Oli
Člen | 1215
+
0
-

Ten zoom by měl být opraven. Díky za report.

Composer jsem předtím moc nepoužíval. Každopádně mě to dělá taky a vubec nevím jak mám ten autoloading nastavit. Zkoušel jsem se inspirovat jak v kdyby, nette tak v grido, ale nic z toho mi nefungovalo. Mohl by mi někdo poradit jak to nastavit? Díky!

Azathoth
Člen | 495
+
0
-

Zdravím a chtěl bych se zeptat, jestli bude v budoucnu možnost zaregistrovat tento addon do config.neon pomocí extensions.

Oli
Člen | 1215
+
+1
-

Zrovna dneska jsem na tom dělal. Podle casu to snad do konce týdne bude :) plus bych chtěl implementovat kolekce markerů

Azathoth
Člen | 495
+
0
-

Tak sem to na stránkách rozchodil a vypadá to krásně!
Akorát mi nefunguje zoom :(
Ať jej nastavuji jakkoli, tak se zoom na mapě nemění.

Editoval Azathoth (10. 9. 2014 0:02)

Azathoth
Člen | 495
+
0
-

Tak jsem našel příčinu a měl bych jednu otázku:

function initialize() {
		var centerMap = new google.maps.LatLng({$position[0]}, {$position[1]});
		bounds = new google.maps.LatLngBounds();
		var mapOptions = {
			center: centerMap,
			zoom: {$zoom},
			mapTypeId: google.maps.MapTypeId.{!$type}
		};

		// Display a map on the page
		map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
		map.setTilt(45);
		marker =  new google.maps.Marker;
		loadMarkers();


		// Override our map zoom level once our fitBounds function runs (Make sure it only runs once)
		var boundsListener = google.maps.event.addListener((map), 'bounds_changed', function(event)
		{
			this.setZoom(5);
			google.maps.event.removeListener(boundsListener);
		});
	}

Mohl bych se zeptat, jestli je tam opodstatněný ten řádek this.setZoom(5);?

Oli
Člen | 1215
+
0
-

Má tam být {$zoom} (v masteru to je), ale fit bounds mám pocit stejně pořádně nefunguje. Do příští verze bych to měl fixnout.

Jinak když najdeš něco co ti tam chybí nebo nefunguje tak klidně založ issue nebo pošli PR. Jsou tam implementovaný vesměs jenom věci co jsem potřeboval sám.

Azathoth
Člen | 495
+
0
-

aha, už to vidím, já jsem si stahnul release v1.0.1, moje chyba.

Oli
Člen | 1215
+
+1
-

Vydání přepracované verze: GoogleMap

2.0

Google Map API

  • Registrace komponenty jako extension v configu
  • Přidána možnost definovat si mapu a markery v configu
  • Přidána podpora pro markerClusterer
  • Bounds bug fix
  • Zoom bug fix
  • Auto open message bug fix

Dokumentace v gitu

Azathoth
Člen | 495
+
0
-

Skvělé! Tak verze 2.0 se mi strašně líbí, skvěle se s ní pracuje, díky za ni.

Azathoth
Člen | 495
+
0
-

Právě jsem zjistil, že tenhle addon má licenci GNU GPL. Vzhledem k tomu, že chci google mapy použít ve stránkách, za které chci dostat zaplaceno, tak bohužel tenhle addon musím ze svých stránek vyhodit :(
Nezvažoval jsi použití LGPL, MIT nebo new BSD licence?
Ten addon se mi opravdu líbí, ale pokud jsem správně pochopil GNU GPL, tak by se GNU GPL rozšířilo na celé mé stránky a musel bych je poskytnout zdarma, což se mi opravdu nechce.

Oli
Člen | 1215
+
0
-

@Azathoth jasně. Ono to není žádný záměr, jde spíš o to, že když jsem ten doplněk vytvářel, tak jsem vzal první na kterou jsem narazil (má ji i Nette, spolu s BSD) a už tam zůstala. Mám kvůli tomu vytvářet tag 2.0.1 nebo ti to stačí v masteru? udělal bych ho až by byla nějaká změna v kodu…

Azathoth
Člen | 495
+
0
-

Stačí v masteru, děkuji moc.

libik
Člen | 96
+
0
-

Planujes moznost vyuziti kml souboru? V soucasnosti pouzivam select box pro prepinani jednotlivych kml souboru s polygony a placemarky (exportovane mapy z google maps).

Oli
Člen | 1215
+
0
-

No, do teď jsem to nepotřeboval → nevěděl jsem, že něco takovýho existuje. Zběžně jsem na to kouknul. To propojení s mapou je pokaždé záležitost 4 řádků kodu (viz.)?

To by mohlo jit. Pokud je to složitějšího, tak to klidně zkus implementovat a poslat PR. Na něco složitějšího teď asi nebudu mít čas.

tom
Člen | 171
+
0
-

Ahoj,
chtěl bych na základě množiny dané bodů vykreslit trasu, ideálně aby se jednalo o nejkratší trasu mezi těmito body. Dá se k něčemu takovému použít tato komponenta?

Případně poradil by někdo jak takový problém řešit?

Díky

Oli
Člen | 1215
+
0
-

Ahoj, pokud vím, tak existujou 2 podobný doplňky google mapy pro Nette a ani jeden to neumí. Jestli chceš, tak to můžeš zkusit implementovat a poslat pullrequest. ;-) Teď na to bohužel nemám vubec čas a dostal bych se k tomu nejdřív tak za 14 dní, spíš za měsíc.

Co jsem se tak koukal v rychlosti na příklad, tak to nevypadá vůbec složitě. Respektive složitě pro doplnění do Google MapAPI. Markery už máš předaný do šablony, jen by byla potřeba implementovat ta metoda calcRoute.

Je to pěkná funkce, která by tam rozhodně mohla bejt. ;-)

tom
Člen | 171
+
0
-

A existuje nekde priklad pouziti? Zkousim si to rozbehnout na PHP 5.3 ale moc se mi nedari. Dik

Oli
Člen | 1215
+
0
-

Koukal jsem se na to trochu a s PHP 5.3 by to mělo fungovat. Jak jsi to implementoval? Podle ukázek v readme by to mělo jít. Jaký máš Nette? testoval jsem to myslím jen na 2.2.

Případně co ti to hází za chyby?

tom
Člen | 171
+
0
-

Oli napsal(a):

Koukal jsem se na to trochu a s PHP 5.3 by to mělo fungovat. Jak jsi to implementoval? Podle ukázek v readme by to mělo jít. Jaký máš Nette? testoval jsem to myslím jen na 2.2.

Případně co ti to hází za chyby?

Tak třeba v MapApiExtension jsem musel místo

<?php
->addSetup('setKey', [$config['key']])
?>

použít

<?php
->addSetup('setKey', array($config['key']))
?>

atd …

Potom třeba trait (trait TMap) PHP 5.3 taky myslím nemá …

Oli
Člen | 1215
+
0
-

aha, to je možný, že tam takovýhle chyby jsou. Psal jsem to původně pro PHP 5.3, ale pak jsem přešel na 5.4. Tyhle kratší zápisy pole jsou strašně návykový ;-)

Ttraity 5.3 nemá, ale můžeš uplně klidně vykopírovat obsah traity a vložit ho do presenteru. To je v podstatě taky to, co ta traita dělá za tebe :-)

Povedlo se ti to nakonec rozchodit? jestli jo, poslal by jsi prosím PR s oravama těch polí, nebo jestli ještě na něco narazíš? Jestli ne, tak jak budu mít čas tak se na to kouknu sám.

Každopádně díky moc za report! :-)

tom
Člen | 171
+
+1
-

Ahoj, zatím jsem se k tomu nedostal, musím řešit ještě něco jiné. Pokud to rozběhnu tak dám určitě vědět.

01laky
Člen | 18
+
0
-

Ahoj…Pri vytvarani komponenty mi pise toto : Call to a member function create() on null
Nevies kde mam chybu?

<?php

namespace GoogleMapModule;

use GoogleMapModule\GoogleMapFacade;
use Nette\Application\UI\Control;
use Nette\Application\UI\Form;
use GoogleMap;
use \Oli\GoogleAPI\TMap;
//use Nette\Http\IResponse;


class GoogleMapControl extends \BaseControl
{
    /**
     * @var \GoogleMapModule\GoogleMapFacade
     */
    private $googleMapFacade;

    /**
     * @var \GoogleMapModule\Directions
     */
    private $map;
    private $markers;

    public function __constructor(\Oli\GoogleAPI\IMapAPI $mapApi, \Oli\GoogleAPI\IMarkers $markers)
    {
        dump($this->map);exit;
        $this->map = $mapApi;
        $this->markers = $markers;
    }



    public function createComponentGoogleMap()
    {
        $map = $this->map->create();
        $markers = $this->markers->create();
        $map->setCoordinates(array(41.15, 15.65));
        $map->setProportions('400px', '250px');
        $map->setKey('E0-969eVOnuOSHb79UsS_gSI');
        $gmap->initialZoom = 12;
        $map->setType(MapAPI::SATELITE);
        //$map->isStaticMap();
        return $map;
    }

}
?>
tom
Člen | 171
+
0
-

01laky napsal(a):

Ahoj…Pri vytvarani komponenty mi pise toto : Call to a member function create() on null
Nevies kde mam chybu?

<?php

namespace GoogleMapModule;

use GoogleMapModule\GoogleMapFacade;
use Nette\Application\UI\Control;
use Nette\Application\UI\Form;
use GoogleMap;
use \Oli\GoogleAPI\TMap;
//use Nette\Http\IResponse;


class GoogleMapControl extends \BaseControl
{
    /**
     * @var \GoogleMapModule\GoogleMapFacade
     */
    private $googleMapFacade;

    /**
     * @var \GoogleMapModule\Directions
     */
    private $map;
    private $markers;

    public function __constructor(\Oli\GoogleAPI\IMapAPI $mapApi, \Oli\GoogleAPI\IMarkers $markers)
    {
        dump($this->map);exit;
        $this->map = $mapApi;
        $this->markers = $markers;
    }



    public function createComponentGoogleMap()
    {
        $map = $this->map->create();
        $markers = $this->markers->create();
        $map->setCoordinates(array(41.15, 15.65));
        $map->setProportions('400px', '250px');
        $map->setKey('E0-969eVOnuOSHb79UsS_gSI');
        $gmap->initialZoom = 12;
        $map->setType(MapAPI::SATELITE);
        //$map->isStaticMap();
        return $map;
    }

}
?>

tohle

<?php
dump($this->map);exit;
?>

je tam podezrele

jiri.pudil
Nette Blogger | 1029
+
+4
-

__constructor je ještě podezřelejší

01laky
Člen | 18
+
0
-

Dekuji :)

Oli
Člen | 1215
+
0
-

Každopádně už vím, kde @01laky přišel na ten constructor :-)

Oli
Člen | 1215
+
0
-

2.1

  • Odstraněna závislost na jQuery
  • Přidána možnost zablokovat zoom kolečkem myši při najetí nad mapu
  • Přidána možnost vykreslit trasu mezi definovanými body

Obsahuje BC, kdy už se nepoužívá {control map:js} a {control map:html}, ale jen {control map}. Js je samostatný soubor, který je možné vložit do šablony nejlépe pomocí webloaderu

Dokumentace v gitu

n.u.r.v.
Člen | 485
+
0
-

Ahoj, nainstaloval jsem si tento doplněk a zkouším zatím příklady z dokumentace, ale narážím na problémy v googleMapAPI.js…

První problém byl na řádku cca 226 init()… musel jsem dát this.init():

witch (functionName)
			{
				case 'init':
					this.init();
					break;
				....
			}

Alespoň se mi už ukázalo okno s mapou, ale teď mám druhý problém – firefox mi v konzoli vypisuje
TypeError: markers.forEach is not a function na řádku 169 a tady už nevím co os tím… Díky za pomoc

Editoval n.u.r.v. (7. 5. 2015 10:00)

Oli
Člen | 1215
+
0
-

Ahoj, zkus to prosím v chromu. Tam jsem to testoval a mělo by to tam fungovat, na žádný problém jsem tam nenarazil.

Že to hází chybu zrovna na forEach je zajímavé. Dělal jsem to podle: http://youmightnotneedjquery.com/#… abych nemusel vyžadovat jQuery (chtěl jsem si to vyzkoušet). Ještě mě napadlo, co máš v tu chvíli v markers? Zkus si dát na řádek 168 console.log jstli markers je pole nebo něco jinýho.

n.u.r.v.
Člen | 485
+
0
-

mno, tak záhadným způsobem už to nehází chybu u forEach, ale teď je problém u metod fill a fit… ani this nepomáhá… když to v tom switchi zakomentuju, tak se markery vykreslí… zkusím to ještě v chromu…

firefox vypisuje:

ReferenceError: fill is not defined řádek cca 229

Edit:

Chrome zase vypisuje chybu Uncaught TypeError: Cannot read property ‚extend‘ of undefined na řádku 242

JQuery používám //code.jquery.com/jquery-1.11.2.min.js a mám ho definovaný v header
tvoje js soubory jsem dal do www/js a v latte je vkládám v bloku scripts úplně dole…

Edit2:

Když zakomentuju fill a mnechám jen fit(), tak zase chorme vypisuje tuto chybu (ale markery se zobrazí, i když nějak moc velký):

ncaught TypeError: Cannot read property 'getSouthWest' of undefined

Editoval n.u.r.v. (7. 5. 2015 11:32)

Oli
Člen | 1215
+
0
-

Ono by to mělo být uplně jedno, jestli tam to jQuery je nebo ne, nikde bych ho neměl volat. Pokud ten bound nepoužiješ vubec tak to taky nejde?

Budu muset pryč, ale kouknu se na to večer a pošlu opravu. Toho jsem si vubec nevšiml :-/

Díky za report každopádně! ;-)

n.u.r.v.
Člen | 485
+
0
-

Popravdě ani nevím k čemu přesně ten bound je – zatím jsem se jen snažil zprovoznit ten velký příklad v tvé dokumentaci… ale zkusil jsem dát $markers->fitBounds(false); a už je to bez chyb… Jen ve firefoxu jsou markery maličké a v chromu obrovské

n.u.r.v.
Člen | 485
+
+1
-

Tak změna:

Když zruším u init to this., tak to ve firefoxu nejede vůbec (vůbec se neobjeví mapa), ale v chromu to je bez chyb i s bound (akorát jsou markery velké)…

A v opeře je to taky ok, takže problém je s firefoxem… Jenže si nemůžu dovolit dát na stránky že nejsou podporované ve FF…

IE funguje dobře a ikony (markery) mají optimální velikost…

Editoval n.u.r.v. (7. 5. 2015 11:54)

Oli
Člen | 1215
+
0
-

Super díky! Večer se s tím zkusím něco udělat.

Btw. Ten bound dělá to, že ti zobrazí stránku s maximálním přiblížením, ale tak, aby byli vidět všechny markery.

n.u.r.v.
Člen | 485
+
0
-

Ahoj, povedlo se ti to vyřešit? Díky

Oli
Člen | 1215
+
0
-

@n.u.r.v. povedlo se mě to vyřešit. Nakonec to nebylo ani tak těžký. Tenhle commit to opravuje, takeže když si změníš ten js soubor nebo natahnes master, tak by ti to melo fungovat i ve firefoxu

n.u.r.v.
Člen | 485
+
0
-

hmm, přes composer update se něco stáhlo, ale stále to ve firefoxu nejde – padne to na init()

Zkusím to ještě stáhnout ručně…

Edit Tak ruční stažení souboru zabralo… ale přes composer ne… Hlavně že to funguje… díky

Editoval n.u.r.v. (14. 5. 2015 21:31)

house23
Člen | 17
+
0
-

Ahoj, měl jsem pořád problémy s funkcí map.loadMarkers(); pořád mi to padalo na clearMarkers kde se volala neznámá funkce setMap, to bylo způsobené špatnou prací s objekty typu Google Markers. V dosavadním řešení ve funkci loadMarkers jsi rozparsovaný json uložil do base.Markers a nad tím se pak volala funkce, setMap což je nesmysl. Ja jsem to tedy opravil vytvořením nového pole pro Json a do base.Markers ukládám vytvořené Google markery.

loadMarkers: function()
	{
		var base = this;
		this.clearMarkers();

		var request = new XMLHttpRequest();
		request.open('GET', base.URL, true);

		request.onload = function() {
			if (request.status >= 200 && request.status < 400) {
				// Success!
				var data = JSON.parse(request.responseText);
				base.markersJSON = data;
				base.insertMarkers(data);
			} else {
				// We reached our target server, but it returned an error
				console.log('We reached our target server, but it returned an error');
			}
		};

		request.onerror = function() {
			// There was a connection error of some sort
			console.log('There was a connection error of some sort');
		};

		request.send();
	},

Tady je přidáno pushnutí markeru do pole.

insertMarkers: function(markers)
	{
		var base = this;

		markers.forEach(function(item, i){
			var marker,
			position = new google.maps.LatLng(markers[i]['position'][0], markers[i]['position'][1]);
			base.doBounds('fill', position);

			marker = new google.maps.Marker({
				position: position,
				map: base.map,
				title: (("title" in markers[i]) ? markers[i]['title'] : null)
			});

			marker.setAnimation(base.doAdmination(item));

			base.doColor(item, marker);

			base.doIcon(item, marker);

			base.doMessage(item, marker);

			if (base.options.cluster)
			{
				base.markersCluster.push(marker);
			}
			base.markers.push(marker);
		});

Dále mi bohužel po tvé opravě chyby ve firefoxu nefungoválo zoomovani na markery. To jsem opravil následovně a funguje to v chromu, firefoxu i safari.

if(functionName == 'init'){
				base.boundsProperty = new google.maps.LatLngBounds();
			}
			else if(functionName == 'fill'){
				base.boundsProperty.extend(position);
			}
			else if(functionName == 'fit'){
				base.map.fitBounds(base.boundsProperty);
			}
			else{
				throw "Undefined function call!";
			}
Oli
Člen | 1215
+
0
-

@house23 Super, Moc děkuju! Myslíš, že by jsi to mohl poslat jako pull request?

n.u.r.v.
Člen | 485
+
0
-

Ahoj, budu mít na webu vícekrát mapu, ale nevím jak nastavit pro každou mapu zvlášť rozměry width a height… zatím mám vše v neon a je to společné pro všechny mapy… Díky

Edit: Pardon, už jsem to našel… $map->setProportions… před tím mi to netbeans nenabídl, tak jsem byl zmaten…

Editoval n.u.r.v. (8. 6. 2015 20:36)

Oli
Člen | 1215
+
0
-

Byl by mě někdo schopnej pomoct s tímhle issue? Možná @jahudka? Aspoň nastínit proč se to děje a jak to udělat správně?

@DavidMatějka bylo by prosím možné změnit název threadu na Google map API? Nevím, co jsem to měl za nápad spojit map a api dohromady, ale najít to na foru je docela oříšek :-D