Я выбираю сайты, которые входят в многоугольник, используя следующий собственный запрос SQL.
И это дает мне количество идентификаторов сайта.
SELECT s.siteID from Sites s where st_contains( (SELECT polygon from Region where RegionId=9 ) , point( s.latitude,s.longitude ) )=1 ;
Но когда я делаю то же самое с доктриной, это дает мне пустой массив.
$queryBuilder = $this->createQueryBuilder('s');
$queryBuilder
->where('ST_Contains( :polygon, point(s.latitude, s.longitude) ) = 1')
->setParameter('polygon', $region->getPolygon());
print_r($queryBuilder->getQuery()->getResult());
$ region-> getPolygon () Дает мне следующий вывод
CrEOF\Spatial\PHP\Types\Geometry\Polygon Object
(
[rings:protected] => Array
(
[0] => Array
(
[0] => Array
(
[0] => 48.806863
[1] => 17.050781
)
[1] => Array
(
[0] => 47.813155
[1] => 17.116699
)
[2] => Array
(
[0] => 47.457809
[1] => 16.765137
)
[3] => Array
(
[0] => 46.920255
[1] => 16.237793
)
[4] => Array
(
[0] => 46.664517
[1] => 15.666504
)
[5] => Array
(
[0] => 46.589069
[1] => 14.47998
)
[6] => Array
(
[0] => 47.249407
[1] => 14.282227
)
[7] => Array
(
[0] => 47.635784
[1] => 14.677734
)
[8] => Array
(
[0] => 48.210032
[1] => 15.578613
)
[9] => Array
(
[0] => 48.618385
[1] => 15.864258
)
[10] => Array
(
[0] => 48.748945
[1] => 16.721191
)
[11] => Array
(
[0] => 48.806863
[1] => 17.050781
)
)
)
[srid:protected] =>
)
Потратив на это еще 1 день, я нашел проблему. setParameter()
имеет третий параметр, мы можем упомянуть тип данных параметра.
->setParameter('polygon', $region->getPolygon());
Вот :polygon
тип данных был строкой, а не полигоном.
Вы можете сделать это следующим образом.
$queryBuilder = $this->createQueryBuilder('s');
$queryBuilder
->where('ST_Contains( :polygon, point(s.latitude, s.longitude) ) = 1')
->setParameter('polygon', $region->getPolygon(), 'polygon');
print_r($queryBuilder->getQuery()->getResult());
Если вы не знаете, какой именно ключ для типа данных «полигон».
Тогда используйте print_r(Type::getTypesMap());
чтобы получить список всех добавленных типов данных.
В моем случае это было
Array
(
[array] => Doctrine\DBAL\Types\ArrayType
[simple_array] => Doctrine\DBAL\Types\SimpleArrayType
[json_array] => Doctrine\DBAL\Types\JsonArrayType
[object] => Doctrine\DBAL\Types\ObjectType
[boolean] => Doctrine\DBAL\Types\BooleanType
[integer] => Doctrine\DBAL\Types\IntegerType
[smallint] => Doctrine\DBAL\Types\SmallIntType
[bigint] => Doctrine\DBAL\Types\BigIntType
[string] => Doctrine\DBAL\Types\StringType
[text] => Doctrine\DBAL\Types\TextType
[datetime] => Doctrine\DBAL\Types\DateTimeType
[datetimetz] => Doctrine\DBAL\Types\DateTimeTzType
[date] => Doctrine\DBAL\Types\DateType
[time] => Doctrine\DBAL\Types\TimeType
[decimal] => Doctrine\DBAL\Types\DecimalType
[float] => Doctrine\DBAL\Types\FloatType
[binary] => Doctrine\DBAL\Types\BinaryType
[blob] => Doctrine\DBAL\Types\BlobType
[guid] => Doctrine\DBAL\Types\GuidType
[geometry] => CrEOF\Spatial\DBAL\Types\GeometryType
[point] => CrEOF\Spatial\DBAL\Types\Geometry\PointType
[polygon] => CrEOF\Spatial\DBAL\Types\Geometry\PolygonType
[linestring] => CrEOF\Spatial\DBAL\Types\Geometry\LineStringType
)
Других решений пока нет …