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

y3bcpkx1  于 2021-06-12  发布在  Mysql
关注(0)|答案(1)|浏览(416)

我需要在mysql数据库(mysql 5.5.60-0ubuntu0.14.04.1)中创建一个列,其中包含从数据库中包含顶部、底部、左侧和右侧边界坐标的其他表创建的边界框。
我的查询看起来像这样,但由于语法错误而无法执行。不过,当我创建一个点,只取两个坐标时,效果很好。

  1. SELECT
  2. name.`field_site_sitelong_value` AS name,
  3. basetable.`uuid`,
  4. basetable.`nid`,
  5. msl.`field_elevation_average_value`,
  6. Polygon(
  7. coordinates.`field_geo_bounding_box_left` coordinates.`field_geo_bounding_box_bottom`,
  8. coordinates.`field_geo_bounding_box_right` coordinates.`field_geo_bounding_box_bottom`,
  9. coordinates.`field_geo_bounding_box_right` coordinates.`field_geo_bounding_box_top`,
  10. coordinates.`field_geo_bounding_box_left` coordinates.`field_geo_bounding_box_top`,
  11. coordinates.`field_geo_bounding_box_left` coordinates.`field_geo_bounding_box_bottom`
  12. ) AS geom
  13. FROM `node` basetable
  14. INNER JOIN `field_data_field_geo_bounding_box` coordinates
  15. ON coordinates.`entity_id` = basetable.`nid`
  16. INNER JOIN `field_data_field_site_sitelong` name
  17. ON name.`entity_id` = basetable.`nid`
  18. LEFT JOIN `field_data_field_elevation_average` msl
  19. ON msl.`entity_id` = basetable.`nid`
  20. WHERE basetable.`status` = 1 AND `field_geo_bounding_box_geo_type` = 'polygon'

我假设这个问题在某种程度上与我为polygon()提供列的方式有关。

vptzau2j

vptzau2j1#

多亏了@jorge campos非常有帮助的评论,我才想出了一个可行的问题:

  1. SELECT
  2. name.`field_site_sitelong_value` AS name,
  3. basetable.`uuid`,
  4. basetable.`nid`,
  5. msl.`field_elevation_average_value`,
  6. POLYFROMTEXT(concat(
  7. 'Polygon((',
  8. coordinates.`field_geo_bounding_box_left` , ' ', coordinates.`field_geo_bounding_box_bottom` , ', ',
  9. coordinates.`field_geo_bounding_box_right` , ' ', coordinates.`field_geo_bounding_box_bottom` , ', ',
  10. coordinates.`field_geo_bounding_box_right` , ' ', coordinates.`field_geo_bounding_box_top` , ', ',
  11. coordinates.`field_geo_bounding_box_left` , ' ', coordinates.`field_geo_bounding_box_top` , ', ',
  12. coordinates.`field_geo_bounding_box_left` , ' ', coordinates.`field_geo_bounding_box_bottom` ,
  13. '))'
  14. ))
  15. AS GEOM
  16. FROM `node` basetable
  17. INNER JOIN `field_data_field_geo_bounding_box` coordinates
  18. ON coordinates.`entity_id` = basetable.`nid`
  19. INNER JOIN `field_data_field_site_sitelong` name
  20. ON name.`entity_id` = basetable.`nid`
  21. LEFT JOIN `field_data_field_elevation_average` msl
  22. ON msl.`entity_id` = basetable.`nid`
  23. WHERE basetable.`status` = 1
  24. AND `field_geo_bounding_box_geo_type` = 'polygon'

这个 POLYFROMTEXT 函数从 concat 函数转换为实际的多边形空间数据类型。如果你忽略了 POLYFROMTEXT 您将获得每个多边形的可读wkt。
记住,在为多边形构造wkt时,点的顺序很重要 (POLYGON((left bottom,right bottom,right top,left top,left bottom))) ,并且第一个点和最后一个点必须相同,以便多边形闭合。

展开查看全部

相关问题