Jump to content
LuisT

Lista Códigos Postais com lat/lng

Recommended Posts

LuisT

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!

Share this post


Link to post
Share on other sites
IceBrain

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

Share this post


Link to post
Share on other sites
LuisT

Obrigado pela sua resposta IceBrain.

Aqui vai a lista actualizada dos códigos postais obtida no site dos CTT:

http://www.enigmashare.com/v0wzawadldc4

Será que alguem me consegue arranjar a lista que procuro?

Codigo Postal xxxx-xxx + Latitude e Longitude

Formato CSV ou em tabela de base de dados MySQL

Estou disposto a pagar por este serviço

Share this post


Link to post
Share on other sites
LuisT

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

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.

Share this post


Link to post
Share on other sites
IceBrain

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 :cheesygrin:


❝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

Share this post


Link to post
Share on other sites
geodivagar

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

Share this post


Link to post
Share on other sites
IceBrain

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

Share this post


Link to post
Share on other sites
Black-Wolf

Desculpem desenterrar isto mas será que alguém ainda tem a lista KMZ que estava no site dos CTT?

O link deles está morto...

Obrigado

Share this post


Link to post
Share on other sites
fmcruz

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!!

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Ma friend, checka os ctt.pt ... Na área de pesquisa por cod. postal tens disponível o KML com especificação por codpostal 4 + 3 :)

Share this post


Link to post
Share on other sites
cusco

Ma friend, checka os ctt.pt ... Na área de pesquisa por cod. postal tens disponível o KML com especificação por codpostal 4 + 3 ;)

Olá, o KML disponível parece só ter os polygons CP4 - Ainda têm com CP3 ??

Share this post


Link to post
Share on other sites
fauves
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?

Share this post


Link to post
Share on other sites
fauves

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

Share this post


Link to post
Share on other sites
cusco
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á)

Share this post


Link to post
Share on other sites
fauves
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/

 

Share this post


Link to post
Share on other sites
cusco

Olá fauves

Como respondi nesse outro tópico, e para que fique registado, alterei o código do dito ficheiro no GitHub para tentar corresponder à expectativa.

Faz checkout e testa :-)

  • Vote 1

Share this post


Link to post
Share on other sites
G Guedes
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

Share this post


Link to post
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

×
×
  • 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.