<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://wiki.landscapefor.eu/index.php?action=history&amp;feed=atom&amp;title=Sostegno%2F2022%2FMicrogrant_WMI%2FRelazione_conclusiva%2Fscript-import-export.php</id>
	<title>Sostegno/2022/Microgrant WMI/Relazione conclusiva/script-import-export.php - Cronologia</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.landscapefor.eu/index.php?action=history&amp;feed=atom&amp;title=Sostegno%2F2022%2FMicrogrant_WMI%2FRelazione_conclusiva%2Fscript-import-export.php"/>
	<link rel="alternate" type="text/html" href="https://wiki.landscapefor.eu/index.php?title=Sostegno/2022/Microgrant_WMI/Relazione_conclusiva/script-import-export.php&amp;action=history"/>
	<updated>2026-05-13T12:32:15Z</updated>
	<subtitle>Cronologia della pagina su questo sito</subtitle>
	<generator>MediaWiki 1.35.13</generator>
	<entry>
		<id>https://wiki.landscapefor.eu/index.php?title=Sostegno/2022/Microgrant_WMI/Relazione_conclusiva/script-import-export.php&amp;diff=4981&amp;oldid=prev</id>
		<title>System.bot: export from /home/www-data/landscapefor/atlas/beta/cli/wikidata-import-export.php</title>
		<link rel="alternate" type="text/html" href="https://wiki.landscapefor.eu/index.php?title=Sostegno/2022/Microgrant_WMI/Relazione_conclusiva/script-import-export.php&amp;diff=4981&amp;oldid=prev"/>
		<updated>2022-06-06T11:32:01Z</updated>

		<summary type="html">&lt;p&gt;export from /home/www-data/landscapefor/atlas/beta/cli/wikidata-import-export.php&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nuova pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This is the [[atlas:|AtlasFor]]'s '''Wikidata import-export''' command line interface script.&lt;br /&gt;
&lt;br /&gt;
It's designed to:&lt;br /&gt;
&lt;br /&gt;
* list all [[atlas:|AtlasFor]] point of interests, by last import date first&lt;br /&gt;
* chunk them 50 at time, to then do a single HTTP call to the [https://www.wikidata.org/w/api.php?action=help&amp;amp;modules=wbgetentities Wikidata &amp;lt;code&amp;gt;wbgetentities&amp;lt;/code&amp;gt; API]&lt;br /&gt;
** this is done using the [https://gitpull.it/w/first_steps_with_boz-mw/ boz-mw] framework using &amp;lt;code&amp;gt;Wikidata::instance()-&amp;gt;fetch()&amp;lt;/code&amp;gt;&lt;br /&gt;
* update our local Wikidata identifiers with any upstream Wikidata redirect (fixing merges)&lt;br /&gt;
* export our label in Wikidata, only if one is missing&lt;br /&gt;
* export our short description in Wikidata, only if one is missing&lt;br /&gt;
* export our geolocation in Wikidata, only if one is missing and if it's not an area&lt;br /&gt;
** if the preferred geolocation is NOT the one from AtlasFor, investigate why&lt;br /&gt;
*** allow to push or pull a better geolocation from/in Wikidata&lt;br /&gt;
* import Wikipedia editions (in some languages)&lt;br /&gt;
* import Wikimedia Commons link&lt;br /&gt;
* import official website (keeping language), and other identifiers&lt;br /&gt;
* export our street address, only if one is missing and if it's not an area&lt;br /&gt;
** import it, if we have not it&lt;br /&gt;
* export our local identifier (https://www.wikidata.org/wiki/Property:P7004) if we saved at least 1 thing, or if our POI is important&lt;br /&gt;
&lt;br /&gt;
 /home/www-data/landscapefor/atlas/beta/cli/wikidata-import-export.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/php&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
# Landscapefor-map - The &amp;quot;Landscapefor&amp;quot; map management system&lt;br /&gt;
# Copyright (C) 2018, 2019, 2020, 2021, 2022 Valerio Bozzolan&lt;br /&gt;
#&lt;br /&gt;
# This program is free software: you can redistribute it and/or modify&lt;br /&gt;
# it under the terms of the GNU General Public License as published by&lt;br /&gt;
# the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
# (at your option) any later version.&lt;br /&gt;
#&lt;br /&gt;
# This program is distributed in the hope that it will be useful,&lt;br /&gt;
# but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;br /&gt;
# GNU General Public License for more details.&lt;br /&gt;
#&lt;br /&gt;
# You should have received a copy of the GNU General Public License&lt;br /&gt;
# along with this program. If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
// allowed only from command line interface&lt;br /&gt;
if( !isset( $argv[ 0 ] ) ) {&lt;br /&gt;
	exit( 1 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// autoload suckless-php&lt;br /&gt;
require __DIR__ . '/../load.php';&lt;br /&gt;
&lt;br /&gt;
// autoload boz-php&lt;br /&gt;
require BOZ_MW;&lt;br /&gt;
&lt;br /&gt;
// declare usage of useful classes&lt;br /&gt;
use \wm\Wikidata;&lt;br /&gt;
use \wb\StatementExternalID;&lt;br /&gt;
use \wb\StatementGlobeCoordinate;&lt;br /&gt;
use \wb\StatementMonolingualText;&lt;br /&gt;
use \wb\Label;&lt;br /&gt;
use \wb\Reference;&lt;br /&gt;
use \wb\SnakURL;&lt;br /&gt;
use \wb\SnakTime;&lt;br /&gt;
use \wb\SnakItem;&lt;br /&gt;
&lt;br /&gt;
// command line arguments&lt;br /&gt;
$opts = getopt( '', [&lt;br /&gt;
	'poiid:',&lt;br /&gt;
	'no-export',&lt;br /&gt;
	'no-import-messages',&lt;br /&gt;
	'no-just-identifiers',&lt;br /&gt;
	'upgrade-coordinates',&lt;br /&gt;
] );&lt;br /&gt;
&lt;br /&gt;
$LANGUAGE_PREFERENCES = [&lt;br /&gt;
	'it',&lt;br /&gt;
	'en',&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
// export option&lt;br /&gt;
$POIID      = $opts['poiid'] ?? null;&lt;br /&gt;
$EXPORT     = !isset( $opts['no-export'] );&lt;br /&gt;
$NO_IMPORT  =  isset( $opts['no-import-messages'] );&lt;br /&gt;
$NO_JUST_ID =  isset( $opts['no-just-identifiers'] );&lt;br /&gt;
$UP_COORDS  =  isset( $opts['upgrade-coordinates'] );&lt;br /&gt;
&lt;br /&gt;
// when a single POI is selected, try to upgrade the coordinates&lt;br /&gt;
if( $POIID ) {&lt;br /&gt;
	$UP_COORDS = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;--poiid               specified: &amp;quot; . ( $POIID      ? $POIID : 'no'  ) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
echo &amp;quot;--no-export           specified: &amp;quot; . ( $EXPORT     ? 'no'   : 'yes' ) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
echo &amp;quot;--upgrade-coordinates specified: &amp;quot; . ( $UP_COORDS  ? 'yes'  : 'no'  ) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
echo &amp;quot;--no-import-messages  specified: &amp;quot; . ( $NO_IMPORT  ? 'yes'  : 'no'  ) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
echo &amp;quot;--no-just-identifiers specified: &amp;quot; . ( $NO_JUST_ID ? 'yes'  : 'no'  ) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// to avoid to save addresses like 'Torino' or other shitty stuff&lt;br /&gt;
$MIN_LENGTH_ADDRESS = 14;&lt;br /&gt;
&lt;br /&gt;
$WIKIDATA_LANGUAGES = [&lt;br /&gt;
	'Q1860' =&amp;gt; 'en',&lt;br /&gt;
	'Q652'  =&amp;gt; 'it',&lt;br /&gt;
	'Q150'  =&amp;gt; 'fr',&lt;br /&gt;
	'Q7850' =&amp;gt; 'zh',&lt;br /&gt;
	'Q8798' =&amp;gt; 'uk',&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
// properties to be queried from Wikidata APIs&lt;br /&gt;
$ENTITY_PROPS = [&lt;br /&gt;
	'labels',&lt;br /&gt;
	'descriptions',&lt;br /&gt;
	'claims',&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
// get the externalsites that can be extracted from a Wikidata property&lt;br /&gt;
$importable_identifiers =&lt;br /&gt;
	( new ExternalsiteApi() )&lt;br /&gt;
		-&amp;gt;joinExternalsitecategory()&lt;br /&gt;
		-&amp;gt;whereWikidataPropertyIsNotNULL()&lt;br /&gt;
		-&amp;gt;queryResults();&lt;br /&gt;
&lt;br /&gt;
$POI_FIELDS = [&lt;br /&gt;
	POI::ID,&lt;br /&gt;
	POI::NAME,&lt;br /&gt;
	POI::LAT,&lt;br /&gt;
	POI::LNG,&lt;br /&gt;
	POI::WIKIDATA,&lt;br /&gt;
	POI::ADDRESS,&lt;br /&gt;
	POI::CAPTION,&lt;br /&gt;
	POI::EXTERNAL_URLS,&lt;br /&gt;
	POI::COMUNE_,&lt;br /&gt;
	Comune::NAME,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
$only_published_medias = function( $query ) {&lt;br /&gt;
	$query-&amp;gt;joinMedia();&lt;br /&gt;
	$query-&amp;gt;whereMediaIsPublished();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
$pois = new QueryPOI();&lt;br /&gt;
$pois-&amp;gt;defaultClass( POIFull::class );&lt;br /&gt;
$pois-&amp;gt;joinComune( 'LEFT') ;&lt;br /&gt;
$pois-&amp;gt;select( $POI_FIELDS );&lt;br /&gt;
$pois-&amp;gt;selectPOIMediaCount( $only_published_medias );&lt;br /&gt;
&lt;br /&gt;
if( $POIID ) {&lt;br /&gt;
	$pois-&amp;gt;wherePOIID( $POIID );&lt;br /&gt;
} else {&lt;br /&gt;
	$pois-&amp;gt;whereStr( POI::STATUS, 'published' );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$pois-&amp;gt;compare( POI::WIKIDATA, 'IS NOT', 'NULL' );&lt;br /&gt;
&lt;br /&gt;
// first POIs that was never marked as imported&lt;br /&gt;
$pois-&amp;gt;orderBy( 'poi_lastwikidataimport', 'ASC' );&lt;br /&gt;
&lt;br /&gt;
$wikidata = Wikidata::instance()&lt;br /&gt;
	-&amp;gt;login( WIKIMEDIA_BOT_USERNAME, WIKIMEDIA_BOT_PASSWORD );&lt;br /&gt;
&lt;br /&gt;
$poi_generator = $pois-&amp;gt;queryGenerator();&lt;br /&gt;
&lt;br /&gt;
// process 50 at time&lt;br /&gt;
foreach( chunk_generator( $poi_generator, 50 ) as $poi_chunk ) {&lt;br /&gt;
&lt;br /&gt;
	// process few of them&lt;br /&gt;
	$poi_by_wikidata_id = [];&lt;br /&gt;
	foreach( $poi_chunk as $poi ) {&lt;br /&gt;
		// note that Wikidata codes can be empty&lt;br /&gt;
		if( $poi-&amp;gt;get( POI::WIKIDATA ) ) {&lt;br /&gt;
			$poi_by_wikidata_id[ $poi-&amp;gt;get( POI::WIKIDATA ) ] = $poi;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$entities = [];&lt;br /&gt;
	try {&lt;br /&gt;
		$entities = $wikidata-&amp;gt;fetch( [&lt;br /&gt;
			'action' =&amp;gt; 'wbgetentities',&lt;br /&gt;
			'ids'   =&amp;gt; array_keys( $poi_by_wikidata_id ),&lt;br /&gt;
			'props' =&amp;gt; $ENTITY_PROPS,&lt;br /&gt;
		] );&lt;br /&gt;
	} catch( mw\API\NoSuchEntityException $e ) {&lt;br /&gt;
		\cli\Log::error( $e-&amp;gt;getMessage() );&lt;br /&gt;
		sleep( 5 );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// it should be just one&lt;br /&gt;
	foreach( $entities-&amp;gt;entities ?? [] as $entity ) {&lt;br /&gt;
&lt;br /&gt;
		$entity_id = $entity-&amp;gt;id;&lt;br /&gt;
		$new_entity_id = null;&lt;br /&gt;
		if( isset( $entity-&amp;gt;redirects ) ) {&lt;br /&gt;
			$entity_id     = $entity-&amp;gt;redirects-&amp;gt;from;&lt;br /&gt;
			$new_entity_id = $entity-&amp;gt;redirects-&amp;gt;to;&lt;br /&gt;
		}&lt;br /&gt;
		$poi = $poi_by_wikidata_id[ $entity_id ];&lt;br /&gt;
&lt;br /&gt;
		if( !$poi ) {&lt;br /&gt;
			var_dump( $entity );&lt;br /&gt;
			die( &amp;quot;not found entity\n&amp;quot; );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		$need_to_refresh_poi = false;&lt;br /&gt;
&lt;br /&gt;
		$entity_data = $wikidata-&amp;gt;createDataModelFromObject( $entity );&lt;br /&gt;
&lt;br /&gt;
		// allow to refresh the POI later&lt;br /&gt;
		do {&lt;br /&gt;
&lt;br /&gt;
			$poi_ID = $poi-&amp;gt;getPOIID();&lt;br /&gt;
&lt;br /&gt;
			echo &amp;quot;Analyzing POI {$poi_ID}\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			// check if this POI need to be refreshed (maybe this is the second loop)&lt;br /&gt;
			if( $need_to_refresh_poi ) {&lt;br /&gt;
&lt;br /&gt;
				// pull data from AtlasFor&lt;br /&gt;
				$poi = ( new QueryPOI() )&lt;br /&gt;
					-&amp;gt;select( $POI_FIELDS )&lt;br /&gt;
					-&amp;gt;selectPOIMediaCount( $only_published_medias )&lt;br /&gt;
					-&amp;gt;joinComune( 'LEFT' )&lt;br /&gt;
					-&amp;gt;wherePOI( $poi )&lt;br /&gt;
					-&amp;gt;defaultClass( POIFull::class )&lt;br /&gt;
					-&amp;gt;queryRow();&lt;br /&gt;
&lt;br /&gt;
				// pull most recent Wikidata ID&lt;br /&gt;
				$entity_id = $poi-&amp;gt;get( POI::WIKIDATA );&lt;br /&gt;
&lt;br /&gt;
				// pull data from Wikidata&lt;br /&gt;
				$entity_data = $wikidata-&amp;gt;fetchSingleEntity( $entity_id, [&lt;br /&gt;
					'props' =&amp;gt; $ENTITY_PROPS,&lt;br /&gt;
				] );&lt;br /&gt;
&lt;br /&gt;
				$need_to_refresh_poi = false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// empty container for information to be saved&lt;br /&gt;
			$new_data = $entity_data-&amp;gt;cloneEmpty();&lt;br /&gt;
&lt;br /&gt;
			// wikidata standard reference&lt;br /&gt;
			$reference = new Reference( [&lt;br /&gt;
				// reference URL: AtlasFor&lt;br /&gt;
				new SnakURL( 'P854', &amp;quot;https://atlasf.eu/poi/$poi_ID&amp;quot; ),&lt;br /&gt;
&lt;br /&gt;
				// retrieved point in time: now&lt;br /&gt;
				new SnakTime( 'P813' ),&lt;br /&gt;
			] );&lt;br /&gt;
&lt;br /&gt;
			// update redirected Wikidata ID&lt;br /&gt;
			if( $poi &amp;amp;&amp;amp; $new_entity_id ) {&lt;br /&gt;
				update_poi( $poi, [&lt;br /&gt;
					new DBCol( POI::WIKIDATA, $new_entity_id, 's' ),&lt;br /&gt;
				] );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$summary = [];&lt;br /&gt;
			$imports = [];&lt;br /&gt;
&lt;br /&gt;
			// export italian label&lt;br /&gt;
			if( !$entity_data-&amp;gt;hasLabelInLanguage( 'it' ) ) {&lt;br /&gt;
				$label = new Label( 'it', $poi-&amp;gt;getPOIName() );&lt;br /&gt;
				$new_data-&amp;gt;setLabel( $label );&lt;br /&gt;
				$summary[] = &amp;quot;add label it: &amp;quot; . $poi-&amp;gt;getPOIName();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// export English label&lt;br /&gt;
			if( !$entity_data-&amp;gt;hasLabelInLanguage( 'en' ) ) {&lt;br /&gt;
				$label = new Label( 'en', $poi-&amp;gt;getPOIName() );&lt;br /&gt;
				$new_data-&amp;gt;setLabel( $label );&lt;br /&gt;
				$summary[] = &amp;quot;add label en: &amp;quot; . $poi-&amp;gt;getPOIName();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// for each importable identifier (from a Wikidata property like Official website)&lt;br /&gt;
			foreach( $importable_identifiers as $importable_identifier ) {&lt;br /&gt;
&lt;br /&gt;
				// this may be official website, Facebook, etc.&lt;br /&gt;
				$wikidata_property = $importable_identifier-&amp;gt;getWikidataProperty();&lt;br /&gt;
				$identifier_name   = $importable_identifier-&amp;gt;getExternalsitecategoryName();&lt;br /&gt;
&lt;br /&gt;
				// import official website or whatever official external URL (take all claims)&lt;br /&gt;
				foreach( $entity_data-&amp;gt;getClaimsInProperty( $wikidata_property ) as $claim ) {&lt;br /&gt;
&lt;br /&gt;
					// index the websites by the language&lt;br /&gt;
					$sites_by_lang = [];&lt;br /&gt;
&lt;br /&gt;
					// try to associate to a language&lt;br /&gt;
					$site = $claim-&amp;gt;getMainsnak()-&amp;gt;getDataValue()-&amp;gt;getValue();&lt;br /&gt;
					if( $site ) {&lt;br /&gt;
&lt;br /&gt;
						// read 'language of work or name' to identify the language&lt;br /&gt;
						foreach( $claim-&amp;gt;getQualifiersInProperty( 'P407' ) as $qualifier ) {&lt;br /&gt;
							$lang = $qualifier-&amp;gt;getDataValue()-&amp;gt;getValue()[ 'id' ];&lt;br /&gt;
							if( $lang ) {&lt;br /&gt;
								if( isset( $WIKIDATA_LANGUAGES[ $lang ] ) ) {&lt;br /&gt;
									$sites_by_lang[ $WIKIDATA_LANGUAGES[ $lang ] ] = $site;&lt;br /&gt;
								}&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
&lt;br /&gt;
						// case for no language specified&lt;br /&gt;
						if( !$sites_by_lang ) {&lt;br /&gt;
							$sites_by_lang['none'] = $site;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					// save official website&lt;br /&gt;
					foreach( $sites_by_lang as $lang =&amp;gt; $site ) {&lt;br /&gt;
&lt;br /&gt;
						// query the externalsite (in that language)&lt;br /&gt;
						$externalsite_query = new ExternalsiteApi();&lt;br /&gt;
						$externalsite_query-&amp;gt;whereExternalsitecategory( $importable_identifier );&lt;br /&gt;
						if( $lang === 'none' ) {&lt;br /&gt;
							$externalsite_query-&amp;gt;whereExternalsiteLangIsNULL();&lt;br /&gt;
						} else {&lt;br /&gt;
							$externalsite_query-&amp;gt;whereExternalsiteLang( $lang );&lt;br /&gt;
						}&lt;br /&gt;
						$externalsite = $externalsite_query-&amp;gt;queryRow();&lt;br /&gt;
&lt;br /&gt;
						if( !$externalsite ) {&lt;br /&gt;
							error_die( &amp;quot;missing site for {$identifier_name}[lang:$lang]&amp;quot; );&lt;br /&gt;
						}&lt;br /&gt;
&lt;br /&gt;
						/*&lt;br /&gt;
						 * If the italian language is found, delete the website without language that is less precise&lt;br /&gt;
						 * This is useful when:&lt;br /&gt;
						 *   - Today I import an official website without language&lt;br /&gt;
						 *   - Tomorrow I import that official website in Italian (someone specified the language of name or work)&lt;br /&gt;
						 */&lt;br /&gt;
						if( $lang === 'it' ) {&lt;br /&gt;
&lt;br /&gt;
							// check if it exists a version of this identifier without language&lt;br /&gt;
							$neutral_externalsite = ( new ExternalsiteApi() )&lt;br /&gt;
								-&amp;gt;whereExternalsiteCategory( $importable_identifier )&lt;br /&gt;
								-&amp;gt;whereExternalsiteLangIsNULL()&lt;br /&gt;
								-&amp;gt;queryRow();&lt;br /&gt;
&lt;br /&gt;
							// delete the neutral entries (if any)&lt;br /&gt;
							if( $neutral_externalsite ) {&lt;br /&gt;
								$neutral_externalsitepage_query =&lt;br /&gt;
									( new ExternalsitepageApi() )&lt;br /&gt;
										-&amp;gt;whereExternalsite( $neutral_externalsite )&lt;br /&gt;
										-&amp;gt;wherePOI( $poi );&lt;br /&gt;
&lt;br /&gt;
								if( $neutral_externalsitepage_query-&amp;gt;queryRow() ) {&lt;br /&gt;
									$imports[] = &amp;quot;delete imprecise version of $identifier_name\n&amp;quot;;&lt;br /&gt;
									$neutral_externalsitepage_query-&amp;gt;delete();&lt;br /&gt;
								}&lt;br /&gt;
							}&lt;br /&gt;
						} else {&lt;br /&gt;
							$externalsite_query-&amp;gt;whereExternalsiteLang( $lang );&lt;br /&gt;
						}&lt;br /&gt;
&lt;br /&gt;
						// find existing external site page&lt;br /&gt;
						$externalsitepage = ( new ExternalsitepageApi() )&lt;br /&gt;
							-&amp;gt;whereExternalsite( $externalsite )&lt;br /&gt;
							-&amp;gt;wherePOI( $poi )&lt;br /&gt;
							-&amp;gt;queryRow();&lt;br /&gt;
&lt;br /&gt;
						// append a new one&lt;br /&gt;
						if( $externalsitepage ) {&lt;br /&gt;
							if( $claim-&amp;gt;isDeprecated() ) {&lt;br /&gt;
								// if is deprecated, drop&lt;br /&gt;
								( new ExternalsitepageApi() )&lt;br /&gt;
									-&amp;gt;whereExternalsitepage( $externalsitepage )&lt;br /&gt;
									-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
								$imports[] = &amp;quot;deleted now deprecated {$identifier_name}[lang:$lang]&amp;quot;;&lt;br /&gt;
							}&lt;br /&gt;
						} else {&lt;br /&gt;
							// import only if it's not deprecated&lt;br /&gt;
							if( !$claim-&amp;gt;isDeprecated() ) {&lt;br /&gt;
								( new ExternalsitepageApi() )&lt;br /&gt;
									-&amp;gt;insertRow( [&lt;br /&gt;
										new DBCol( 'externalsite_ID',                $externalsite-&amp;gt;getExternalsiteID(), 'd' ),&lt;br /&gt;
										new DBCol( 'externalsitepage_uid',           $site,                              's' ),&lt;br /&gt;
										new DBCol( 'poi_ID',                         $poi_ID,                            'd' ),&lt;br /&gt;
										new DBCOl( 'externalsitepage_lastedit_date', 'NOW()',                            '-' ),&lt;br /&gt;
										new DBCol( 'externalsitepage_lastedit_user', 1,                                  'd' ),&lt;br /&gt;
									] );&lt;br /&gt;
&lt;br /&gt;
								$imports[] = &amp;quot;import {$identifier_name}[lang:$lang]: '$site'&amp;quot;;&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$is_area =&lt;br /&gt;
				$entity_data-&amp;gt;hasClaimsInProperty( 'P159' )  // headquarters location&lt;br /&gt;
				||&lt;br /&gt;
				$entity_data-&amp;gt;hasClaimsInProperty( 'P1332' ) // coordinates of northernmost point&lt;br /&gt;
				||&lt;br /&gt;
				$entity_data-&amp;gt;hasClaimsInProperty( 'P1333' ) // coordinates of southernmost point&lt;br /&gt;
				||&lt;br /&gt;
				$entity_data-&amp;gt;hasClaimsInProperty( 'P1334' ) // coordinates of easternmost point&lt;br /&gt;
				||&lt;br /&gt;
				$entity_data-&amp;gt;hasClaimsInProperty( 'P1335' ) // coordinates of westernmost point&lt;br /&gt;
				||&lt;br /&gt;
				$entity_data-&amp;gt;hasClaimsInProperty( 'P1376' ) // capital of&lt;br /&gt;
				||&lt;br /&gt;
				$entity_data-&amp;gt;hasClaimsInProperty( 'P1082' ) // population&lt;br /&gt;
				||&lt;br /&gt;
				$entity_data-&amp;gt;hasClaimsInProperty( 'P2046' ) // area (km)&lt;br /&gt;
				;&lt;br /&gt;
&lt;br /&gt;
			// eventually add coordinates&lt;br /&gt;
			if( !$is_area ) {&lt;br /&gt;
&lt;br /&gt;
				$all_coordinates = $entity_data-&amp;gt;getClaimsInProperty( 'P625' );&lt;br /&gt;
&lt;br /&gt;
				// at the moment we assume that we have better coordinates ONLY if there are not&lt;br /&gt;
				$we_have_better_coordinates = false;&lt;br /&gt;
				if( !count( $all_coordinates ) ) {&lt;br /&gt;
					$we_have_better_coordinates = true;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				// check if we already saved some coordinates&lt;br /&gt;
				foreach( $entity_data-&amp;gt;getClaimsInProperty( 'P625' ) as $claim_coordinates ) {&lt;br /&gt;
&lt;br /&gt;
					$found_our_claim_reference = find_claim_reference_url( $claim_coordinates, 'https://atlasf.eu/' );&lt;br /&gt;
&lt;br /&gt;
					// check if we can upgrade coordinates (since they differs, on AtlasFor are probably more recent)&lt;br /&gt;
					if( $found_our_claim_reference &amp;amp;&amp;amp; $UP_COORDS ) {&lt;br /&gt;
&lt;br /&gt;
						// TODO: do something to understand if:&lt;br /&gt;
						//   this is our: automatic&lt;br /&gt;
						$upstream_coordinates_raw = $claim_coordinates-&amp;gt;getMainsnak()-&amp;gt;getDataValue()-&amp;gt;getValue();&lt;br /&gt;
						$upstream_coordinates_raw_lat = $upstream_coordinates_raw['latitude'];&lt;br /&gt;
						$upstream_coordinates_raw_lng = $upstream_coordinates_raw['longitude'];&lt;br /&gt;
&lt;br /&gt;
						if( has_poi_different_coordinates( $poi, $upstream_coordinates_raw_lat, $upstream_coordinates_raw_lng ) ) {&lt;br /&gt;
&lt;br /&gt;
							// show this coordinates&lt;br /&gt;
							echo &amp;quot;Upstream coordinates with rank &amp;quot; . $claim_coordinates-&amp;gt;getRank() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
							echo GeoTools::geohackURL( [&lt;br /&gt;
								'lat' =&amp;gt; $upstream_coordinates_raw_lat,&lt;br /&gt;
								'lng' =&amp;gt; $upstream_coordinates_raw_lng,&lt;br /&gt;
							] );&lt;br /&gt;
&lt;br /&gt;
							echo &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
							echo &amp;quot;Current coordinates:\n&amp;quot;;&lt;br /&gt;
							echo $poi-&amp;gt;getPOIGeohackURL() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
							echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
							$we_have_better_coordinates_input = readline( &amp;quot;Is the new better? [Y/n]\n&amp;quot; );&lt;br /&gt;
							$we_have_better_coordinates_input = strtolower( $we_have_better_coordinates_input );&lt;br /&gt;
							if( $we_have_better_coordinates_input !== 'n' ) {&lt;br /&gt;
								$we_have_better_coordinates = true;&lt;br /&gt;
&lt;br /&gt;
								if( true ) {&lt;br /&gt;
									// mark for removal&lt;br /&gt;
									$claim_coordinates-&amp;gt;markForRemoval();&lt;br /&gt;
									$new_data-&amp;gt;addClaim( $claim_coordinates );&lt;br /&gt;
&lt;br /&gt;
									$summary[] = &amp;quot;remove obsolete [[Property:P625|coordinate location]]&amp;quot;;&lt;br /&gt;
								} else {&lt;br /&gt;
									// set this as obsolete&lt;br /&gt;
									$claim_coordinates-&amp;gt;setRankDeprecated();&lt;br /&gt;
									$claim_coordinates-&amp;gt;addQualifier( new SnakItem( 'P2241', 'Q107356532' ) );&lt;br /&gt;
									$new_data-&amp;gt;addClaim( $claim_coordinates );&lt;br /&gt;
&lt;br /&gt;
									$summary[] = &amp;quot;obsolete [[Property:P625|coordinate location]]&amp;quot;;&lt;br /&gt;
								}&lt;br /&gt;
							}&lt;br /&gt;
&lt;br /&gt;
						} else {&lt;br /&gt;
							echo &amp;quot;Upstream up to date\n&amp;quot;;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if( $we_have_better_coordinates ) {&lt;br /&gt;
&lt;br /&gt;
					// coordinate location&lt;br /&gt;
					$statement = new StatementGlobeCoordinate( 'P625',&lt;br /&gt;
						$poi-&amp;gt;getPOILatitude(),&lt;br /&gt;
						$poi-&amp;gt;getPOILongitude(),&lt;br /&gt;
						0.01&lt;br /&gt;
					);&lt;br /&gt;
&lt;br /&gt;
					// append coordinates&lt;br /&gt;
					$new_data-&amp;gt;addClaim( $statement-&amp;gt;addReference( $reference ) );&lt;br /&gt;
&lt;br /&gt;
					$summary[] = &amp;quot;add [[Property:P625|coordinate location]]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
					echo &amp;quot;Our location:\n&amp;quot;;&lt;br /&gt;
					echo $poi-&amp;gt;getPOIGeohackURL() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// address import-export&lt;br /&gt;
			$address = $poi-&amp;gt;get( POI::ADDRESS );&lt;br /&gt;
			if( $address ) {&lt;br /&gt;
				if( !$is_area ) {&lt;br /&gt;
					// export address&lt;br /&gt;
					if( strlen( $address ) &amp;gt; $MIN_LENGTH_ADDRESS &amp;amp;&amp;amp; !$entity_data-&amp;gt;hasClaimsInProperty( 'P6375' ) ) {&lt;br /&gt;
						$statement = new StatementMonolingualText( 'P6375', 'it', $address );&lt;br /&gt;
						$new_data-&amp;gt;addClaim( $statement-&amp;gt;addReference( $reference ) );&lt;br /&gt;
						$summary[] = &amp;quot;add [[Property:P6375|address]]: $address&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
		 	} else {&lt;br /&gt;
				$new_address = null;&lt;br /&gt;
&lt;br /&gt;
				// import address from Wikidata&lt;br /&gt;
				foreach( $entity_data-&amp;gt;getBestClaimsInProperty( 'P6375' ) as $claim ) {&lt;br /&gt;
					$value = $claim-&amp;gt;getMainSnak()-&amp;gt;getDataValue()-&amp;gt;getValue();&lt;br /&gt;
					if( $value['language'] === 'it' ) {&lt;br /&gt;
						$new_address = $value['text'];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if( $new_address ) {&lt;br /&gt;
					$imports[] = &amp;quot;import address: $new_address&amp;quot;;&lt;br /&gt;
					update_poi( $poi, [&lt;br /&gt;
						new DBCol( POI::ADDRESS, $new_address, 's' ),&lt;br /&gt;
					] );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// reset for each POI&lt;br /&gt;
			$add_identifier = null;&lt;br /&gt;
&lt;br /&gt;
			// check if we already have a local identifier&lt;br /&gt;
			foreach( $entity_data-&amp;gt;getBestClaimsInProperty( WIKIDATA_PROPERTY ) as $claim ) {&lt;br /&gt;
&lt;br /&gt;
				$identifier_upstream = $claim-&amp;gt;getMainSnak()-&amp;gt;getDataValue()-&amp;gt;getValue();&lt;br /&gt;
&lt;br /&gt;
				$to =&lt;br /&gt;
					( new QueryPOIRedirect() )&lt;br /&gt;
						-&amp;gt;select( POIFull::fieldsForPermalink() )&lt;br /&gt;
						-&amp;gt;wherePOIRedirectFromID( $identifier_upstream )&lt;br /&gt;
						-&amp;gt;joinPOIRedirectTo()&lt;br /&gt;
						-&amp;gt;joinCategory()&lt;br /&gt;
						-&amp;gt;queryRow();&lt;br /&gt;
&lt;br /&gt;
				// redirect found?&lt;br /&gt;
				if( $to ) {&lt;br /&gt;
&lt;br /&gt;
					$claim-&amp;gt;setRankDeprecated();&lt;br /&gt;
&lt;br /&gt;
					// reason for deprecated rank: withdrawn identifier value&lt;br /&gt;
					$claim-&amp;gt;addQualifier( new SnakItem( 'P2241', 'Q21441764' ) );&lt;br /&gt;
&lt;br /&gt;
					// prepare for saving&lt;br /&gt;
					$new_data-&amp;gt;addClaim( $claim );&lt;br /&gt;
&lt;br /&gt;
					$summary[] = &amp;quot;deprecate [[Property:&amp;quot; . WIKIDATA_PROPERTY. &amp;quot;|AtlasFor ID]]: $identifier_upstream&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
&lt;br /&gt;
					// check if already present&lt;br /&gt;
					if( $identifier_upstream == $poi_ID ) {&lt;br /&gt;
						$add_identifier = false;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// check if it has sense to save the identifier&lt;br /&gt;
			if( $add_identifier !== false ) {&lt;br /&gt;
&lt;br /&gt;
				// if we have more changes&lt;br /&gt;
				if( $new_data-&amp;gt;getClaims() ) {&lt;br /&gt;
&lt;br /&gt;
					// this is not the only change, save the identifier&lt;br /&gt;
					$add_identifier = true;&lt;br /&gt;
&lt;br /&gt;
				} else {&lt;br /&gt;
&lt;br /&gt;
					// this is the only change&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					// check if it still has sense&lt;br /&gt;
					$poi_medias = $poi-&amp;gt;count_medias ?? 0;&lt;br /&gt;
					if( !$NO_JUST_ID &amp;amp;&amp;amp; $poi_medias &amp;gt; 2 ) {&lt;br /&gt;
						$add_identifier = true;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// add the AtlasFor identifier to Wikidata&lt;br /&gt;
			if( $add_identifier ) {&lt;br /&gt;
				$statement = new StatementExternalID( WIKIDATA_PROPERTY, (string) $poi_ID );&lt;br /&gt;
				$new_data-&amp;gt;addClaim( $statement );&lt;br /&gt;
				$summary[] = &amp;quot;add [[Property:&amp;quot; . WIKIDATA_PROPERTY. &amp;quot;|AtlasFor ID]]: $poi_ID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// show some imported informations&lt;br /&gt;
			if( $imports &amp;amp;&amp;amp; !$NO_IMPORT ) {&lt;br /&gt;
				echo &amp;quot;Import\n\t&amp;quot;;&lt;br /&gt;
				echo implode( &amp;quot;\n\t&amp;quot;, $imports );&lt;br /&gt;
				echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// have we any change to be saved?&lt;br /&gt;
			if( $summary ) {&lt;br /&gt;
&lt;br /&gt;
				// is this export mode?&lt;br /&gt;
				if( $EXPORT ) {&lt;br /&gt;
&lt;br /&gt;
					// edit summary&lt;br /&gt;
					$summary_raw = implode( &amp;quot;; &amp;quot;, $summary );&lt;br /&gt;
					// $summary_raw .= &amp;quot; from [[Q65769786|AtlasFor]] {$poi-&amp;gt;getPOIPermalinkShort()}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
					// show some info&lt;br /&gt;
					echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
					echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
					echo &amp;quot;POI {$poi-&amp;gt;getPOIPermalinkShort()}\n&amp;quot;;&lt;br /&gt;
					echo &amp;quot; &amp;quot; . $poi-&amp;gt;getPOIName() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
					echo &amp;quot; &amp;quot; . $poi-&amp;gt;get( Comune::NAME ) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
					echo &amp;quot; &amp;quot; . $poi-&amp;gt;get( POI::CAPTION ) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
					echo &amp;quot;WIKIDATA https://www.wikidata.org/wiki/{$entity-&amp;gt;id}\n&amp;quot;;&lt;br /&gt;
					echo &amp;quot; &amp;quot; . $entity_data-&amp;gt;getWhateverLabelValue(       $LANGUAGE_PREFERENCES ) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
					echo &amp;quot; &amp;quot; . $entity_data-&amp;gt;getWhateverDescriptionValue( $LANGUAGE_PREFERENCES ) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
					echo &amp;quot;SUMMARY:\n&amp;quot;;&lt;br /&gt;
					foreach( $summary as $summary_line ) {&lt;br /&gt;
						echo &amp;quot; $summary_line\n&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					// show something interesting&lt;br /&gt;
					// TODO: the DataValue are not specific, so the getPrintableWikitext() does not work&lt;br /&gt;
					// $new_data-&amp;gt;printChanges();&lt;br /&gt;
					//print_r( $new_data-&amp;gt;get() );&lt;br /&gt;
&lt;br /&gt;
					// user interaction&lt;br /&gt;
					$interaction = readline( &amp;quot;Save? [Y/n/r/d] (Yes/no/refresh/dropID from DB)&amp;quot; );&lt;br /&gt;
					$interaction = strtolower( $interaction );&lt;br /&gt;
					if( $interaction === 'r' ) {&lt;br /&gt;
&lt;br /&gt;
						$need_to_refresh_poi = true;&lt;br /&gt;
&lt;br /&gt;
					} elseif( $interaction == 'd' ) {&lt;br /&gt;
&lt;br /&gt;
						echo &amp;quot;Dropping Wikidata ID from our POI...\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
						// drop Wikidata ID&lt;br /&gt;
						( new QueryPOI() )&lt;br /&gt;
							-&amp;gt;wherePOIID( $poi_ID )&lt;br /&gt;
							-&amp;gt;update( [&lt;br /&gt;
								POI::WIKIDATA =&amp;gt; null,&lt;br /&gt;
							] );&lt;br /&gt;
&lt;br /&gt;
					} elseif( $interaction !== 'n' ) {&lt;br /&gt;
&lt;br /&gt;
						echo &amp;quot;Saving...\n&amp;quot;;&lt;br /&gt;
						try {&lt;br /&gt;
							$new_data-&amp;gt;editEntity( [&lt;br /&gt;
								'summary' =&amp;gt; $summary_raw,&lt;br /&gt;
								'bot'     =&amp;gt; 1,&lt;br /&gt;
							] );&lt;br /&gt;
&lt;br /&gt;
						} catch( \wb\API\ModificationFailedException $e ) {&lt;br /&gt;
							\cli\Log::warn( $e-&amp;gt;getMessage() );&lt;br /&gt;
							sleep( 2 );&lt;br /&gt;
						} catch( \mw\API\PermissionDeniedException $e ) {&lt;br /&gt;
							\cli\Log::error( $e-&amp;gt;getMessage() );&lt;br /&gt;
							sleep( 2 );&lt;br /&gt;
						}&lt;br /&gt;
&lt;br /&gt;
					} else {&lt;br /&gt;
&lt;br /&gt;
						echo &amp;quot;Skipped manually...\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
					}&lt;br /&gt;
				} else {&lt;br /&gt;
					echo &amp;quot;Skipped (not in export mode)...\n&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		} while( $need_to_refresh_poi );&lt;br /&gt;
&lt;br /&gt;
		// mark this POI as just seen&lt;br /&gt;
		( new QueryPOI() )&lt;br /&gt;
			-&amp;gt;wherePOIID( $poi_ID )&lt;br /&gt;
			-&amp;gt;update( [&lt;br /&gt;
			new DBCol( 'poi_lastwikidataimport', 'NOW()', '-' ),&lt;br /&gt;
		] );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A small shortcut to update a single POI&lt;br /&gt;
 *&lt;br /&gt;
 * @param POI $poi&lt;br /&gt;
 * @param array $data&lt;br /&gt;
 */&lt;br /&gt;
function update_poi( $poi, $data ) {&lt;br /&gt;
&lt;br /&gt;
	$data[] = new DBCol( POI::LASTEDIT_USER,       1,       'd' );&lt;br /&gt;
	$data[] = new DBCol( POI::LASTEDIT_DATE,       'NOW()', '-' );&lt;br /&gt;
&lt;br /&gt;
	( new QueryPOI() )&lt;br /&gt;
		-&amp;gt;wherePOI( $poi )&lt;br /&gt;
		-&amp;gt;update( $data );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given lot of results, split them in small chunks&lt;br /&gt;
 *&lt;br /&gt;
 * @param array $entries&lt;br /&gt;
 * @param int $n&lt;br /&gt;
 * @generator&lt;br /&gt;
 */&lt;br /&gt;
function chunk_generator( $entries, $n ) {&lt;br /&gt;
&lt;br /&gt;
	$chunk = [];&lt;br /&gt;
	foreach( $entries as $entry ) {&lt;br /&gt;
		$chunk[] = $entry;&lt;br /&gt;
&lt;br /&gt;
		if( count( $chunk ) &amp;gt; $n ) {&lt;br /&gt;
			yield $chunk;&lt;br /&gt;
			$chunk = [];&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if( $chunk ) {&lt;br /&gt;
		yield $chunk;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Check if a Claim contains a reference URL&lt;br /&gt;
 *&lt;br /&gt;
 * @param Claim $claim&lt;br /&gt;
 * @param string $url_part&lt;br /&gt;
 * @return Snak|false&lt;br /&gt;
 */&lt;br /&gt;
function find_claim_reference_url( $claim, $url_part ) {&lt;br /&gt;
&lt;br /&gt;
	$references = $claim-&amp;gt;getReferences();&lt;br /&gt;
	foreach( $references as $reference ) {&lt;br /&gt;
&lt;br /&gt;
		// reference URLs&lt;br /&gt;
		$snaks = $reference-&amp;gt;getSnaksInProperty( 'P854' );&lt;br /&gt;
		foreach( $snaks as $snak ) {&lt;br /&gt;
			$snak_datavalue = $snak-&amp;gt;getDataValue();&lt;br /&gt;
			$snak_value = $snak_datavalue-&amp;gt;getValue();&lt;br /&gt;
&lt;br /&gt;
			if( strpos( $snak_value, $url_part ) !== -1 ) {&lt;br /&gt;
				return $reference;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Compare POI's coordinates with some others&lt;br /&gt;
 *&lt;br /&gt;
 * @param POI $poi&lt;br /&gt;
 * @param float $lat2&lt;br /&gt;
 * @param float $lng2&lt;br /&gt;
 */&lt;br /&gt;
function has_poi_different_coordinates( $poi, $lat2, $lng2 ) {&lt;br /&gt;
	$lat1 = $poi-&amp;gt;getPOILatitude();&lt;br /&gt;
	$lng1 = $poi-&amp;gt;getPOILongitude();&lt;br /&gt;
	return are_different_coordinates( $lat1, $lng1, $lat2, $lng2 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Check if two coordinates are very very similar&lt;br /&gt;
 *&lt;br /&gt;
 * NOTE: The numbers are considered the same if their truncation is the same.&lt;br /&gt;
 *&lt;br /&gt;
 * @param float $lat1 Latitude (or longitude)&lt;br /&gt;
 * @param float $lat2 Latitude (or longitude)&lt;br /&gt;
 * @return boolean&lt;br /&gt;
 */&lt;br /&gt;
function are_same_coordinates( $lat1, $lat2 ) {&lt;br /&gt;
&lt;br /&gt;
	$minlen = min( strlen( $lat1 ), strlen( $lat2 ) );&lt;br /&gt;
&lt;br /&gt;
	$lat1 = substr( $lat1, 0, $minlen );&lt;br /&gt;
	$lat2 = substr( $lat2, 0, $minlen );&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;$lat1&amp;quot; === &amp;quot;$lat2&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Check if two pairs of coordinates are different&lt;br /&gt;
 *&lt;br /&gt;
 * @param float $lat1 Latitude  (1)&lt;br /&gt;
 * @param float $lng1 Longitude (1)&lt;br /&gt;
 * @param float $lat2 Latitude  (2)&lt;br /&gt;
 * @param float $lng2 Longitude (2)&lt;br /&gt;
 * @return boolean&lt;br /&gt;
 */&lt;br /&gt;
function are_different_coordinates( $lat1, $lng1, $lat2, $lng2 ) {&lt;br /&gt;
	return !are_same_coordinates( $lat1, $lat2 )&lt;br /&gt;
	    || !are_same_coordinates( $lng1, $lng2 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>System.bot</name></author>
	</entry>
</feed>