Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从边界坐标列创建mysql多边形列_Mysql_Sql_Geospatial - Fatal编程技术网

从边界坐标列创建mysql多边形列

从边界坐标列创建mysql多边形列,mysql,sql,geospatial,Mysql,Sql,Geospatial,我需要在mysql数据库(mysql 5.5.60-0ubuntu0.14.04.1)中创建一个列,该列具有从数据库中包含顶部、底部、左侧和右侧边界坐标的其他表创建的边界框 SELECT name.`field_site_sitelong_value` AS name, basetable.`uuid`, basetable.`nid`, msl.`field_elevation_average_value`, Polygon( coordinates.`field_geo_bound

我需要在mysql数据库(mysql 5.5.60-0ubuntu0.14.04.1)中创建一个列,该列具有从数据库中包含顶部、底部、左侧和右侧边界坐标的其他表创建的边界框

SELECT 
name.`field_site_sitelong_value` AS name,
basetable.`uuid`,
basetable.`nid`,
msl.`field_elevation_average_value`,
Polygon(
    coordinates.`field_geo_bounding_box_left` coordinates.`field_geo_bounding_box_bottom`,
    coordinates.`field_geo_bounding_box_right` coordinates.`field_geo_bounding_box_bottom`,
    coordinates.`field_geo_bounding_box_right` coordinates.`field_geo_bounding_box_top`,
    coordinates.`field_geo_bounding_box_left` coordinates.`field_geo_bounding_box_top`,
    coordinates.`field_geo_bounding_box_left` coordinates.`field_geo_bounding_box_bottom`
) AS geom

FROM `node` basetable
INNER JOIN `field_data_field_geo_bounding_box` coordinates
ON coordinates.`entity_id` = basetable.`nid`

INNER JOIN `field_data_field_site_sitelong` name
ON name.`entity_id` = basetable.`nid`

LEFT JOIN `field_data_field_elevation_average` msl
ON msl.`entity_id` = basetable.`nid`

WHERE basetable.`status` = 1 AND `field_geo_bounding_box_geo_type` = 'polygon'
我的查询看起来像这样,但由于语法错误而无法执行。当我创建一个点并只取两个坐标时,它工作得很好

SELECT 
name.`field_site_sitelong_value` AS name,
basetable.`uuid`,
basetable.`nid`,
msl.`field_elevation_average_value`,
Polygon(
    coordinates.`field_geo_bounding_box_left` coordinates.`field_geo_bounding_box_bottom`,
    coordinates.`field_geo_bounding_box_right` coordinates.`field_geo_bounding_box_bottom`,
    coordinates.`field_geo_bounding_box_right` coordinates.`field_geo_bounding_box_top`,
    coordinates.`field_geo_bounding_box_left` coordinates.`field_geo_bounding_box_top`,
    coordinates.`field_geo_bounding_box_left` coordinates.`field_geo_bounding_box_bottom`
) AS geom

FROM `node` basetable
INNER JOIN `field_data_field_geo_bounding_box` coordinates
ON coordinates.`entity_id` = basetable.`nid`

INNER JOIN `field_data_field_site_sitelong` name
ON name.`entity_id` = basetable.`nid`

LEFT JOIN `field_data_field_elevation_average` msl
ON msl.`entity_id` = basetable.`nid`

WHERE basetable.`status` = 1 AND `field_geo_bounding_box_geo_type` = 'polygon'

我认为,我向Polygon()提供列的方式存在问题。

多亏了非常有用的注释,我才能够提出一个有效的查询:

SELECT 
name.`field_site_sitelong_value` AS name,
basetable.`uuid`,
basetable.`nid`,
msl.`field_elevation_average_value`,

POLYFROMTEXT(concat(
        'Polygon((', 
            coordinates.`field_geo_bounding_box_left`   , ' ', coordinates.`field_geo_bounding_box_bottom`  , ', ',     
            coordinates.`field_geo_bounding_box_right`  , ' ', coordinates.`field_geo_bounding_box_bottom`  , ', ', 
            coordinates.`field_geo_bounding_box_right`  , ' ', coordinates.`field_geo_bounding_box_top`     , ', ',
            coordinates.`field_geo_bounding_box_left`   , ' ', coordinates.`field_geo_bounding_box_top`     , ', ', 
            coordinates.`field_geo_bounding_box_left`   , ' ', coordinates.`field_geo_bounding_box_bottom`  , 
        '))'
    ))
 AS GEOM

FROM `node` basetable
INNER JOIN `field_data_field_geo_bounding_box` coordinates
ON coordinates.`entity_id` = basetable.`nid`

INNER JOIN `field_data_field_site_sitelong` name
ON name.`entity_id` = basetable.`nid`

LEFT JOIN `field_data_field_elevation_average` msl
ON msl.`entity_id` = basetable.`nid`

WHERE basetable.`status` = 1 
  AND `field_geo_bounding_box_geo_type` = 'polygon'
POLYFROMTEXT
函数将完整的多边形字符串从
concat
函数的结果转换为实际的多边形空间数据类型。如果省略
POLYFROMTEXT
,将获得每个多边形的可读性


请记住,在为多边形
(多边形((左下、右下、右上、左上、左下))构造WKT时,点的顺序很重要。
,而且第一个点和最后一个点必须相同,以便多边形闭合。

尝试在多边形
多边形(…)内添加另一组括号
正如docs Polygon(…)中所述,不幸的是,它无法工作,因为它只会导致“您的SQL语法有错误”;我看到的每个关于Polygon的引用都首先将其定义为字符串。也许这就是问题所在。。。只是想检查一下:
GeometryType(concat((”,coordinates.field\u geo\u bounding\u box\u left…)
明白了吗?你在concat上犯了一个错误…我会添加一个,然后你做其余的:
GeometryType(concat('Polygon…)((',coordinates.field\u geo\u bounding\u box\u left',coordinates.field\u geo\u bounding\u box\u bottom',,,,,…)
很高兴知道这有点有效…现在让我们等到有多边形经验的人能够对它有所了解,除了查询部分之外,我不知道它是如何工作的:)