Jump to content


Photo

Polylines Com Php E Mysql.


  • Faça o login para participar
8 replies to this topic

#1 rickjames

rickjames

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre(RS)
  • Interesses:Desenvolvimento Web.

Posted 08/09/2008, 14:21


Estou fazendo uma aplicação com PHP e Google Maps para exibir uma polyline ligando diversos pontos, latitude e longitude, armazenados em uma base de dados MySQL. Tenho já uma experiencia boa com Javascript e Google Maps API mas sou novo em PHP. Não consegui ainda acertar um loop correto que pegue todos os pontos da tabela embora eu saiba qual a função do Google disponivel , GPolyline. Tentei este aqui agora :
<body> 
<div id="map" style="width: <?php echo $map_width ?>px; height: <?php echo $map_height ?>px">
</div>
&lt;script type="text/javascript">
//<![CDATA[
var map = new GMap2(document.getElementById("map"));
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(<?php echo $initial_lat ?>, <?php echo $initial_lon ?>), <?php echo $initial_zoom ?>);
<?php
$link = mysql_connect($dbserver, $username, $password)
  or die("Could not connect: " . mysql_error());

mysql_select_db($dbname,$link) or die ("Can\'t use database : " . mysql_error());

$sql = "SELECT lat,lng FROM geo_points WHERE route=1";	

$result = mysql_query($sql,$link);
if (!$result)
{
  echo "no results";
}
   else 
   {

while($row = mysql_fetch_array($result))
{  
$polylat = $row['lat'];  
$polylng = $row['lng'];  
  $geometry = str_replace($polylat,",",$polylng); 
  $points = explode(",",$geometry);
  $numpoints = sizeof($points);
  echo "var polyline = new GPolyline(["; 
  for ($i = 0; $i <= ($numpoints - 1); $i++) {
	$coordinates = explode(",",$points[$i]);
	echo "new GLatLng(" . $coordinates[1] . "," . $coordinates[0] . ")";
	if ($i != ($numpoints - 1)) {
	  echo ",\n";
	} else {
	  echo "\n";
	}
  }
  echo "],\"#ff0000\", 5, 1);\n";
  echo "map.addOverlay(polyline);\n\n";
}
   
}

Porém não exibe o mapa na coordenada selecionada nem a polyline traçando a rota.
No "ver código-fonte" da página , pelo navegador, este mostra esta saida :

var polyline = new GPolyline([new GLatLng(,25.0499)
],"#ff0000", 5, 1);
map.addOverlay(polyline);

Isto é, ele faz o loop de todos os pontos mas pega sómente uma coordenada, longitude.
Gostaria de saber porque ele não pega a latitude. Acho que o erro está no PHP. Agradeço uma help para localizá-lo.
Djalma.


#2 Falci

Falci

    12 Horas

  • Usuários
  • 187 posts
  • Sexo:Masculino
  • Localidade:Brasil

Posted 08/09/2008, 14:57

$geometry = str_replace($polylat,",",$polylng);
acho que seu erro está aih!

vc tentou jogar para dentro de $geometry o valor de $polylng, mas substituindo $polylat por uma ",".. que rolo...

Bem, eu naum intendo nada dessa API.. se vc postar como deveria ser a saída do php (o que deveria ter no código fonte), e tb um pouco de dados do banco, acho que fica mais fácil da gente te ajudar...
<?php /* falci at Falci.me */

$naoAcrediroQueEuFizUmaVariavelTaoGrandeSoParaGuardarUmTres = 3;
?>

#3 rickjames

rickjames

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre(RS)
  • Interesses:Desenvolvimento Web.

Posted 08/09/2008, 15:35


Aqui está um dump com o PhpMyAdmin com a tabela que guarda os dados da rota:

-- phpMyAdmin SQL Dump
-- version 2.6.4-pl2
-- http://www.phpmyadmin.net
--
-- Servidor: mysql1.100ws.com
-- Tempo de Geração: Set 08, 2008 as 05:46 PM
-- Versão do Servidor: 4.1.11
-- Versão do PHP: 5.2.0-8+etch9~bpo31+1
--
-- Banco de Dados: `djabin_donovan`
--

-- --------------------------------------------------------

--
-- Estrutura da tabela `geo_points`
--

CREATE TABLE `geo_points` (
`id` int(11) NOT NULL auto_increment,
`route` int(11) NOT NULL default '0',
`lat` float NOT NULL default '0',
`lng` float NOT NULL default '0',
`alt` float NOT NULL default '0',
`time` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1147 ;

--
-- Extraindo dados da tabela `geo_points`
--

INSERT INTO `geo_points` VALUES (1, 1, 37.6384, 25.0499, 202.014, 0);
INSERT INTO `geo_points` VALUES (2, 1, 37.6384, 25.0499, 198.65, 0);
INSERT INTO `geo_points` VALUES (3, 1, 37.6384, 25.0499, 198.65, 0);


Acho que a saida correta seria esta :

var polyline = new GPolyline([new GLatLng($polylat ->'lat',$polylng ->'lng')
],"#ff0000", 5, 1);
map.addOverlay(polyline);


então a GPolyline traça uma linha pegando todos os pontos da rota, entende ?
Na web tem este exemplo para vc ter uma noção do que eu quero :
http://www.map-serve...emaps/track.php
Eu consegui plotar esta rota com marcadores neste codigo abaixo mas fica muito confuso porque
aglomera mais de 400 pontos com marcadores alinhados,veja aqui :
http://djalmabina.10...tml/get_map.php
Obrigado.


#4 Falci

Falci

    12 Horas

  • Usuários
  • 187 posts
  • Sexo:Masculino
  • Localidade:Brasil

Posted 08/09/2008, 16:04

Baseado nessa parte do código fonte do link que vc postou:
var polyline = new GPolyline([new GPoint(-122.003431320000000,37.274465561000000),
new GPoint(-121.999075413000000,37.272770405000003),
new GPoint(-121.994547844000000,37.271375655999996)],"#ff0000", 5, 1);
map.addOverlay(polyline);

Acho que fica assim:
<?php

  $con = mysql_connect($host,$user,$pass);
  mysql_select_db($dbname,$con);
  
  $rota = 1;
  
  $sql = mysql_query("SELECT * FROM geo_points WHERE route=$rota");

  if(mysql_num_rows($sql)==0){
	 echo "Rota não encontrada!";
	 exit;
  }
  
  $pontos = Array();
  
  while($r = mysql_fetch_array($sql))
	  $pontos[]= "new GPoint(".$r['lat'].",".$r['lng'].")";
  
  echo "var polyline = new GPolyline([".implode(",\n",$pontos)."],\"#ff0000\", 5, 1);
map.addOverlay(polyline);";

?>

<?php /* falci at Falci.me */

$naoAcrediroQueEuFizUmaVariavelTaoGrandeSoParaGuardarUmTres = 3;
?>

#5 rickjames

rickjames

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre(RS)
  • Interesses:Desenvolvimento Web.

Posted 09/09/2008, 14:29


Ola Falci ! obrigado pelo código, implementei a solução no meu código-fonte no entanto
ele não logrou traçar a polyline ainda. Mosta apenas o mapa centrado nas coordenadas pedidas.
http://djalmabina.10...aps78/track.php
A saida do fonte no browser agora é esta :

var polyline = new GPolyline([new GPoint(37.6384,25.0499),
new GPoint(37.6384,25.0499),
new GPoint(37.6384,25.0499),
---------------------------
---------------------------
new GPoint(37.6385,25.0499)],"#ff0000", 5, 1);
map.addOverlay(polyline);


De fato ele pega todos os pontos mas não desenha a linha unindo todos como no link que
enviei a voce. Lá neste source que traça a linha está incluido um FOR dentro do ECHO assim :
$numpoints = sizeof($points);  
echo "var polyline = new GPolyline([";   
  for ($i = 0; $i <= ($numpoints - 1); $i++) 
   {   
	  $coordinates = explode(" ",$points[$i]);	
	  echo "new GLatLng(" . $coordinates[1] . "," . $coordinates[0] . ")";	
		if ($i != ($numpoints - 1)) 
		{	  
			echo ",\n";   
		} 
		 else 
		   {	  
			   echo "\n";	
		   }  
	   }  
	 echo "],\"#ff0000\", 5, 1);\n";  
	 echo "map.addOverlay(polyline);\n\n"; 
 }
O programa calcula o número total de pontos com sizeof e passa para $numpoints.
Tentei usar este código mas não deu certo porque os dados que ele pega na database estão numa tabela GEOMETRY , com a extensão espacial do MySQL. Não é o meu caso.
Minha dúvida está no PHP apenas.


#6 Falci

Falci

    12 Horas

  • Usuários
  • 187 posts
  • Sexo:Masculino
  • Localidade:Brasil

Posted 10/09/2008, 12:43

Iii rapaz.. intaum não intedi..

Explica melhor sua dúvida..

Meu código não deu certo? o que aconteceu?
Vc quer consertar esse código que vc postou?
<?php /* falci at Falci.me */

$naoAcrediroQueEuFizUmaVariavelTaoGrandeSoParaGuardarUmTres = 3;
?>

#7 rickjames

rickjames

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre(RS)
  • Interesses:Desenvolvimento Web.

Posted 10/09/2008, 16:14


Deu certo sim, tudo bem quanto à polyline, só que o método GPoint() não trabalha ali,
eu substitui pelo GLatLng() no array $pontos[] http://djalmabina.10...aps78/track.php e a aplicação funcionou , assim :
 echo "var point = new GLatLng(".$initial_lat.",".$initial_lon.");\n";
 echo "var marker = createMarker(point);\n";
 echo "map.addOverlay(marker);\n";

   while($r = mysql_fetch_array($sql))  
	  $pontos[]= "new GLatLng(".$r['lat'].",".$r['lng'].")";
	 
  echo "var polyline = new GPolyline([".implode(",\n",$pontos)."],\"#ff0000\",6);
map.addOverlay(polyline);";

mysql_close($link);
?>
Seu código está legal no restante pode ver aqui eu inseri outros métodos como o Panoramio API para mostrar fotos e até videos dentro do mapa. Agora eu precisaria pegar todas as rotas da tabela 'geo_points' ( mais de 20) dentro de um loop ,uma de cada vez com os pontos, exibindo-as na tela, num frame ou uma <div> sem ter que mudar toda hora o valor de $rota= 1,2,3... Acho que este loop fica antes do WHILE. Vc sabe qual seria melhor, um FOREACH ou FOR ?
Muito obrigado pela opinião.




Ola Falci.
Vou postar a aplicação como projeto em outra seção se vc quiser me dar uma consultoria
poderá ter uma renumeração para fechar o projeto. Preciso apenas este código em PHP funcionando , mostrando as rotas com todas coordenadas num mapa.
http://djalmabina.10...track.php?rota=
Se estiver interessado me diga aqui mesmo. Obrigado.
Djalma.


#8 Falci

Falci

    12 Horas

  • Usuários
  • 187 posts
  • Sexo:Masculino
  • Localidade:Brasil

Posted 10/09/2008, 16:18

um.. ok.. intendi..

tenta assim:
<?php

  $con = mysql_connect($host,$user,$pass);
  mysql_select_db($dbname,$con);

  //$rota = 1;

  $sql = mysql_query("SELECT * FROM geo_points"); // ORDER BY route,id

  if(mysql_num_rows($sql)==0){
	 echo "Rotas não encontradas!";
	 exit;
  }

  $pontos = Array();

  while($r = mysql_fetch_array($sql)){
	  $rota		   = $r['route'];
	  $pontos[$rota][]= "new GLatLng(".$r['lat'].",".$r['lng'].")";
  }
  

  foreach($pontos as $rota)
	echo "var polyline = new GPolyline([".implode(",\n",$rota)."],\"#ff0000\", 5, 1);\nmap.addOverlay(polyline);";


// poder ser a mesma variavel aki ? "var polyline" ?
?>
nem testei heim..

edit: tinha colocado "for" .. mas ia dar errado...

Edição feita por: Falci, 10/09/2008, 16:23.

<?php /* falci at Falci.me */

$naoAcrediroQueEuFizUmaVariavelTaoGrandeSoParaGuardarUmTres = 3;
?>

#9 rickjames

rickjames

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre(RS)
  • Interesses:Desenvolvimento Web.

Posted 11/09/2008, 16:46


Valeu Falci ! Coloquei sua $_GET lá e mudei alguns itens no código, que ficou assim :
<?
$route = $_GET['route'];		 

$sql ="SELECT * FROM geo_points WHERE route='.intval($route).'";  
$result = mysql_query($sql);   

if(mysql_num_rows($result)==0){
	 echo "Rota não encontrada!";
	 exit;
  }

	 
$pontos = Array();	
   
	  while($r = mysql_fetch_row($result))
	  {
			$rota   = $r['route'];
		   $pontos[$route][]= "new GLatLng(".$r['lat'].",".$r['lng'].")";
  
		 foreach($pontos as $rota) 
		 {   

  echo "var point = new GLatLng(".$pontos[0]->lat.",".$pontos[0]->lng.");\n";  
  // aqui  pega  o  primeiro  ponto de  cada   rota
 echo "var marker = createMarker(point);\n";
 echo "map.addOverlay(marker);\n";
 echo "var pano_layer = new PanoramioLayer(map);\n";
 echo "pano_layer.enable();\n"; 
 echo "var polyline = new GPolyline([".implode(",\n",$rota)."],\"#ff0000\", 5, 1);";
 echo "map.addOverlay(polyline);\n";
		 } 
  }  
?>

No entanto, agora quando chamo por exemplo =
http://djalmabina.10...rack.php?rota=2
Não carrega nem o mapa e na saida do browser está imprimindo :
"Rota não encontrada !"
Tenho a impressão que seria preciso tb uma query para selecionar o primeiro ponto de
cada rota, lat e lng , e depois passar para uma variável. /Porque estou definindo coordenadas iniciais de uma rota apenas no momento , em track_config.php :
<?php  
  $initial_lat = 43.1514;   
  $initial_lon = -4.91776; 
  $initial_zoom = 6; // 1 through 17	  
?>
Ele tem de pegar o primeiro ponto de cada rota sempre. Não sei se vc entendeu. Deixe-me saber. Obrigado.





1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq