2013-07-10 18:14:17 +04:00
< ? php
class PlaceLookup
{
protected $oDB ;
protected $iPlaceID ;
2015-04-28 22:07:34 +03:00
protected $bIsTiger = false ;
2013-07-10 18:14:17 +04:00
protected $aLangPrefOrder = array ();
protected $bAddressDetails = false ;
function PlaceLookup ( & $oDB )
{
$this -> oDB =& $oDB ;
}
function setLanguagePreference ( $aLangPrefOrder )
{
$this -> aLangPrefOrder = $aLangPrefOrder ;
}
function setIncludeAddressDetails ( $bAddressDetails = true )
{
$this -> bAddressDetails = $bAddressDetails ;
}
function setPlaceID ( $iPlaceID )
{
$this -> iPlaceID = $iPlaceID ;
}
function setOSMID ( $sType , $iID )
{
$sSQL = " select place_id from placex where osm_type = ' " . pg_escape_string ( $sType ) . " ' and osm_id = " . ( int ) $iID . " order by type = 'postcode' asc " ;
$this -> iPlaceID = $this -> oDB -> getOne ( $sSQL );
}
2015-04-28 22:07:34 +03:00
function setIsTiger ( $b = false )
{
$this -> bIsTiger = $b ;
}
2013-07-10 18:14:17 +04:00
function lookup ()
{
2013-08-30 17:21:01 +04:00
if ( ! $this -> iPlaceID ) return null ;
2013-07-10 18:14:17 +04:00
$sLanguagePrefArraySQL = " ARRAY[ " . join ( ',' , array_map ( " getDBQuoted " , $this -> aLangPrefOrder )) . " ] " ;
2014-02-06 17:09:32 +04:00
$sSQL = " select placex.place_id, partition, osm_type, osm_id, class, type, admin_level, housenumber, street, isin, postcode, country_code, extratags, parent_place_id, linked_place_id, rank_address, rank_search, " ;
$sSQL .= " coalesce(importance,0.75-(rank_search::float/40)) as importance, indexed_status, indexed_date, wikipedia, calculated_country_code, " ;
2013-07-10 18:14:17 +04:00
$sSQL .= " get_address_by_language(place_id, $sLanguagePrefArraySQL ) as langaddress, " ;
$sSQL .= " get_name_by_language(name, $sLanguagePrefArraySQL ) as placename, " ;
$sSQL .= " get_name_by_language(name, ARRAY['ref']) as ref, " ;
2014-10-28 16:27:40 +03:00
$sSQL .= " (case when centroid is null then st_y(st_centroid(geometry)) else st_y(centroid) end) as lat, " ;
$sSQL .= " (case when centroid is null then st_x(st_centroid(geometry)) else st_x(centroid) end) as lon " ;
2013-07-10 18:14:17 +04:00
$sSQL .= " from placex where place_id = " . ( int ) $this -> iPlaceID ;
2015-04-28 22:07:34 +03:00
if ( $this -> bIsTiger )
{
$sSQL = " select place_id,partition, 'T' as osm_type, place_id as osm_id, 'place' as class, 'house' as type, null as admin_level, housenumber, null as street, null as isin, postcode, " ;
$sSQL .= " 'us' as country_code, null as extratags, parent_place_id, null as linked_place_id, 30 as rank_address, 30 as rank_search, " ;
$sSQL .= " coalesce(0,0.75-(30::float/40)) as importance, null as indexed_status, null as indexed_date, null as wikipedia, 'us' as calculated_country_code, " ;
$sSQL .= " get_address_by_language(place_id, $sLanguagePrefArraySQL ) as langaddress, " ;
$sSQL .= " null as placename, " ;
$sSQL .= " null as ref, " ;
$sSQL .= " st_y(centroid) as lat, " ;
$sSQL .= " st_x(centroid) as lon " ;
$sSQL .= " from location_property_tiger where place_id = " . ( int ) $this -> iPlaceID ;
}
2013-07-10 18:14:17 +04:00
$aPlace = $this -> oDB -> getRow ( $sSQL );
2015-04-28 22:07:34 +03:00
2015-02-18 19:53:49 +03:00
if ( PEAR :: IsError ( $aPlace ))
{
failInternalError ( " Could not lookup place. " , $sSQL , $aPlace );
}
2015-04-28 22:07:34 +03:00
2013-08-30 17:21:01 +04:00
if ( ! $aPlace [ 'place_id' ]) return null ;
2013-07-10 18:14:17 +04:00
if ( $this -> bAddressDetails )
{
2013-09-09 17:09:28 +04:00
$aAddress = $this -> getAddressNames ();
2013-07-10 18:14:17 +04:00
$aPlace [ 'aAddress' ] = $aAddress ;
}
2015-04-28 22:07:34 +03:00
2013-07-10 18:14:17 +04:00
$aClassType = getClassTypes ();
$sAddressType = '' ;
$sClassType = $aPlace [ 'class' ] . ':' . $aPlace [ 'type' ] . ':' . $aPlace [ 'admin_level' ];
if ( isset ( $aClassType [ $sClassType ]) && isset ( $aClassType [ $sClassType ][ 'simplelabel' ]))
{
$sAddressType = $aClassType [ $aClassType ][ 'simplelabel' ];
}
else
{
$sClassType = $aPlace [ 'class' ] . ':' . $aPlace [ 'type' ];
if ( isset ( $aClassType [ $sClassType ]) && isset ( $aClassType [ $sClassType ][ 'simplelabel' ]))
$sAddressType = $aClassType [ $sClassType ][ 'simplelabel' ];
else $sAddressType = $aPlace [ 'class' ];
}
$aPlace [ 'addresstype' ] = $sAddressType ;
return $aPlace ;
}
2013-09-09 17:09:28 +04:00
function getAddressDetails ( $bAll = false )
{
if ( ! $this -> iPlaceID ) return null ;
$sLanguagePrefArraySQL = " ARRAY[ " . join ( ',' , array_map ( " getDBQuoted " , $this -> aLangPrefOrder )) . " ] " ;
$sSQL = " select *,get_name_by_language(name, $sLanguagePrefArraySQL ) as localname from get_addressdata( " . $this -> iPlaceID . " ) " ;
if ( ! $bAll ) $sSQL .= " WHERE isaddress OR type = 'country_code' " ;
$sSQL .= " order by rank_address desc,isaddress desc " ;
$aAddressLines = $this -> oDB -> getAll ( $sSQL );
if ( PEAR :: IsError ( $aAddressLines ))
{
var_dump ( $aAddressLines );
exit ;
}
return $aAddressLines ;
}
function getAddressNames ()
{
$aAddressLines = $this -> getAddressDetails ( false );;
$aAddress = array ();
$aFallback = array ();
$aClassType = getClassTypes ();
foreach ( $aAddressLines as $aLine )
{
$bFallback = false ;
$aTypeLabel = false ;
if ( isset ( $aClassType [ $aLine [ 'class' ] . ':' . $aLine [ 'type' ] . ':' . $aLine [ 'admin_level' ]])) $aTypeLabel = $aClassType [ $aLine [ 'class' ] . ':' . $aLine [ 'type' ] . ':' . $aLine [ 'admin_level' ]];
elseif ( isset ( $aClassType [ $aLine [ 'class' ] . ':' . $aLine [ 'type' ]])) $aTypeLabel = $aClassType [ $aLine [ 'class' ] . ':' . $aLine [ 'type' ]];
elseif ( isset ( $aClassType [ 'boundary:administrative:' . (( int )( $aLine [ 'rank_address' ] / 2 ))]))
{
$aTypeLabel = $aClassType [ 'boundary:administrative:' . (( int )( $aLine [ 'rank_address' ] / 2 ))];
$bFallback = true ;
}
else
{
$aTypeLabel = array ( 'simplelabel' => 'address' . $aLine [ 'rank_address' ]);
$bFallback = true ;
}
if ( $aTypeLabel && (( isset ( $aLine [ 'localname' ]) && $aLine [ 'localname' ]) || ( isset ( $aLine [ 'housenumber' ]) && $aLine [ 'housenumber' ])))
{
$sTypeLabel = strtolower ( isset ( $aTypeLabel [ 'simplelabel' ]) ? $aTypeLabel [ 'simplelabel' ] : $aTypeLabel [ 'label' ]);
$sTypeLabel = str_replace ( ' ' , '_' , $sTypeLabel );
2014-05-01 01:31:28 +04:00
if ( ! isset ( $aAddress [ $sTypeLabel ]) || ( isset ( $aFallback [ $sTypeLabel ]) && $aFallback [ $sTypeLabel ]) || $aLine [ 'class' ] == 'place' )
2013-09-09 17:09:28 +04:00
{
$aAddress [ $sTypeLabel ] = $aLine [ 'localname' ] ? $aLine [ 'localname' ] : $aLine [ 'housenumber' ];
}
$aFallback [ $sTypeLabel ] = $bFallback ;
}
}
return $aAddress ;
}
2013-07-10 18:14:17 +04:00
}
?>