конвертировать полигоны WKT в MySQL в полигоны Google Maps

У меня есть столбец значений WKT POLYGON в MySQL (я унаследовал базу данных). Полигоны запрашиваются и отображаются на Google Maps. Поскольку для наложения полигонов Google Maps требуется массив точек, предыдущий пользователь преобразовал значения WKT в пары координат и сохранил их в другом столбце. Это на самом деле работает довольно хорошо, но недостаточно хорошо.

Во-первых, преобразование иногда было ошибочным, а во-вторых, я ищу способы сделать это быстрее.

Ре. первая проблема, мне нужно повторно реализовать это, и я ищу конвертер, который преобразует полигон WKT в строку координат. Я думаю, что мог бы использовать это либо для написания хранимой процедуры, которая будет запрашивать столбец WKT и выдавать строку текста JSON, которая может быть легко преобразована в полигоны Google Maps, либо даже для предварительной обработки всех полигонов WKT и сохранения их как текст, например это уже сделано, но на этот раз с правильными значениями.

Итак, я действительно ищу функцию для преобразования WKT в строку координат составляющих ее точек, вроде так

SELECT AsStringOfCoords(WKT_Column) FROM table WHERE condition

где AsStringOfCoords() будет моей пользовательской функцией.


person punkish    schedule 22.07.2011    source источник
comment
Можете ли вы показать образец вашей колонки WKT POLYGON? Некоторый текст, чтобы попробовать конвертацию   -  person Ivan Cachicatari    schedule 12.05.2014
comment
... и может быть реальной хранимой процедурой для преобразования этого, может быть, в ней есть ошибка.   -  person Ivan Cachicatari    schedule 12.05.2014
comment
Мне также пришлось читать полигоны из mysql в gmaps - моим решением было запросить полигон как текст, а затем отфильтровать группы координат с помощью регулярного выражения (внутренние круги...). Итак, мой запрос похож на SELECT poly_column as text....   -  person Tarsis    schedule 23.07.2014


Ответы (1)


Я написал небольшую программу на C++ для преобразования полигонов MySQL WKT в полигоны 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, чтобы делать то же самое с точками.

person fareden    schedule 27.08.2014