lunedì 23 dicembre 2013

Database antenne telefonia mobile

Per ottenere la posizione delle antenne cellulari, oltre all'interfaccia web, e' possibile scaricare anche l'intero database in modo da effettuare una consultazione offline



Il database si scarica all'indirizzo http://downloads.opencellid.org/ ed e' particolarmente corposo perche' e' attualmente costituito da un file da 57 Mb compressi di posizioni testuali di celle (corrispondenti a  2390305entrate) e da oltre 4.5 Gb compressi di dati di misure (divisi in 12 file di cui ogni file contiene circa 500.000 misure)

Ovviamente e' impossibile consultare con un editor di testo tale mole di dati e quindi e' necessaria la conversione in database, in particolare MySQL

Per prima cosa si crea la struttura della tabella
----------------------------------------------------------------

-- MySQL dump 10.13  Distrib 5.5.33, for debian-linux-gnu (x86_64)
--
-- Host: localhost    Database: celle
-- ------------------------------------------------------
-- Server version 5.5.33-1

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `celle`
--

DROP TABLE IF EXISTS `celle`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `celle` (
  `mcc` int(11) NOT NULL,
  `mnc` int(11) NOT NULL,
  `lac` int(11) NOT NULL,
  `cellid` int(11) NOT NULL,
  `long` double NOT NULL,
  `lat` double NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
----------------------------------------------------------------

In seguito ci si logga dentro mysql (mysql -u root -p) e si digita il seguente comando

load data infile '/home/luca/Desktop/cell_towers.csv' into table celle columns terminated by ',';

per il seguente risultato
Query OK, 2390305 rows affected, 65535 warnings (1 min 33.18 sec)
Records: 2390305  Deleted: 0  Skipped: 0  Warnings: 2390386

A questo punto si puo' fare una semplice pagina web di consultazione
--------------------------------------------------------
<form action="search.php" method="post">     
MCC: <input type="text" name="mcc" />
MNC: <input type="text" name="mnc" />
LAC: <input type="text" name="lac" />
CellId: <input type="text" name="cellid" />
<input type="Submit" /></form>
--------------------------------------------------------

ed il corrispondente script in Php
--------------------------------------------------------
<?php
$username="root";
$password="xxxxxx";
$database="celle";
mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$query="SELECT * FROM celle WHERE mcc='".$_POST['mcc']."' AND mnc='".$_POST['mnc']."' AND lac  LIKE '".$_POST['lac']."%' AND cellid  LIKE '".$_POST['cellid']."%'";

print $query."<br>";
$result=mysql_query($query);
$num=mysql_numrows($result);


while($row = mysql_fetch_array($result))
  {
  echo "<a target=blank href=\"http://www.openstreetmap.org/?mlat=".$row['lat']."&mlon=".$row['long']."&zoom=12\">MCC:".$row['mcc']."-MNC:".$row['mnc']."-LAC:".$row['lac']."-CellId:".$row['cellid']."</a>";
  echo "<br>";
  }

mysql_close();
?>
--------------------------------------------------------
Lo script riporta un link, cliccando sopra si evidenzia la posizione su Openstreetmap

Similarmente si puo' fare per il database delle misure

Effettuando una esportazione dei punti che sono compresi tra 10-11.9° di longitudine e 42-44.5° latitudine (piu' o meno i confini della Toscana) si osserva che sono censite 6780 antenne di telefonia cellulare ma la loro distribuzione e' molto disomogenea con una curiosa predilezione per le grandi vie di comunicazione