<?php
class
validationMap{
private
static
$coordArray
;
private
static
$vertx
= [];
private
static
$verty
= [];
public
static
function
setCoordArray(
array
$coordArray
)
{
self::
$coordArray
=
$coordArray
;
}
public
static
function
isCityCenter(
array
$coordArray
){
if
(!self::vaildatePoint(
$coordArray
)){
return
false;
}
return
self::pnpoly(
count
(self::
$coordArray
),
$coordArray
['lng'],
$coordArray
['lat']);
}
private
static
function
pnpoly(
$nvert
,
$testx
,
$testy
)
{
$c
= false;
for
(
$i
= 0,
$j
=
$nvert
-1;
$i
<
$nvert
;
$j
=
$i
++) {
if
( ( (self::
$verty
[
$i
]>
$testy
) != (self::
$verty
[
$j
]>
$testy
) ) && (
$testx
< (self::
$vertx
[
$j
]-self::
$vertx
[
$i
]) * (
$testy
-self::
$verty
[
$i
]) / (self::
$verty
[
$j
]-self::
$verty
[
$i
]) + self::
$vertx
[
$i
]) )
$c
= !
$c
;
}
return
$c
;
}
private
static
function
vaildatePoint(
array
$pointArray
){
$maxY
=
$maxX
= 0;
$minY
=
$minX
= 9999;
foreach
(self::
$coordArray
as
$item
){
if
(
$item
['lng']>
$maxX
)
$maxX
=
$item
['lng'];
if
(
$item
['lng'] <
$minX
)
$minX
=
$item
['lng'];
if
(
$item
['lat']>
$maxY
)
$maxY
=
$item
['lat'];
if
(
$item
['lat'] <
$minY
)
$minY
=
$item
['lat'];
self::
$vertx
[] =
$item
['lng'];
self::
$verty
[] =
$item
['lat'];
}
if
(
$pointArray
['lng'] <
$minX
||
$pointArray
['lng'] >
$maxX
||
$pointArray
['lat'] <
$minY
||
$pointArray
['lat'] >
$maxY
) {
return
false;
}
return
true;
}
}
$map
= [
[
"lng"
=> 121.488286,
"lat"
=> 31.420147],
[
"lng"
=> 121.702154,
"lat"
=> 31.294828],
[
"lng"
=> 121.780918,
"lat"
=> 31.141157],
[
"lng"
=> 121.782068,
"lat"
=> 30.941157],
[
"lng"
=> 121.492885,
"lat"
=> 30.909931],
[
"lng"
=> 121.22325,
"lat"
=> 30.890099],
[
"lng"
=> 121.161482,
"lat"
=> 31.015526],
[
"lng"
=> 121.076395,
"lat"
=> 31.226239],
[
"lng"
=> 121.189873,
"lat"
=> 31.339688],
[
"lng"
=> 121.459509,
"lat"
=> 31.41368],
];
$array
= [
"lat"
=>31.218681,
"lng"
=>121.08604];
validationMap::setCoordArray(
$map
);
var_dump(validationMap::isCityCenter(
$array
));