我很难让这个doctrine2扩展正常工作。是的https://github.com/djlambert/doctrine2-spatial关于如何创建多边形的文档也不多。我已经把配置文件处理好了,但我正在努力创建实际的多边形。
array:564 [
0 => array:2 [
0 => -73.698313
1 => 45.546876
]
1 => array:2 [
0 => -73.69813
1 => 45.546916
]
2 => array:2 [
0 => -73.697656
1 => 45.546899
]
3 => array:2 [
0 => -73.697413
1 => 45.546899
]
$poly = new Polygon($array);
[CrEOFSpatialExceptionInvalidValueException]
Invalid Polygon Point value of type "double"
这就是我得到的实际错误。我试着创造分数,因为它显然不喜欢双打。
$p = new Point($coord);
$temp[] = $p;
$poly = new Polygon($temp);
[CrEOFSpatialExceptionInvalidValueException]
Invalid Polygon LineString value of type "CrEOFSpatialPHPTypesGeometryPoint"
在那之后,我想好了,让我们创建一个字符串对象并传递它
$line = new LineString($points);
$poly - new Polygon($line);
[SymfonyComponentDebugExceptionContextErrorException]
Catchable Fatal Error: Argument 1 passed to CrEOFSpatialPHPTypesAbstractPolygon::__construct() must be of the type array, object given, called in /Library/Web Server/Documents/mg/src/Momoa/ImmobilierBundle/Entity/geography/Quartier.php on line 131 and defined
我现在只是迷路了,我唯一想要的就是将多边形存储在数据库中,并调用空间函数,如CONTAINS
。你有什么建议或其他事情可以让这一切顺利进行吗。
在挖掘源代码后,我发现了这个验证函数,这似乎是的问题
case (is_array($point) && count($point) == 2 && is_numeric($point[0]) && is_numeric($point[1])):
return array_values($point);
break;
default:
throw InvalidValueException::invalidType($this, GeometryInterface::POINT, $point);
}
我理解这一点的方式是,扩展不接受具有十进制值的点?!啊,这是不是意味着我需要把坐标转换成2个整数?!
我会发布我找到的解决方案。基本上你需要创建你的多边形像这个
$line = new LineString($coords);
$poly = new Polygon(array($line));
//Or you can do it like this
$coords[0] = $coords;
$poly = new Polygon($coords);
//Following if you wanna use MBRContains or Contains
$dql = "SELECT p FROM polygon p WHERE MBRContains(p.geometry, GeomFromText('Point($lat $lng)'))=1";
//Dont use GeomFromText(:point), and then $point = new Point(array($lat,$lng));
祝大家好运,这个库很有用,但文档很糟糕!昨天花了一整天的时间!!
您可以通过在构造函数中传递数据来创建它。但问题是,你应该有一个有效的多边形数据:
$p = new Polygon([[[lat1, lng1], [lat2, lng2], [lat3, lng3], [lat1, lng2]]]);
确保在多边形中
- 有三个数组——线的数组,其中线是点的数组,每个点都是数组
- 路径是闭合的——最后一个点等于第一个点
MultiPolygon也是如此,但多了一个数组。F.e。[[[["32.699005219026645","-117.18222600929262"],["32.694563070816095","-117.18437177650453"],["32.697687043641835","-117.17149717323305"],["32.699005219026645","-117.18222600929262"]]]]