mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-26 11:08:13 +00:00
Merge branch 'master' of github.com:twain47/Nominatim
This commit is contained in:
25
lib/lib.php
25
lib/lib.php
@@ -1,5 +1,30 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
function failInternalError($sError, $sSQL = false, $vDumpVar = false)
|
||||||
|
{
|
||||||
|
header('HTTP/1.0 500 Internal Server Error');
|
||||||
|
header('Content-type: text/html; charset=utf-8');
|
||||||
|
echo "<html><body><h1>Internal Server Error</h1>";
|
||||||
|
echo '<p>Nominatim has encountered an internal error while processing your request. This is most likely because of a bug in the software.</p>';
|
||||||
|
echo "<p><b>Details:</b> ".$sError,"</p>";
|
||||||
|
echo '<p>Feel free to report the bug in the <a href="http://trac.openstreetmap.org">OSM bug database</a>. Please include the error message above an the URL you used.</p>';
|
||||||
|
if (CONST_Debug)
|
||||||
|
{
|
||||||
|
echo "<hr><h2>Debugging Information</h2><br>";
|
||||||
|
if ($sSQL) {
|
||||||
|
echo "<h3>SQL query</h3><code>".$sSQL."</code>";
|
||||||
|
}
|
||||||
|
if ($vDumpVar) {
|
||||||
|
echo "<h3>Result</h3> <code>";
|
||||||
|
var_dump($vDumpVar);
|
||||||
|
echo "</code>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo "\n</body></html>\n";
|
||||||
|
exit;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
function fail($sError, $sUserError = false)
|
function fail($sError, $sUserError = false)
|
||||||
{
|
{
|
||||||
if (!$sUserError) $sUserError = $sError;
|
if (!$sUserError) $sUserError = $sError;
|
||||||
|
|||||||
51
settings/phrase_settings.php
Normal file
51
settings/phrase_settings.php
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
# These settings control the import of special phrases from the wiki.
|
||||||
|
|
||||||
|
# Languages to download the special phrases for.
|
||||||
|
$aLanguageIn = array(
|
||||||
|
'af',
|
||||||
|
'ar',
|
||||||
|
'br',
|
||||||
|
'ca',
|
||||||
|
'cs',
|
||||||
|
'de',
|
||||||
|
'en',
|
||||||
|
'es',
|
||||||
|
'et',
|
||||||
|
'eu',
|
||||||
|
'fa',
|
||||||
|
'fi',
|
||||||
|
'fr',
|
||||||
|
'gl',
|
||||||
|
'hr',
|
||||||
|
'hu',
|
||||||
|
'ia',
|
||||||
|
'is',
|
||||||
|
'it',
|
||||||
|
'ja',
|
||||||
|
'mk',
|
||||||
|
'nl',
|
||||||
|
'no',
|
||||||
|
'pl',
|
||||||
|
'ps',
|
||||||
|
'pt',
|
||||||
|
'ru',
|
||||||
|
'sk',
|
||||||
|
'sv',
|
||||||
|
'uk',
|
||||||
|
'vi',
|
||||||
|
);
|
||||||
|
|
||||||
|
# class/type combinations to exclude
|
||||||
|
$aTagsBlacklist = array(
|
||||||
|
'boundary' => array('administrative'),
|
||||||
|
'place' => array('house', 'houses'),
|
||||||
|
);
|
||||||
|
# If a class is in the white list then all types will
|
||||||
|
# be ignored except the ones given in the list.
|
||||||
|
# Also use this list to exclude an entire class from
|
||||||
|
# special phrases.
|
||||||
|
$aTagsWhitelist = array(
|
||||||
|
'highway' => array('bus_stop', 'rest_area', 'raceway'),
|
||||||
|
'building' => array(),
|
||||||
|
);
|
||||||
@@ -1118,9 +1118,9 @@ BEGIN
|
|||||||
|
|
||||||
-- work around bug in postgis, this may have been fixed in 2.0.0 (see http://trac.osgeo.org/postgis/ticket/547)
|
-- work around bug in postgis, this may have been fixed in 2.0.0 (see http://trac.osgeo.org/postgis/ticket/547)
|
||||||
update placex set indexed_status = 2 where (ST_Contains(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry))
|
update placex set indexed_status = 2 where (ST_Contains(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry))
|
||||||
AND rank_search > NEW.rank_search and indexed_status = 0 and ST_geometrytype(placex.geometry) = 'ST_Point';
|
AND rank_search > NEW.rank_search and indexed_status = 0 and ST_geometrytype(placex.geometry) = 'ST_Point' and (rank_search < 28 or name is not null);
|
||||||
update placex set indexed_status = 2 where (ST_Contains(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry))
|
update placex set indexed_status = 2 where (ST_Contains(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry))
|
||||||
AND rank_search > NEW.rank_search and indexed_status = 0 and ST_geometrytype(placex.geometry) != 'ST_Point';
|
AND rank_search > NEW.rank_search and indexed_status = 0 and ST_geometrytype(placex.geometry) != 'ST_Point' and (rank_search < 28 or name is not null);
|
||||||
END IF;
|
END IF;
|
||||||
ELSE
|
ELSE
|
||||||
-- mark nearby items for re-indexing, where 'nearby' depends on the features rank_search and is a complete guess :(
|
-- mark nearby items for re-indexing, where 'nearby' depends on the features rank_search and is a complete guess :(
|
||||||
@@ -1145,7 +1145,7 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
IF diameter > 0 THEN
|
IF diameter > 0 THEN
|
||||||
-- RAISE WARNING 'placex point insert: % % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type,diameter;
|
-- RAISE WARNING 'placex point insert: % % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type,diameter;
|
||||||
update placex set indexed_status = 2 where indexed_status = 0 and rank_search > NEW.rank_search and ST_DWithin(placex.geometry, NEW.geometry, diameter);
|
update placex set indexed_status = 2 where indexed_status = 0 and rank_search > NEW.rank_search and ST_DWithin(placex.geometry, NEW.geometry, diameter) and (rank_search < 28 or name is not null);
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
END IF;
|
END IF;
|
||||||
@@ -1807,12 +1807,12 @@ BEGIN
|
|||||||
update placex set indexed_status = 2 where indexed_status = 0 and
|
update placex set indexed_status = 2 where indexed_status = 0 and
|
||||||
(ST_Contains(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry))
|
(ST_Contains(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry))
|
||||||
AND NOT (ST_Contains(existinggeometry, placex.geometry) OR ST_Intersects(existinggeometry, placex.geometry))
|
AND NOT (ST_Contains(existinggeometry, placex.geometry) OR ST_Intersects(existinggeometry, placex.geometry))
|
||||||
AND rank_search > existingplacex.rank_search;
|
AND rank_search > existingplacex.rank_search AND (rank_search < 28 or name is not null);
|
||||||
|
|
||||||
update placex set indexed_status = 2 where indexed_status = 0 and
|
update placex set indexed_status = 2 where indexed_status = 0 and
|
||||||
(ST_Contains(existinggeometry, placex.geometry) OR ST_Intersects(existinggeometry, placex.geometry))
|
(ST_Contains(existinggeometry, placex.geometry) OR ST_Intersects(existinggeometry, placex.geometry))
|
||||||
AND NOT (ST_Contains(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry))
|
AND NOT (ST_Contains(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry))
|
||||||
AND rank_search > existingplacex.rank_search;
|
AND rank_search > existingplacex.rank_search AND (rank_search < 28 or name is not null);
|
||||||
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
@@ -1832,7 +1832,8 @@ BEGIN
|
|||||||
|
|
||||||
IF st_area(NEW.geometry) < 0.5 THEN
|
IF st_area(NEW.geometry) < 0.5 THEN
|
||||||
UPDATE placex set indexed_status = 2 from place_addressline where address_place_id = existingplacex.place_id
|
UPDATE placex set indexed_status = 2 from place_addressline where address_place_id = existingplacex.place_id
|
||||||
and placex.place_id = place_addressline.place_id and indexed_status = 0;
|
and placex.place_id = place_addressline.place_id and indexed_status = 0
|
||||||
|
and (rank_search < 28 or name is not null);
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
END IF;
|
END IF;
|
||||||
@@ -2408,13 +2409,6 @@ END;
|
|||||||
$$
|
$$
|
||||||
LANGUAGE plpgsql;
|
LANGUAGE plpgsql;
|
||||||
|
|
||||||
CREATE AGGREGATE array_agg(INT[])
|
|
||||||
(
|
|
||||||
sfunc = array_cat,
|
|
||||||
stype = INT[],
|
|
||||||
initcond = '{}'
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION tigger_create_interpolation(linegeo GEOMETRY, in_startnumber INTEGER,
|
CREATE OR REPLACE FUNCTION tigger_create_interpolation(linegeo GEOMETRY, in_startnumber INTEGER,
|
||||||
in_endnumber INTEGER, interpolationtype TEXT,
|
in_endnumber INTEGER, interpolationtype TEXT,
|
||||||
in_street TEXT, in_isin TEXT, in_postcode TEXT) RETURNS INTEGER
|
in_street TEXT, in_isin TEXT, in_postcode TEXT) RETURNS INTEGER
|
||||||
|
|||||||
@@ -15,39 +15,8 @@
|
|||||||
);
|
);
|
||||||
getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
|
getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
|
||||||
|
|
||||||
$aLanguageIn = array(
|
include(CONST_BasePath.'/settings/phrase_settings.php');
|
||||||
'af',
|
|
||||||
'ar',
|
|
||||||
'br',
|
|
||||||
'ca',
|
|
||||||
'cs',
|
|
||||||
'de',
|
|
||||||
'en',
|
|
||||||
'es',
|
|
||||||
'et',
|
|
||||||
'eu',
|
|
||||||
'fa',
|
|
||||||
'fi',
|
|
||||||
'fr',
|
|
||||||
'gl',
|
|
||||||
'hr',
|
|
||||||
'hu',
|
|
||||||
'ia',
|
|
||||||
'is',
|
|
||||||
'it',
|
|
||||||
'ja',
|
|
||||||
'mk',
|
|
||||||
'nl',
|
|
||||||
'no',
|
|
||||||
'pl',
|
|
||||||
'ps',
|
|
||||||
'pt',
|
|
||||||
'ru',
|
|
||||||
'sk',
|
|
||||||
'sv',
|
|
||||||
'uk',
|
|
||||||
'vi',
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($aCMDResult['countries']) {
|
if ($aCMDResult['countries']) {
|
||||||
echo "select getorcreate_country(make_standard_name('uk'), 'gb');\n";
|
echo "select getorcreate_country(make_standard_name('uk'), 'gb');\n";
|
||||||
@@ -84,7 +53,17 @@
|
|||||||
preg_match('/^\\w+$/', $sType) < 1) {
|
preg_match('/^\\w+$/', $sType) < 1) {
|
||||||
trigger_error("Bad class/type for language $sLanguage: $sClass=$sType");
|
trigger_error("Bad class/type for language $sLanguage: $sClass=$sType");
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
# blacklisting: disallow certain class/type combinations
|
||||||
|
if (isset($aTagsBlacklist[$sClass]) && in_array($sType, $aTagsBlacklist[$sClass])) {
|
||||||
|
# fwrite(STDERR, "Blacklisted: ".$sClass."/".$sType."\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
# whitelisting: if class is in whitelist, allow only tags in the list
|
||||||
|
if (isset($aTagsWhitelist[$sClass]) && !in_array($sType, $aTagsWhitelist[$sClass])) {
|
||||||
|
# fwrite(STDERR, "Non-Whitelisted: ".$sClass."/".$sType."\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
$aPairs[$sClass.'|'.$sType] = array($sClass, $sType);
|
$aPairs[$sClass.'|'.$sType] = array($sClass, $sType);
|
||||||
|
|
||||||
switch(trim($aMatch[4]))
|
switch(trim($aMatch[4]))
|
||||||
|
|||||||
@@ -48,11 +48,11 @@
|
|||||||
$sSQL .= " ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') as isarea,ST_GeometryType(geometry) as geotype, ST_Y(ST_Centroid(geometry)) as lat,ST_X(ST_Centroid(geometry)) as lon ";
|
$sSQL .= " ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') as isarea,ST_GeometryType(geometry) as geotype, ST_Y(ST_Centroid(geometry)) as lat,ST_X(ST_Centroid(geometry)) as lon ";
|
||||||
$sSQL .= " from placex where place_id = $iPlaceID";
|
$sSQL .= " from placex where place_id = $iPlaceID";
|
||||||
$aPointDetails = $oDB->getRow($sSQL);
|
$aPointDetails = $oDB->getRow($sSQL);
|
||||||
IF (PEAR::IsError($aPointDetails))
|
if (PEAR::IsError($aPointDetails))
|
||||||
{
|
{
|
||||||
var_dump($aPointDetails);
|
failInternalError("Could not get details of place object.", $sSQL, $aPointDetails);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$aPointDetails['localname'] = $aPointDetails['localname']?$aPointDetails['localname']:$aPointDetails['housenumber'];
|
$aPointDetails['localname'] = $aPointDetails['localname']?$aPointDetails['localname']:$aPointDetails['housenumber'];
|
||||||
$fLon = $aPointDetails['lon'];
|
$fLon = $aPointDetails['lon'];
|
||||||
$fLat = $aPointDetails['lat'];
|
$fLat = $aPointDetails['lat'];
|
||||||
@@ -71,14 +71,13 @@
|
|||||||
|
|
||||||
// Get the bounding box and outline polygon
|
// Get the bounding box and outline polygon
|
||||||
$sSQL = "select ST_AsText(geometry) as outlinestring,";
|
$sSQL = "select ST_AsText(geometry) as outlinestring,";
|
||||||
$sSQL .= "ST_Y(ST_PointN(ExteriorRing(ST_Box2D(geometry)),4)) as minlat,ST_Y(ST_PointN(ExteriorRing(ST_Box2D(geometry)),2)) as maxlat,";
|
$sSQL .= "ST_YMin(geometry) as minlat,ST_YMax(geometry) as maxlat,";
|
||||||
$sSQL .= "ST_X(ST_PointN(ExteriorRing(ST_Box2D(geometry)),1)) as minlon,ST_X(ST_PointN(ExteriorRing(ST_Box2D(geometry)),3)) as maxlon";
|
$sSQL .= "ST_XMin(geometry) as minlon,ST_XMax(geometry) as maxlon";
|
||||||
$sSQL .= " from placex where place_id = $iPlaceID";
|
$sSQL .= " from placex where place_id = $iPlaceID";
|
||||||
$aPointPolygon = $oDB->getRow($sSQL);
|
$aPointPolygon = $oDB->getRow($sSQL);
|
||||||
IF (PEAR::IsError($aPointPolygon))
|
IF (PEAR::IsError($aPointPolygon))
|
||||||
{
|
{
|
||||||
var_dump($aPointPolygon);
|
failInternalError("Could not get bounding box of place object.", $sSQL, $aPointPolygon);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
if (preg_match('#POLYGON\\(\\(([- 0-9.,]+)#',$aPointPolygon['outlinestring'],$aMatch))
|
if (preg_match('#POLYGON\\(\\(([- 0-9.,]+)#',$aPointPolygon['outlinestring'],$aMatch))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -105,8 +105,7 @@
|
|||||||
$iPlaceID = $aPlace['place_id'];
|
$iPlaceID = $aPlace['place_id'];
|
||||||
if (PEAR::IsError($iPlaceID))
|
if (PEAR::IsError($iPlaceID))
|
||||||
{
|
{
|
||||||
var_Dump($sSQL, $iPlaceID);
|
failInternalError("Could not determine closest place.", $sSQL, $iPlaceID);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,8 +117,7 @@
|
|||||||
$iPlaceID = $oDB->getOne($sSQL);
|
$iPlaceID = $oDB->getOne($sSQL);
|
||||||
if (PEAR::IsError($iPlaceID))
|
if (PEAR::IsError($iPlaceID))
|
||||||
{
|
{
|
||||||
var_Dump($sSQL, $iPlaceID);
|
failInternalError("Could not get parent for place.", $sSQL, $iPlaceID);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($iPlaceID && $aPlace['place_id'] && $iMaxRank < 28)
|
if ($iPlaceID && $aPlace['place_id'] && $iMaxRank < 28)
|
||||||
@@ -129,8 +127,7 @@
|
|||||||
$iPlaceID = $oDB->getOne($sSQL);
|
$iPlaceID = $oDB->getOne($sSQL);
|
||||||
if (PEAR::IsError($iPlaceID))
|
if (PEAR::IsError($iPlaceID))
|
||||||
{
|
{
|
||||||
var_Dump($sSQL, $iPlaceID);
|
failInternalError("Could not get larger parent for place.", $sSQL, $iPlaceID);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!$iPlaceID)
|
if (!$iPlaceID)
|
||||||
|
|||||||
@@ -163,8 +163,7 @@
|
|||||||
$sViewboxSmallSQL = $oDB->getOne($sSQL);
|
$sViewboxSmallSQL = $oDB->getOne($sSQL);
|
||||||
if (PEAR::isError($sViewboxSmallSQL))
|
if (PEAR::isError($sViewboxSmallSQL))
|
||||||
{
|
{
|
||||||
var_dump($sViewboxSmallSQL);
|
failInternalError("Could not get small viewbox.", $sSQL, $sViewboxSmallSQL);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
$sViewboxSmallSQL = "'".$sViewboxSmallSQL."'::geometry";
|
$sViewboxSmallSQL = "'".$sViewboxSmallSQL."'::geometry";
|
||||||
|
|
||||||
@@ -172,8 +171,7 @@
|
|||||||
$sViewboxLargeSQL = $oDB->getOne($sSQL);
|
$sViewboxLargeSQL = $oDB->getOne($sSQL);
|
||||||
if (PEAR::isError($sViewboxLargeSQL))
|
if (PEAR::isError($sViewboxLargeSQL))
|
||||||
{
|
{
|
||||||
var_dump($sViewboxLargeSQL);
|
failInternalError("Could not get large viewbox.", $sSQL, $sViewboxLargeSQL);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
$sViewboxLargeSQL = "'".$sViewboxLargeSQL."'::geometry";
|
$sViewboxLargeSQL = "'".$sViewboxLargeSQL."'::geometry";
|
||||||
}
|
}
|
||||||
@@ -325,8 +323,7 @@
|
|||||||
$aDatabaseWords = array();
|
$aDatabaseWords = array();
|
||||||
if (PEAR::IsError($aDatabaseWords))
|
if (PEAR::IsError($aDatabaseWords))
|
||||||
{
|
{
|
||||||
var_dump($sSQL, $aDatabaseWords);
|
failInternalError("Could not get word tokens.", $sSQL, $aDatabaseWords);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
$aPossibleMainWordIDs = array();
|
$aPossibleMainWordIDs = array();
|
||||||
foreach($aDatabaseWords as $aToken)
|
foreach($aDatabaseWords as $aToken)
|
||||||
@@ -796,8 +793,7 @@
|
|||||||
$aViewBoxPlaceIDs = $oDB->getAll($sSQL);
|
$aViewBoxPlaceIDs = $oDB->getAll($sSQL);
|
||||||
if (PEAR::IsError($aViewBoxPlaceIDs))
|
if (PEAR::IsError($aViewBoxPlaceIDs))
|
||||||
{
|
{
|
||||||
var_dump($sSQL, $aViewBoxPlaceIDs);
|
failInternalError("Could not get places for search terms.", $sSQL, $aViewBoxPlaceIDs);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
//var_dump($aViewBoxPlaceIDs);
|
//var_dump($aViewBoxPlaceIDs);
|
||||||
// Did we have an viewbox matches?
|
// Did we have an viewbox matches?
|
||||||
@@ -978,8 +974,7 @@
|
|||||||
|
|
||||||
if (PEAR::IsError($aPlaceIDs))
|
if (PEAR::IsError($aPlaceIDs))
|
||||||
{
|
{
|
||||||
var_dump($sSQL, $aPlaceIDs);
|
failInternalError("Could not get place IDs from tokens." ,$sSQL, $aPlaceIDs);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CONST_Debug) var_Dump($aPlaceIDs);
|
if (CONST_Debug) var_Dump($aPlaceIDs);
|
||||||
@@ -1055,8 +1050,7 @@
|
|||||||
|
|
||||||
if (PEAR::IsError($aSearchResults))
|
if (PEAR::IsError($aSearchResults))
|
||||||
{
|
{
|
||||||
var_dump($sSQL, $aSearchResults);
|
failInternalError("Could not get details for place.", $sSQL, $aSearchResults);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // end if ($sQuery)
|
} // end if ($sQuery)
|
||||||
@@ -1124,8 +1118,7 @@
|
|||||||
|
|
||||||
if (PEAR::IsError($aSearchResults))
|
if (PEAR::IsError($aSearchResults))
|
||||||
{
|
{
|
||||||
var_dump($sSQL, $aSearchResults);
|
failInternalError("Could not get details for place (near).", $sSQL, $aSearchResults);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1161,8 +1154,7 @@
|
|||||||
$aPointPolygon = $oDB->getRow($sSQL);
|
$aPointPolygon = $oDB->getRow($sSQL);
|
||||||
if (PEAR::IsError($aPointPolygon))
|
if (PEAR::IsError($aPointPolygon))
|
||||||
{
|
{
|
||||||
var_dump($sSQL, $aPointPolygon);
|
failInternalError("Could not get outline.", $sSQL, $aPointPolygon);
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
if ($aPointPolygon['place_id'])
|
if ($aPointPolygon['place_id'])
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user