2013-07-10 18:14:17 +04:00
< ? php
class PlaceLookup
{
protected $oDB ;
protected $iPlaceID ;
2015-08-09 16:14:59 +03:00
protected $sType = false ;
2016-03-10 18:22:39 +03:00
protected $fTigerFraction =- 1 ;
2015-04-28 22:07:34 +03:00
2013-07-10 18:14:17 +04:00
protected $aLangPrefOrder = array ();
protected $bAddressDetails = false ;
2015-08-09 16:14:59 +03:00
protected $bExtraTags = false ;
protected $bNameDetails = false ;
2013-07-10 18:14:17 +04:00
function PlaceLookup ( & $oDB )
{
$this -> oDB =& $oDB ;
}
function setLanguagePreference ( $aLangPrefOrder )
{
$this -> aLangPrefOrder = $aLangPrefOrder ;
}
function setIncludeAddressDetails ( $bAddressDetails = true )
{
$this -> bAddressDetails = $bAddressDetails ;
}
2015-08-09 16:14:59 +03:00
function setIncludeExtraTags ( $bExtraTags = false )
{
if (( float ) CONST_Postgresql_Version > 9.2 )
{
$this -> bExtraTags = $bExtraTags ;
}
}
function setIncludeNameDetails ( $bNameDetails = false )
{
if (( float ) CONST_Postgresql_Version > 9.2 )
{
$this -> bNameDetails = $bNameDetails ;
}
}
2013-07-10 18:14:17 +04:00
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-08-09 16:14:59 +03:00
function lookupPlace ( $details )
2015-04-28 22:07:34 +03:00
{
2015-08-09 16:14:59 +03:00
if ( isset ( $details [ 'place_id' ])) $this -> iPlaceID = $details [ 'place_id' ];
if ( isset ( $details [ 'type' ])) $this -> sType = $details [ 'type' ];
if ( isset ( $details [ 'osm_type' ]) && isset ( $details [ 'osm_id' ]))
{
$this -> setOSMID ( $details [ 'osm_type' ], $details [ 'osm_id' ]);
}
2016-03-10 18:22:39 +03:00
if ( isset ( $details [ 'fraction' ])) $this -> fTigerFraction = $details [ 'fraction' ];
2015-08-09 16:14:59 +03:00
return $this -> lookup ();
2015-04-28 22:07:34 +03:00
}
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 )) . " ] " ;
2015-08-09 16:14:59 +03:00
if ( $this -> sType == 'tiger' )
2015-04-28 22:07:34 +03:00
{
$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, " ;
2015-08-09 16:14:59 +03:00
$sSQL .= " 'us' as country_code, parent_place_id, null as linked_place_id, 30 as rank_address, 30 as rank_search, " ;
2015-04-28 22:14:36 +03:00
$sSQL .= " coalesce(null,0.75-(30::float/40)) as importance, null as indexed_status, null as indexed_date, null as wikipedia, 'us' as calculated_country_code, " ;
2016-03-10 18:22:39 +03:00
$sSQL .= " get_address_by_language(place_id, housenumber, $sLanguagePrefArraySQL ) as langaddress, " ;
2015-04-28 22:07:34 +03:00
$sSQL .= " null as placename, " ;
$sSQL .= " null as ref, " ;
2015-08-09 16:14:59 +03:00
if ( $this -> bExtraTags ) $sSQL .= " null as extra, " ;
if ( $this -> bNameDetails ) $sSQL .= " null as names, " ;
2016-03-10 18:22:39 +03:00
$sSQL .= " ST_X(point) as lon, ST_Y(point) as lat from (select *, ST_LineInterpolatePoint(linegeo, (housenumber-startnumber::float)/(endnumber-startnumber)::float) as point from " ;
$sSQL .= " (select *, " ;
$sSQL .= " CASE WHEN interpolationtype='odd' THEN floor(( " . $this -> fTigerFraction . " *(endnumber-startnumber)+startnumber)/2)::int*2+1 " ;
$sSQL .= " WHEN interpolationtype='even' THEN (( " . $this -> fTigerFraction . " *(endnumber-startnumber)+startnumber+1)/2)::int*2 " ;
$sSQL .= " WHEN interpolationtype='all' THEN ( " . $this -> fTigerFraction . " *(endnumber-startnumber)+startnumber)::int " ;
$sSQL .= " END as housenumber " ;
$sSQL .= " from location_property_tiger where place_id = " . ( int ) $this -> iPlaceID . " ) as blub1) as blub2 " ;
2015-04-28 22:07:34 +03:00
}
2015-08-09 16:14:59 +03:00
else
{
$sSQL = " select placex.place_id, partition, osm_type, osm_id, class, type, admin_level, housenumber, street, isin, postcode, country_code, 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, " ;
2016-03-10 18:22:39 +03:00
$sSQL .= " get_address_by_language(place_id, -1, $sLanguagePrefArraySQL ) as langaddress, " ;
2015-08-09 16:14:59 +03:00
$sSQL .= " get_name_by_language(name, $sLanguagePrefArraySQL ) as placename, " ;
$sSQL .= " get_name_by_language(name, ARRAY['ref']) as ref, " ;
if ( $this -> bExtraTags ) $sSQL .= " hstore_to_json(extratags) as extra, " ;
if ( $this -> bNameDetails ) $sSQL .= " hstore_to_json(name) as names, " ;
$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 " ;
$sSQL .= " from placex where place_id = " . ( int ) $this -> iPlaceID ;
}
2015-04-28 22:07:34 +03:00
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 )
{
2016-03-10 18:22:39 +03:00
if ( $this -> sType == 'tiger' ) // to get addressdetails for tiger data, the housenumber is needed
$aAddress = $this -> getAddressNames ( $aPlace [ 'housenumber' ]);
else
$aAddress = $this -> getAddressNames ();
2013-07-10 18:14:17 +04:00
$aPlace [ 'aAddress' ] = $aAddress ;
}
2015-08-09 16:14:59 +03:00
if ( $this -> bExtraTags )
{
if ( $aPlace [ 'extra' ])
{
$aPlace [ 'sExtraTags' ] = json_decode ( $aPlace [ 'extra' ]);
}
else
{
2015-08-15 10:52:48 +03:00
$aPlace [ 'sExtraTags' ] = ( object ) array ();
2015-08-09 16:14:59 +03:00
}
}
if ( $this -> bNameDetails )
{
if ( $aPlace [ 'names' ])
{
$aPlace [ 'sNameDetails' ] = json_decode ( $aPlace [ 'names' ]);
}
else
{
2015-08-15 10:52:48 +03:00
$aPlace [ 'sNameDetails' ] = ( object ) array ();
2015-08-09 16:14:59 +03:00
}
}
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
2016-03-10 18:22:39 +03:00
function getAddressDetails ( $bAll = false , $housenumber = - 1 )
2013-09-09 17:09:28 +04:00
{
if ( ! $this -> iPlaceID ) return null ;
$sLanguagePrefArraySQL = " ARRAY[ " . join ( ',' , array_map ( " getDBQuoted " , $this -> aLangPrefOrder )) . " ] " ;
2016-03-10 18:22:39 +03:00
$sSQL = " select *,get_name_by_language(name, $sLanguagePrefArraySQL ) as localname from get_addressdata( " . $this -> iPlaceID . " , " . $housenumber . " ) " ;
2013-09-09 17:09:28 +04:00
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 ;
}
2016-03-10 18:22:39 +03:00
function getAddressNames ( $housenumber = - 1 )
2013-09-09 17:09:28 +04:00
{
2016-03-10 18:22:39 +03:00
$aAddressLines = $this -> getAddressDetails ( false , $housenumber );
2013-09-09 17:09:28 +04:00
$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
}
?>