Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

kania

[Resolvido] Xml x Google Maps

Recommended Posts

Bom dia Pessoal

 

Gente estou precisando criar um mapa com multi-pontos, as informações destes pontos vem diretamente do Banco de Dados MySql, já encontrei vários artigos que falam sobre o assunto porem todo se referem a efetuar a criação de um arquivo xml para o código javascritp do google maps ler ele, bom até o ponto de criar o arquivo xml a partir do asp e ler este arquivo com o google maps tudo bem, porem o problema é o seguinte:

 

1 - Usuário acessa o site e efetua um busca de serviço em um determinado endereço dentro do site

2 - Esta busca vai retornar varias empresas encontradas e que devem ser posicionados dentro do mapa conforme o endereço digitado pelo usuário

3 - Pela lógica no ato que ele mandar efetuar busca o sistema deve criar um arquivo xml com os dados informados pelo usuário (até aqui tudo bem)

4 - A dúvida é, como o arquivo xml é gravado em um local no servidor para posteriormente ser lido pelo javascrit do google maps, se supões que se eu tiver vários usuários acessando o site no mesmo momento e efetuando a busca, este arquivo será recriado varias vezes, certo? então isto poderá criar um problema de visualização das informações, estou certo?

 

Ai vem a pergunta, como posso fazer o usuário somente ler o arquivo xml sem ele ter que estar salvo no servidor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

como posso fazer o usuário somente ler o arquivo xml sem ele ter que estar salvo no servidor?

você pode apenas colocar o path com o xml especifico que ele vai ler.

Compartilhar este post


Link para o post
Compartilhar em outros sites

monte o xml pelo asp, não é necessário deixar a extensão como .xml deixe como asp e monte a extrutura xml nele, faça como sendo uma busca, só que neste caso será uma busca que retornará os resultados dentro de tags xml que será lida pela api do google maps.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Op Patric, não entendi como é para fazer, veja meu arquivo asp que cria o xml, aqui estou deixando os valores da busca fixo para testes.

 

 

<%
Arquivo = Server.MapPath("mapa.xml")

Set Fso = CreateObject("Scripting.FileSystemObject")

' Verifica se o arquivo existe
If Fso.FileExists(Arquivo) Then
	Fso.DeleteFile(Arquivo)
	set Fso = nothing
End If

Set MsXml = Server.CreateObject("MSXML2.DOMDocument.4.0")

str_Arquivo = Server.MapPath("mapa.xml")

  Set root = MsXml.createElement("markers")
  MsXml.appendChild(root)

  Set inst = MsXml.createProcessingInstruction("xml", "version='1.0' encoding='ISO-8859-1'")
  MsXml.insertBefore inst, root

  Set com = MsXml.createComment("IAKI Mapa de Busca")
  MsXml.insertBefore com, root

  Set onode = MsXml.createElement("marker")
  
  
  	Endereco = "Estrada de Santa Cândida"
	Bairro = "Santa Cândida"
	Cidade = "3281"
	Estado = "18"
	Categoria = "21"
	
	Set RS = Server.CreateObject("adodb.recordset")
	SQL = "select * from cadastro_usuarios AS A "&_
	" INNER JOIN estados AS B ON B.id_estado = A.estado"&_
	" INNER JOIN cidades AS C ON C.id_cidade = A.cidade AND C.id_estado = B.id_estado"&_
	" INNER JOIN categorias AS D ON D.IdCategoria = A.Categoria"&_
	" WHERE A.endereco = '"& Endereco &"' AND A.bairro = '"& Bairro &"' AND A.Cidade = " & Cidade & " AND A.estado = " & Estado & " AND A.Categoria = " & Categoria & ""
	RS.Open SQL,Conn,3,3
	
	WHILE NOT Rs.EOF

	Endereco = Rs("endereco")
	Numero = Rs("numero")
	Bairro = Rs("bairro")
	Cidade = Rs("nome_cidade")
	Estado = Rs("nome_estado")
	IdEmpresa = Rs("id_cadastro")
	NomeEmpresa = Rs("nome_fantasia")
	Categoria = Rs("categoria")
	
	MontaMapa = Endereco&", "&Numero&", "&Bairro&", "&Cidade&", "&Estado

	  ' *****************************************************
	  ' * Adiciona um ítem ao documento
	  ' *****************************************************
	  MsXml.documentElement.appendChild(onode)
	  
	  Set inode = MsXml.createElement("item")
	  onode.appendChild(inode)
	
	  Set child = MsXml.createElement("id")
	  child.Text = IdEmpresa
	  inode.appendChild(child)
	  
	  Set child = MsXml.createElement("nome")
	  child.Text = NomeEmpresa
	  inode.appendChild(child)
	
	  Set child = MsXml.createElement("endereco")
	  child.Text = MontaMapa
	  inode.appendChild(child)
	
	  Set child = MsXml.createElement("categoria")
	  child.Text = Categoria
	  inode.appendChild(child)
	  ' *****************************************************
  
 	 Rs.MOVENEXT
	WEND
	
	Rs.Close()
	Set Rs = Nothing

  MsXml.save(str_Arquivo)

  Set child = Nothing
  Set inode = Nothing
  Set onode = Nothing
  Set com   = Nothing
  Set inst  = Nothing
  Set root  = Nothing

  Response.Write "Arquivo XML criado com sucesso!"

Set MsXml = Nothing
%>

Você esta querendo dizer para eu não salvar o arquivo no servidor mas ler ele diretamente certo?

Mas como vou ler os dados se eu não criei o arquivo?

 

 

A este é um arquvivo base dos exmplos do google

 

<?xml version="1.0" encoding="utf-8"?>
<markers>
   <marker lat="-23.551123" lng="-46.641319" descr="teste1"/>
   <marker lat="-20.551370" lng="-40.641499" descr="teste2"/>
</markers>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Velho, não é necessário criar um xml para cada pesquisa.

 

Monte uma página asp chamada xml.asp e nela faça select nos dados e com os dados resgatados monte a estrutura xml no próprio code.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou te passar um exemplo aqui que eu fiz para um suggest jquery, dai você terá uma melhor idéia do que estou te falando e de como montar esse xml dinamicamente.

 

<!-- #include virtual="/inc/conn.asp" -->
<%
Response.Expires = 0
Response.ContentType = "text/xml"

vProcura = Request.QueryString("input")
        
ConnDB("usuarios.mdb")

Set RS = Conn.Execute("SELECT DISTINCT(usuario) FROM tbl_usuarios WHERE usuario LIKE '%" & vProcura & "%'")

If not RS.EOF Then
   response.write "<?xml version=""1.0"" encoding=""ISO-8859-1"" ?>"
   response.write "<resultados>"
   While not RS.EOF
         response.write "<rs id=""65"" informacao="""">"& LCase(RS("usuario")) &"</rs>"
   RS.Movenext
   Wend
   response.write "</resultados>"
Else
   response.write "não"
End if

RS.Close
Set RS = Nothing

Conn.Close
Set Conn = Nothing
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza Patrique entendi, por ser um arquivo xml ele não é realmente impresso na tela certo? Não ao mneos no Firefox e no Opera

 

Agora me tira uma dúvida, como vou conseguir pegar os dados deste xml no arquivo javascritp uma vez que eu não tenho como chamar este arquivo conforme o exemplo do Google

 

<script type="text/javascript">
function createInfoMarker(point, address) {
  var marker = new GMarker(point);
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(address);
  });
    return marker;
  }	 
 
function initialize() {
if (GBrowserIsCompatible()) {
   var map = new GMap2(document.getElementById("map_canvas"));
   map.setCenter(new GLatLng(-14.264383, -51.943359), 5, G_SATELLITE_MAP);
   map.setUIToDefault();
   GDownloadUrl("data.xml", function(data) {
      var xml = GXml.parse(data);
      var markers = xml.documentElement.getElementsByTagName("marker");
 
      for (var i = 0; i < markers.length; i++) {
        var latlng = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
             parseFloat(markers[i].getAttribute("lng")));
 
	descricao = markers[i].getAttribute("descr");
 
	var marker = createInfoMarker(latlng,descricao);
	map.addOverlay(marker);									 
      }
   });
}
}
</script> 

Veja que ele chama o arquivo xml nesta linha GDownloadUrl("data.xml", function(data), porem agora não temos mais este arquivo, esta tudo em um só

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa desculpa a comida de bola, na verdade o erro é com a questão altitude e longitude, como estou passando o endereço direto tenho que transformar em latidute e longitude primeiro

Compartilhar este post


Link para o post
Compartilhar em outros sites

resolveu !?!?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se você sabe como converter fazer este código que esta em php para asp

 

 

/**
 * gMaps Class
 *
 * Pega as informações de latitude, longitude e zoom de um endereço usando a API do Google Maps
 *
 * @author Thiago Belem <contato@thiagobelem.net>
 */
class gMaps {
	// Host do GoogleMaps
	private $mapsHost = 'maps.google.com';
	// Sua Google Maps API Key
	public $mapsKey = '';

	function __construct($key = null) {
		if (!is_null($key)) {
			$this->mapsKey = $key;
		}
	}

	function carregaUrl($url) {
		if (function_exists('curl_init')) {
			$cURL = curl_init($url);
			curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($cURL, CURLOPT_FOLLOWLOCATION, true);
			$resultado = curl_exec($cURL);
			curl_close($cURL);
		} else {
			$resultado = file_get_contents($url);
		}

		if (!$resultado) {
			return false;
			//trigger_error('Não foi possível carregar o endereço: <strong>' . $url . '</strong>');
		} else {
			return $resultado;
		}
	}

	function geoLocal($endereco) {
		$url = 'http://'. $this->mapsHost .'/maps/geo?output=csv&key='. $this->mapsKey .'&q='. urlencode($endereco);
		$dados = $this->carregaUrl($url);
		list($status, $zoom, $latitude, $longitude) = explode(',', $dados);
		if ($status != 200) {
			return false;
			//trigger_error('Não foi possível carregar o endereço <strong>"'.$endereco.'"</strong>, código de resposta: ' . $status);
		}
		return array('lat' => $latitude, 'lon' => $longitude, 'zoom' => $zoom, 'endereco' => $endereco);
	}
}

<?php
// Instancia a classe
$gmaps = new gMaps('SUA GMAK AQUI');

// Pega os dados (latitude, longitude e zoom) do endereço:
$endereco = 'Av. Brasil, 1453, Rio de Janeiro, RJ';
$dados = $gmaps->geolocal($endereco);

// Exibe os dados encontrados:
print_r($dados);
?>

Sei que tem um scripts ai que dizem passar php para as, mas nenhum deles funciona corretamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

na API do Google Maps para ASP, ele mostra

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, legal...

 

isso mesmo depois coloca o code finalizado que insiro no lab. de script

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue um exemplo de como buscar a Latitude e Longitude via ASP:

 


		sqlDados = "select * from tMaquina where maquina = " & Request.QueryString("NumMaquina")
		set rsDados = Conex.Execute(sqlDados)
			empresa = 0
			if rsDados("empresa") <> "" then
			empresa = 1
			sqlEmpresa = "select * from tEmpresa where id = " & rsDados("empresa")
			set rsEmpresa = Conex.Execute(sqlEmpresa)
			end if
			busca_google = rsDados("endereco")
			busca_google = 	"http://maps.google.com/maps/geo?q=" & busca_google & "&output=csv"
			busca_google = Replace(busca_google, " ","+")
						
						
			Set objHTTP = Server.CreateObject("Microsoft.XMLHTTP")
			objHTTP.Open "GET", busca_google, false
			objHTTP.Send
			texto = objHTTP.ResponseText
			


		ValorBox = texto
		Coord = Split(ValorBox, ",")
		Lat = Coord(2)
		Lon = Coord(3)

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa esse code do Dark.... muito bom

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para o Caso dele, ou seja um guia focado para empresas, acho que a latitude e longitude deveria vir do proprio banco de dados dele, sem o uso do geocode isso porque infelizmente não da o ponto exato, com isso um registro mais preciso deveria ser feito manual no momento do cadastro do estabelecimento, com isso as coordenadas seriam corretas sem erro.

 

Mais excelente code.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gente, primeiramente, obrigado pela ajuda de todos, estou precisando verificar o porque o código esta tão lento, segue o código e o link para visualização do mesmo, neste exemplo ele retorna apenas 55 registros, mas esta lento demais para trazer os resultados.

 

http://www.iaki.com.br/lendo-mapa.html

 

 

lendo-mapa.html

<html> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=utf-8"/> 
<title>Google Maps - XML</title> 
<script src="http://maps.google.com/maps?file=api&v=2&sensor=true&key=ABQIAAAADwRcsYiO0Y5p42tZ-CB7hxTLFc6Z-FPvSnpLVSJy2zELNyurThQmNqAUAbSFxE2Ozx-voXYooYVihQ" type="text/javascript"></script>
 
<script type="text/javascript">
	function createInfoMarker(point, address) {
	  var marker = new GMarker(point);
	  GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(address);
	  });
		return marker;
	  }	 

	function initialize() {
	if (GBrowserIsCompatible()) {
	   map = new GMap2(document.getElementById("map_canvas"));
	   map.setCenter(new GLatLng(-25.3718282, -49.2176761), 13, G_SATELLITE_MAP);
	   map.setUIToDefault();
	   geocoder = new GClientGeocoder();
	};

		GDownloadUrl("cria-xml-mapa.asp", function(data) {
		 var xml = GXml.parse(data);
		  var markers = xml.documentElement.getElementsByTagName("marker");
	 
		  for (var i = 0; i < markers.length; i++) {
			var latlng = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
				 parseFloat(markers[i].getAttribute("lng")));
			
		gicon = new GIcon(G_DEFAULT_ICON, "/imagens/pin.png");
        gicon.iconSize = new GSize(24, 29);
        gicon.shadow = "/imagens/pinShadow.png";
        gicon.shadowSize  = new GSize(41, 29);
			
		descricao = '<span style="font:11px Tahoma, Geneva, sans-serif;"><span style="font:bold 13px Tahoma, Geneva, sans-serif; color:#03F; height:20px;">'+ markers[i].getAttribute("nome") +'</span><br><strong>Endereço:</strong> '+ markers[i].getAttribute("endereco") +' - </strong><strong>N°: </strong> '+ markers[i].getAttribute("numero") +'<br></strong><strong>Bairro:</strong> '+ markers[i].getAttribute("bairro") +'<br></strong><strong>Cidade:</strong> '+ markers[i].getAttribute("cidade")  +'<br></strong><strong>Estado:</strong> '+ markers[i].getAttribute("estado")  +'<br></strong><strong>CEP:</strong> '+ markers[i].getAttribute("cep") +'<br><strong>Categoria: </strong>'+ markers[i].getAttribute("categoria")+'</span>';
		var marker = createInfoMarker(latlng,descricao);
		map.addOverlay(marker);
		
		  }
		  alert ('Foram encontrados [ '+ i +' ] empresas');
	   });
		
      }
   
</script> 
</head>
<body onLoad="initialize();" onUnload="GUnload()"> 
   <div id="map_canvas" style="width: 100%; height: 100%"></div> 
</body> 
</html>

cria-xml-mapa.asp

 

<!--#include file="funcoes.asp"-->
<!--#include file="bd/config.asp"-->
<%
	Set objHTTP = Server.CreateObject("Microsoft.XMLHTTP")
	
  	Endereco = ""
	Bairro = ""
	Cidade = "3281"
	Estado = "18"
	Categoria = "2"
	
	Set RS = Server.CreateObject("adodb.recordset")
	SQL = "select * from cadastro_usuarios AS A "&_
	" INNER JOIN estados AS B ON B.id_estado = A.estado"&_
	" INNER JOIN cidades AS C ON C.id_cidade = A.cidade AND C.id_estado = B.id_estado"&_
	" INNER JOIN categorias AS D ON D.IdCategoria = A.Categoria"&_
	" WHERE A.endereco LIKE '%"& Endereco &"%' AND A.bairro LIKE '%"& Bairro &"%' AND A.Cidade = " & Cidade & " AND A.estado = " & Estado & " AND A.Categoria = " & Categoria & ""
	RS.Open SQL,Conn,3,3
	
	If not Rs.Eof Then
	
	response.write "<?xml version=""1.0"" encoding=""utf-8"" ?>"
	response.write "<markers>"
	
	WHILE NOT Rs.EOF

	Endereco = Rs("endereco")
	Numero = Rs("numero")
	Cep = Rs("cep")
	Bairro = Rs("bairro")
	Cidade = Rs("nome_cidade")
	Estado = Rs("nome_estado")
	IdEmpresa = Rs("id_cadastro")
	NomeEmpresa = Rs("nome_fantasia")
	Categoria = Rs("categoria")
	
	MontaMapa = Endereco&", "&Numero&", "&Cep&", "&Bairro&", "&Cidade&", "&Estado
	
	PegaDados = "http://maps.google.com/maps/geo?q="&Server.URLEncode(MontaMapa)&"&output=csv&key=ABQIAAAADwRcsYiO0Y5p42tZ-CB7hxTLFc6Z-FPvSnpLVSJy2zELNyurThQmNqAUAbSFxE2Ozx-voXYooYVihQ"
	
	objHTTP.Open "GET", PegaDados, false
	objHTTP.Send
	texto = objHTTP.ResponseText
	
	ValorBox = texto
	RetornoLatLng = Split(ValorBox,",")
	
	Lat = RetornoLatLng(2)
	Lng = RetornoLatLng(3)
	
	response.write "<marker id="""&IdEmpresa&""" categoria="""&Categoria&""" nome="""&NomeEmpresa&""" endereco="""&Endereco&""" bairro="""&Bairro&""" cidade="""&Cidade&""" estado="""&Estado&""" cep="""&Cep&""" numero="""&Numero&""" lat="""&Lat&""" lng="""&Lng&"""/>"

 
 	Rs.MOVENEXT
	WEND
	
	response.write "</markers>"
	
	Else
    response.write "Sem Resultados"
	End if
	
	Rs.Close()
	Set Rs = Nothing

%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.