Google MapAPI – Zobrazení Google mapy definované v komponentě
- Oli
- Člen | 1215
- 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)
- Oli
- Člen | 1215
Š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)
- Oli
- Člen | 1215
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
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
Zkoušel jsem nasadit a narazil jsem na dvě věci:
- myslím že by měl
boundsListener
dostávat na řádku 43 šablonytemplate.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
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
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
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
Vydání přepracované verze: GoogleMap
2.0
- 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
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
@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…
- Oli
- Člen | 1215
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.
- Oli
- Člen | 1215
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
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
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! :-)
- 01laky
- Člen | 18
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
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
- Oli
- Člen | 1215
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
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
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
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)
- n.u.r.v.
- Člen | 485
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
@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
- house23
- Člen | 17
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!";
}
- n.u.r.v.
- Člen | 485
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
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