mysql - 将 MySQL 中的 WKT 多边形转换为 Google map 多边形

标签 mysql google-maps wkt

我在 MySQL 中有一列 WKT POLYGON 值(我继承了数据库)。在 Google map 上查询和呈现多边形。由于谷歌地图多边形覆盖需要一个点数组,之前的用户将 WKT 值转换为坐标对并将它们存储在另一列中。这实际上工作得很好,但还不够好。

其一,转换偶尔会出错,其二,我正在寻找加快转换速度的方法。

回复。第一个问题,我必须重新实现它,并且正在寻找一个转换器,将 WKT 多边形转换为一串坐标。我想我可以用它来编写一个存储过程来查询 WKT 列并吐出一串可以很容易地转换为谷歌地图多边形的 JSON 文本,或者甚至预处理所有 WKT 多边形并将它们存储为文本它已经完成,但这次使用了正确的值。

所以,我真的在寻找一个函数来将 WKT 转换为其组成点坐标的字符串,有点像这样

SELECT AsStringOfCoords(WKT_Column) FROM table WHERE condition

其中 AsStringOfCoords() 是我的自定义函数。

最佳答案

我写了一个小的 C++ 程序来将 MySQL WKT 多边形转换为 KML 多边形。 这个东西的工作原理如下:

  • 从数据库中读取信息
  • 创建一个 kml 文档
  • 重新排列信息并将其打印到文件中。
  • 您可以将新的 kml 调用到 googlemaps,它显示得非常好。

源码在这里...

#include <iostream>
#include <string>
/*
* Database includes...
*/
#include <mysql_connection.h>
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>

#include "../iolib/IOCoreFuncs.h"
#include "../iolib/ioconfigurador.h"

using namespace std;
using namespace sql;
using namespace IOCore;

sql::Connection * conectaDB(string dbSvr, string dbUsr, string dbPwd, string dbNombre);

int main(int argc, char **argv) {
    string            qry, arproc;
    Connection         * dbCon;
    Statement        * stmt;
    IOConfigurador    * miConf;
    ResultSet        * rs;
    //Cargar configuración...
    if (argc == 3) {
        arproc = argv[2];
    } else {
        cout << "Using mode: sqltokml <polygon id> <file kml to export>\n";
        return 1;
    }

    dbCon = conectaDB("dbserver", "dbuser"), "dbpasswd", "dbname");
    stmt = dbCon->createStatement();
    qry = "SELECT name, astext(geoarea) from " + "table name" + " where id = '" + argv[1] + "';";
    rs = stmt->executeQuery(qry);
    if (rs->rowsCount() > 0) {
        string polnombre, polcoords;
        string salida;
        while (rs->next()) {
            ofstream sale;
            polnombre = rs->getString(1);
            polcoords = rs->getString(2);
            salida = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
            "<kml xmlns=\"http://www.opengis.net/kml/2.2\" xmlns:gx=\"http://www.google.com/kml/ext/2.2\" xmlns:kml=\"http://www.opengis.net/kml/2.2\" xmlns:atom=\"http://www.w3.org/2005/Atom\">\n"
            "<Document>\n"
            "<name>" + polnombre + ".kml</name>\n"
            "<Style id=\"sh_ylw-pushpin3\">\n"
                "<IconStyle>\n"
                    "<scale>1.3</scale>\n"
                    "<Icon>\n"
                        "<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>\n"
                    "</Icon>\n"
                    "<hotSpot x=\"20\" y=\"2\" xunits=\"pixels\" yunits=\"pixels\"/>\n"
                "</IconStyle>\n"
                "<LineStyle>\n"
                    "<color>467f5500</color>\n"
                    "<width>3</width>\n"
                "</LineStyle>\n"
                "<PolyStyle>\n"
                    "<color>46ff5555</color>\n"
                "</PolyStyle>\n"
            "</Style>\n"
            "<StyleMap id=\"msn_ylw-pushpin10\">\n"
                "<Pair>\n"
                    "<key>normal</key>\n"
                    "<styleUrl>#sn_ylw-pushpin30</styleUrl>\n"
                "</Pair>\n"
                "<Pair>\n"
                    "<key>highlight</key>\n"
                    "<styleUrl>#sh_ylw-pushpin3</styleUrl>\n"
                "</Pair>\n"
            "</StyleMap>\n"
            "<Style id=\"sn_ylw-pushpin30\">\n"
                "<IconStyle>\n"
                    "<scale>1.1</scale>\n"
                    "<Icon>\n"
                        "<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>\n"
                    "</Icon>\n"
                    "<hotSpot x=\"20\" y=\"2\" xunits=\"pixels\" yunits=\"pixels\"/>\n"
                "</IconStyle>\n"
                "<LineStyle>\n"
                    "<color>467f5500</color>\n"
                    "<width>3</width>\n"
                "</LineStyle>\n"
                "<PolyStyle>\n"
                    "<color>46ff5555</color>\n"
                "</PolyStyle>\n"
            "</Style>\n"
            "<Folder>\n"
                "<name>" + polnombre + "</name>\n"
                "<Placemark>\n"
                    "<name>" + polnombre + "</name>\n"
                    "<styleUrl>#msn_ylw-pushpin10</styleUrl>\n"
                    "<Polygon>\n"
                        "<tessellate>1</tessellate>\n"
                            "<outerBoundaryIs>\n"
                                "<LinearRing>\n"
                                    "<coordinates>\n";
            //Coordinates tranformation...
            polcoords = polcoords.substr(9, polcoords.size() - 11);
            vector< string > lascoords = split(polcoords, ",");
            for (unsigned i = 0; i < lascoords.size(); i++) {
                salida += lascoords[i].substr(0, lascoords[i].find(" ")) + ",";
                salida += lascoords[i].substr(lascoords[i].find(" ") + 1) + ",0 ";
            }
            salida +=                "\n</coordinates>\n" 
                                "</LinearRing>\n" 
                            "</outerBoundaryIs>\n" 
                        "</Polygon>\n" 
                    "</Placemark>\n" 
                "</Folder>\n" 
            "</Document>\n" 
            "</kml>";
            sale.open(arproc.c_str(), ios::out | ios::app);
            sale << salida ;
            sale.close();
        }
    }
    rs->close();
    stmt->close();
    dbCon->close();

}

sql::Connection * conectaDB(string dbSvr, string dbUsr, string dbPwd, string dbNombre)
{
    sql::Connection * retval;
    sql::Driver *ctrl;

    try {
        ctrl = get_driver_instance();
        retval = ctrl->connect(dbSvr, dbUsr, dbPwd);
        retval->setSchema(dbNombre);
    } catch (sql::SQLException &err) {
        cout<<"Errors... :( "<<err.what()<<"\ngoing out\n";
        retval = 0;
    }
    return retval;
}

希望对您有所帮助。很容易将其转换为 MySQL 存储过程,或在 PHP 或其他语言中使用它...我也有一些 php/javascript 脚本可以用点做同样的事情。

关于mysql - 将 MySQL 中的 WKT 多边形转换为 Google map 多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6796765/

相关文章:

mysql - 在 docker 容器中运行 mysql 服务器和 phpmyadmin

php - mysql中将行转换为列

javascript - 谷歌地图 react

PHP 验证 WKT 值

c# - 如何在 C# 中将复杂的 geo-json 转换为 wkt?

sql - SQL 中的空间查询未正确返回区域和点的交集

java - 使用 Java 对数据库中的数据进行排序

php - 如何在下拉 PHP MySQL 中获取选定值?

javascript - 我怎么知道 Lat,Lng 点是否有街景?

javascript - Angularjs ui-gmap-window 对象数据不呈现