Jump to content

Lista Códigos Postais com lat/lng


LuisT
 Share

Recommended Posts

Olá caros amigos,

Sou novo aqui no fórum e sinto-me mal em estar a pedir a vossa ajuda logo no meu primeiro tópico. Mas estou um pouco desesperado...

Procuro uma lista actualizada com todos os códigos postais de portugal e com a latitude e longitude de cada um deles...

Alguém possui esta base de dados? Estou disposto a pagar por ela...

Visitei o site dos CTT, eles têm lá a lista actualizada, mas com informações a mais e sem a latitude e longitude. Mas em todo o caso, se alguém conseguir remover o que não interessa dessa lista ficando apenas os codigos postais, eu agradecia! Nem que depois tenha de encontrar as lat/lng um a um.

Alguém me pode ajudar por favor?

Obrigado!

Link to comment
Share on other sites

Se postares aqui a lista, pode ser que consiga remover - não me consigo registar no site deles.

Quanto às coordenadas, se vires na mesma página eles têm outros formatos para "Mapa dos códigos postais". Um deles é KML, que é um formato XML, razoavelmente fácil de tratar; na <description> tens lá o código postal e depois tens os pontos geográficos que delimitam o local que o CP cobre.

Claro que se queres obter apenas um par Longitude/latitude para cada CP, tens que calcular o centroide do polígono.

Outra opção seria usares o webservice que é simpaticamente disponibilizado e que te devolve esse centro em coordenadas a partir de qualquer CP. Mas se vais pedir _todos_, é preferível contactá-los e pedir-lhes uma cópia da BD do que estares a massacrar-lhes o servidor.

http://geodivagar.blogspot.com/2010/09/cp4-georeferenciados-centroides.html

❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Link to comment
Share on other sites

Paguei o serviço a um programador e já tenho a lista actualizada com latitudes e longitudes de cada código postal português 😁

Obrigado na mesma pela vossa atenção!

Já agora, aproveito para informar que caso alguém procure esta lista, estou disposto a vender uma cópia, bastando para isso contactando-me via MP.

Obrigado a todos mais uma vez.

Link to comment
Share on other sites

LuisT: só uma sugestão: devias aprender expressões regulares. Neste caso retirar os CP desse ficheiro teria sido facílimo com elas.

Mas ainda bem que arranjaste a lista 😁

❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Link to comment
Share on other sites

Viva,

por curiosidade, sou o autor do WS referido e nos Logs reparei que, na sequência desta thread, alguém fez o pedido das coordenadas para todos os cp4 existentes.  Acabou por funcionar como um teste de carga bastante interessante, tendo o servidor (neste caso a infraestrutura do GAE) se comportado bastante bem.

Se quiserem, em vez de pagar pela BD a quem pagou ao programador que por sua vez terá apontado ao WS em batch, talvez fosse preferível contribuírem  monetariamente para a melhoria do serviço. 🙂

Sugestão de melhorias "a pagantes":

- Reposta em XML ou GML ou KML or else

- URLs mais REST  tipo http://codigospostais.appspot.com/cp4/2675/foo em vez de

http://codigospostais.appspot.com/cp4?codigo=2675&callback=foo

- Pedidos por bounding box

Link to comment
Share on other sites

Olá geodivagar. Ainda bem que aguentou, mas de qualquer forma é desconsideração por parte de quem faz pedidos em massa sem avisar :|

❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Link to comment
Share on other sites

Boa Tarde.

Por acaso alguém sabe se existe (ou como é que pode ser obtido) um ficheiro que faça corresponder cada codigo postal a 7 digitos (CP7), com coordenadas geograficas. Isto é, ou um ficheiro que tenha em forma de tabela o Centroide de cada CP7, ou uma shapefile ou outro formato que permtia num SIG ver os poligonos de cada CP7?

Obrigado!!

Link to comment
Share on other sites

Em 28/07/2016 às 16:17, cusco disse:

Olá, para os interessados, já tinha publicado em outro post (

https://www.portugal-a-programar.pt/topic/58129-base-de-dados-ctt-em-mysql-com-latitude-longitude/

) tenho um conjunto de scripts no github que permite popular uma base de dados MySQL com os codigos postais CTT e latitude/longitude baseado no google maps: https://github.com/cusco/ctt

Boas cusco! reparei que para o código postal 4740-XXX a Lat/long é sempre a mesma (-8.770147,41.5650629), ou seja, temos 1000 e poucos registos repetidos para todos. Para atualizar estas coordenadas basta correr o updateGEO? Ou tens algum ficheiro atualizado?

Link to comment
Share on other sites

Criei a BD em mySQL e fiz a atualização da lat e long, mas ele mete os mesmos valores que tens. Reparei que ele só pesquisa pelo CP4 na api.

Alguém pode ajudar-me a corrigir esta situação?

 

 

$mysqli = new mysqli('localhost', 'root', '', 'CTT');

$qry = "select distinct CP4, CP3 from codigosPostais where LONGITUDE = '' AND LATITUDE = '' order by CP4 asc, CP3 asc limit 2500";
$qid = $mysqli->query($qry);
if($qid->num_rows == 0){
	echo "No results in database to update\n";
	die();
}

while($row = $qid->fetch_object()){

	$geo = getGeo($row->CP4, $row->CP3);
	if(!isset($geo->lat)){
		echo "$row->CP4-$row->CP3|error|$geo\n";
		continue;
	}
	$updQry = "update codigosPostais SET LONGITUDE=$geo->lat, LATITUDE=$geo->lng WHERE CP4=$row->CP4 AND CP3='$row->CP3'";
	$updQid = $mysqli->query($updQry);
	$aff = $mysqli->affected_rows;
	echo "$row->CP4-$row->CP3|$aff\n";
	#die();
}



function getGeo($cp4, $cp3){
	#$url = "http://maps.googleapis.com/maps/api/geocode/json?address=$cp4-$cp3&sensor=false&components=country:PT";
	$url = "http://ditu.google.cn//maps/api/geocode/json?address=$cp4-$cp3&sensor=false&components=country:PT";

	/* IP CHANGING STUFF
	 *
	 * Uncomment this and the comment block a few lines below
	 * only if you understand what it does, and after reading
	 * changeIp() function comments
	 *

	$i = 0;
	if(!file_exists('/ramdrive/googleip.txt')){
		file_put_contents('/ramdrive/googleip.txt','10.100.100.15');
		$currentIp = '10.100.100.16';	// default IP
	}else{
		$currentIp = file_get_contents('/ramdrive/googleip.txt');
	}
	$opts = array(
		'socket' => array(
			'bindto' => "$currentIp:0",
		),
	);
	$context = stream_context_create($opts);
	again:
	$data = json_decode(file_get_contents($url,false,$context));
	*/

	$data = @file_get_contents($url,false);
	if($data == false){
		return "error fetching $url";
	}
	$data = json_decode($data);
	if($data->status == 'OVER_QUERY_LIMIT'){
		/* IP Changing stuff
		if($i > 6){
			die('OVER_QUERY_LIMIT');
		}
		$i++;
		$context = stream_context_create(changeIp());
		goto again:
		*/
		echo "Google returned over query limit\n";
		die();
	}
	//$geo = $data->results[0]->geometry->location;
	$maxKey = max(array_keys($data->results));
	$geo = $data->results[$maxKey]->geometry->location;

	return $geo;
}

function changeIp(){
	/*
	 * This will return context options for file_get_contents
	 * the following IP list will basically be bound by the router
	 * with a netmap rule, NATing to different external IP's
	 * thus, allowing to increase google's limit of 2500 requests
	 * per IP per day.
	 *
	 * IP List
	 *
	 * 10.100.101.10
	 * 192.168.3.210
	 * 192.168.3.211
	 * 192.168.3.212
	 * 192.168.3.213
	 * 192.168.3.214
	 */
	$lastIp = trim(file_get_contents('/ramdrive/googleip.txt'));        // get last
	$newIp = $lastIp; // in case for some reason it remains unchanged
	switch($lastIp){
		case '10.100.101.10':
		$newIp = '192.168.3.210';
		break;
		case '192.168.3.210':
		$newIp = '192.168.3.211';
		break;
		case '192.168.3.211':
		$newIp = '192.168.3.212';
		break;
		case '192.168.3.212':
		$newIp = '192.168.3.213';
		break;
		case '192.168.3.213':
		$newIp = '192.168.3.214';
		break;
		case '192.168.3.214':
		$newIp = '10.100.101.10';
		break;
	}
	file_put_contents('/ramdrive/googleip.txt',$newIp);
	$opts = array(
		'socket' => array(
			'bindto' => "$newIp:0",
		),
	);
	return $opts;
}

?>
Edited by fauves
Link to comment
Share on other sites

Em 17/10/2016 às 10:25, fauves disse:

Criei a BD em mySQL e fiz a atualização da lat e long, mas ele mete os mesmos valores que tens. Reparei que ele só pesquisa pelo CP4 na api.

Alguém pode ajudar-me a corrigir esta situação?

 

 


$mysqli = new mysqli('localhost', 'root', '', 'CTT');

$qry = "select distinct CP4, CP3 from codigosPostais where LONGITUDE = '' AND LATITUDE = '' order by CP4 asc, CP3 asc limit 2500";
$qid = $mysqli->query($qry);
if($qid->num_rows == 0){
	echo "No results in database to update\n";
	die();
}

while($row = $qid->fetch_object()){

	$geo = getGeo($row->CP4, $row->CP3);
	if(!isset($geo->lat)){
		echo "$row->CP4-$row->CP3|error|$geo\n";
		continue;
	}
	$updQry = "update codigosPostais SET LONGITUDE=$geo->lat, LATITUDE=$geo->lng WHERE CP4=$row->CP4 AND CP3='$row->CP3'";
	$updQid = $mysqli->query($updQry);
	$aff = $mysqli->affected_rows;
	echo "$row->CP4-$row->CP3|$aff\n";
	#die();
}



function getGeo($cp4, $cp3){
	#$url = "http://maps.googleapis.com/maps/api/geocode/json?address=$cp4-$cp3&sensor=false&components=country:PT";
	$url = "http://ditu.google.cn//maps/api/geocode/json?address=$cp4-$cp3&sensor=false&components=country:PT";

	/* IP CHANGING STUFF
	 *
	 * Uncomment this and the comment block a few lines below
	 * only if you understand what it does, and after reading
	 * changeIp() function comments
	 *

	$i = 0;
	if(!file_exists('/ramdrive/googleip.txt')){
		file_put_contents('/ramdrive/googleip.txt','10.100.100.15');
		$currentIp = '10.100.100.16';	// default IP
	}else{
		$currentIp = file_get_contents('/ramdrive/googleip.txt');
	}
	$opts = array(
		'socket' => array(
			'bindto' => "$currentIp:0",
		),
	);
	$context = stream_context_create($opts);
	again:
	$data = json_decode(file_get_contents($url,false,$context));
	*/

	$data = @file_get_contents($url,false);
	if($data == false){
		return "error fetching $url";
	}
	$data = json_decode($data);
	if($data->status == 'OVER_QUERY_LIMIT'){
		/* IP Changing stuff
		if($i > 6){
			die('OVER_QUERY_LIMIT');
		}
		$i++;
		$context = stream_context_create(changeIp());
		goto again:
		*/
		echo "Google returned over query limit\n";
		die();
	}
	//$geo = $data->results[0]->geometry->location;
	$maxKey = max(array_keys($data->results));
	$geo = $data->results[$maxKey]->geometry->location;

	return $geo;
}

function changeIp(){
	/*
	 * This will return context options for file_get_contents
	 * the following IP list will basically be bound by the router
	 * with a netmap rule, NATing to different external IP's
	 * thus, allowing to increase google's limit of 2500 requests
	 * per IP per day.
	 *
	 * IP List
	 *
	 * 10.100.101.10
	 * 192.168.3.210
	 * 192.168.3.211
	 * 192.168.3.212
	 * 192.168.3.213
	 * 192.168.3.214
	 */
	$lastIp = trim(file_get_contents('/ramdrive/googleip.txt'));        // get last
	$newIp = $lastIp; // in case for some reason it remains unchanged
	switch($lastIp){
		case '10.100.101.10':
		$newIp = '192.168.3.210';
		break;
		case '192.168.3.210':
		$newIp = '192.168.3.211';
		break;
		case '192.168.3.211':
		$newIp = '192.168.3.212';
		break;
		case '192.168.3.212':
		$newIp = '192.168.3.213';
		break;
		case '192.168.3.213':
		$newIp = '192.168.3.214';
		break;
		case '192.168.3.214':
		$newIp = '10.100.101.10';
		break;
	}
	file_put_contents('/ramdrive/googleip.txt',$newIp);
	$opts = array(
		'socket' => array(
			'bindto' => "$newIp:0",
		),
	);
	return $opts;
}

?>

Olá

 

Como podes ver pela variavel $url ele vai ao google perguntar CP4 e CP3

 

No entanto, no github tens agora um dump completo da base de dados, podes simplesmente importar esse 🙂

Falta talvez criar um script que apenas actualiza, quando os ficheiros dos CTT têm dados novos? (não me recordo como está)

Link to comment
Share on other sites

6 horas atrás, cusco disse:

Olá

 

Como podes ver pela variavel $url ele vai ao google perguntar CP4 e CP3

 

No entanto, no github tens agora um dump completo da base de dados, podes simplesmente importar esse 🙂

Falta talvez criar um script que apenas actualiza, quando os ficheiros dos CTT têm dados novos? (não me recordo como está)

Boas!

Estava a ter alguns problemas com o teu ficheiro geoupdate, entretanto abri um topic nesta secção com a minha dúvida:

 

https://www.portugal-a-programar.pt/forums/topic/74313-pesquisa-por-latitude-e-longitude-por-c%C3%B3digos-postais/

Link to comment
Share on other sites

Em 17/01/2011 às 00:41, geodivagar disse:

Viva,

por curiosidade, sou o autor do WS referido e nos Logs reparei que, na sequência desta thread, alguém fez o pedido das coordenadas para todos os cp4 existentes.  Acabou por funcionar como um teste de carga bastante interessante, tendo o servidor (neste caso a infraestrutura do GAE) se comportado bastante bem.

Se quiserem, em vez de pagar pela BD a quem pagou ao programador que por sua vez terá apontado ao WS em batch, talvez fosse preferível contribuírem  monetariamente para a melhoria do serviço. 🙂

Sugestão de melhorias "a pagantes":

- Reposta em XML ou GML ou KML or else

- URLs mais REST  tipo http://codigospostais.appspot.com/cp4/2675/foo em vez de

http://codigospostais.appspot.com/cp4?codigo=2675&callback=foo

- Pedidos por bounding box

Olá geodivagar,

Procuro uma solução por bounding box que me dê uma lista de códigos postais com 7 dígitos.

Sabe de alguma solução?

Mt Obrigado

GG

Link to comment
Share on other sites

Em 14/01/2011 às 11:03, LuisT disse:

Paguei o serviço a um programador e já tenho a lista actualizada com latitudes e longitudes de cada código postal português 😁

Obrigado na mesma pela vossa atenção!

Já agora, aproveito para informar que caso alguém procure esta lista, estou disposto a vender uma cópia, bastando para isso contactando-me via MP.

Obrigado a todos mais uma vez.

Olá LuisT, eu tenho interesse em comprar a lista de codigo postal + lat/long.  Gostaria de saber como proceder.  O que é MP?  Obrigado!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.