2011-07-22 34 views
7

Tôi có một cột giá trị WKT POLYGON trong MySQL (tôi kế thừa db). Các polys được truy vấn và hiển thị trên Google Maps. Vì lớp phủ đa giác của Google Maps yêu cầu một mảng điểm, người dùng trước đã chuyển đổi các giá trị WKT để phối hợp các cặp và lưu trữ chúng trong một cột khác. Điều này thực sự hoạt động khá tốt, nhưng không đủ tốt.chuyển đổi WKT polys trong MySQL sang Google Maps polys

Đối với một, chuyển đổi đôi khi bị lỗi và đối với hai, tôi đang tìm cách để thực hiện điều này nhanh hơn.

Re. vấn đề đầu tiên, tôi phải thực hiện lại điều này, và đang tìm kiếm một bộ chuyển đổi sẽ chuyển đổi một WKT poly thành một chuỗi tọa độ. Tôi nghĩ rằng tôi có thể sử dụng điều này để viết một thủ tục lưu trữ truy vấn cột WKT và nhổ ra một chuỗi văn bản JSON có thể dễ dàng chuyển đổi sang Google Maps hoặc thậm chí tiền xử lý tất cả các WKT polys và lưu trữ chúng dưới dạng văn bản như nó đã được thực hiện, nhưng lần này với các giá trị chính xác.

Vì vậy, tôi đang thực sự tìm kiếm một chức năng để chuyển đổi WKT đến một chuỗi các tọa độ điểm cấu thành của nó, kinda như vậy

SELECT AsStringOfCoords(WKT_Column) FROM table WHERE condition 

nơi AsStringOfCoords() sẽ là chức năng tùy chỉnh của tôi.

+0

Bạn có thể hiển thị mẫu cột WKT POLYGON của mình không? Một số văn bản để thử một số chuyển đổi –

+0

... và có thể là quy trình được lưu trữ thực tế để chuyển đổi, có thể có lỗi. –

+0

Tôi cũng đã phải đọc các đa giác ra khỏi mysql vào gmaps - giải pháp của tôi là truy vấn đa giác dưới dạng văn bản và sau đó lọc ra các nhóm điều phối bằng regex (vòng tròn bên trong ...). Vì vậy, truy vấn của tôi giống như "SELECT poly_column as text ...". – Tarsis

Trả lời

0

Tôi đã viết một chương trình C++ nhỏ để thực hiện đa giác WKT của MySQL thành đa giác KML. điều này hoạt động như sau:

  • Đọc thông tin từ cơ sở dữ liệu
  • tạo một tài liệu kml
  • Sắp xếp lại các thông tin và in nó ra đến tập tin.
  • Bạn có thể gọi kml mới để googlemaps và nó cho thấy khá tốt đẹp.

Mã nguồn là ở đây ...

#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; 
} 

Tôi hy vọng điều này có thể giúp bạn. Là dễ dàng để dịch này để lưu trữ MySQL proc, hoặc sử dụng nó bên trong PHP hoặc ngôn ngữ khác ... Tôi cũng có một số php/javascript script để làm những điều tương tự với điểm.

Các vấn đề liên quan