提交 fc26cc3973c7f6004971fc6adbf98bfb85ec88e0

作者 qingxiongf
1 个父辈 9b022cef

编辑服务

... ... @@ -50,6 +50,7 @@ DmpProject::~DmpProject()
50 50 }
51 51 }
52 52 mapLayers_.clear();
  53 + vectorLayers_.clear();
53 54 }
54 55
55 56 bool DmpProject::Read(const std::string &data)
... ... @@ -100,6 +101,7 @@ bool DmpProject::Read(const std::string &data)
100 101 std::string name = mapLayer->name();
101 102 boost::to_upper(name);
102 103 mapLayers_[name] = mapLayer;
  104 + vectorLayers_.push_back(mapLayer);
103 105 }
104 106 else
105 107 {
... ... @@ -138,18 +140,17 @@ bool DmpProject::WritePtree(boost::property_tree::ptree& ptDoc)
138 140 ptDmap.add_child("projectCrs",ptProjectCrs);
139 141
140 142 boost::property_tree::ptree ptProjectlayers;
141   -
142   - std::map<std::string, DmpMapLayer *>::iterator iter = mapLayers_.begin();
143   - for (; iter != mapLayers_.end(); ++iter)
  143 +
  144 + for(int i =0; i< vectorLayers_.size(); i++)
144 145 {
145   - DmpMapLayer *mapLayer = iter->second;
  146 + DmpMapLayer *mapLayer = vectorLayers_[i];
146 147 if (mapLayer && mapLayer->type() == DmpMapLayerType::VectorLayer)
147 148 {
148 149 boost::property_tree::ptree ptlayer;
149 150 ptlayer.add("<xmlattr>.type", "1");
150   - DmpVectorLayer *vectorMapLayer =(DmpVectorLayer *) mapLayer;
  151 + DmpVectorLayer *vectorMapLayer = (DmpVectorLayer *)mapLayer;
151 152 vectorMapLayer->writeXml(ptlayer);
152   - ptProjectlayers.add_child("maplayer",ptlayer);
  153 + ptProjectlayers.add_child("maplayer", ptlayer);
153 154 }
154 155 }
155 156
... ... @@ -189,6 +190,11 @@ std::map<std::string, DmpMapLayer*> DmpProject::mapLayers() const
189 190 return mapLayers_;
190 191 }
191 192
  193 +std::vector<DmpMapLayer*> DmpProject::vectorLayers() const
  194 +{
  195 + return vectorLayers_;
  196 +}
  197 +
192 198 DmpMapLayer *DmpProject::getLayer(const std::string &layerName) const
193 199 {
194 200 if(layerName.empty()){
... ...
... ... @@ -31,6 +31,7 @@ class CORE_EXPORT DmpProject
31 31 std::string WriteJson();
32 32 DmpCoordinateReferenceSystem crs() const;
33 33 std::map<std::string, DmpMapLayer*> mapLayers() const;
  34 + std::vector<DmpMapLayer*> vectorLayers() const;
34 35 DmpMapLayer* getLayer(const std::string &layerName) const;
35 36 DmpMapLayer* getLayer()const;
36 37 private:
... ... @@ -40,6 +41,8 @@ class CORE_EXPORT DmpProject
40 41 std::string file_;
41 42 DmpCoordinateReferenceSystem crs_;
42 43 std::map<std::string, DmpMapLayer*> mapLayers_;
  44 + std::vector<DmpMapLayer*> vectorLayers_;
  45 +
43 46 };
44 47
45 48 #endif //__dmpproject_h__
... ...
... ... @@ -62,9 +62,9 @@ bool DmpVectorLayer::readXml(const boost::property_tree::ptree &layerNode)
62 62 wkbType_ = DmpWkbTypes::Point;
63 63 else if (boost::iequals(wkbTypeString_, "MULTIPOINT"))
64 64 wkbType_ = DmpWkbTypes::MultiPoint;
65   - else if (boost::iequals(wkbTypeString_, "LINESTRING"))
  65 + else if (boost::iequals(wkbTypeString_, "LINESTRING") || boost::iequals(wkbTypeString_, "LINE") )
66 66 wkbType_ = DmpWkbTypes::LineString;
67   - else if (boost::iequals(wkbTypeString_, "MULTILINESTRING"))
  67 + else if (boost::iequals(wkbTypeString_, "MULTILINESTRING")|| boost::iequals(wkbTypeString_, "MULTILINE") )
68 68 wkbType_ = DmpWkbTypes::MultiLineString;
69 69 else if (boost::iequals(wkbTypeString_, "POLYGON"))
70 70 wkbType_ = DmpWkbTypes::Polygon;
... ... @@ -93,6 +93,13 @@ bool DmpVectorLayer::writeXml(boost::property_tree::ptree &layerNode)
93 93 layerNode.add("<xmlattr>.id", id_);
94 94 layerNode.add("<xmlattr>.name", name_);
95 95 layerNode.add("<xmlattr>.alias", title_);
  96 +
  97 + layerNode.add("<xmlattr>.schema",schema_ );
  98 + layerNode.add("<xmlattr>.geomfield",geom_ );
  99 + layerNode.add("<xmlattr>.featurecount",featurecount_ );
  100 + layerNode.add("<xmlattr>.geometry",wkbTypeString_ );
  101 + layerNode.add("<xmlattr>.srid",srid_ );
  102 +
96 103
97 104 boost::property_tree::ptree ptExtent;
98 105 ptExtent.add("xmin", extent_.xmin());
... ... @@ -162,11 +169,14 @@ bool DmpVectorLayer::writejson(std::string &json)
162 169 sprintf(buff_minscale, "%.0f", this->minScale());
163 170 }
164 171 //Display scale setting type="1" geometry="Point" alwaysShow="true" maxScale="0" maxScale="50000">
  172 +
165 173 char resultbuff[1000];
166 174 string json_source = this->source();
167 175 DmapCore_30::clsUtil::ToJSONString(json_source);
168 176 sprintf(resultbuff,
169   - R"({"workspace":"","type":"1","dbsource":"%s","data":"","schema":"%s","alias":"%s","name":"%s","id":"%s","filter":"%s","visible":"%s","tag":"","minScale":"%s","maxScale":"%s","geometry":"%s","alwaysShow":"%s")",
  177 + R"({"workspace":"","type":"1","dbsource":"%s","data":"","schema":"%s",
  178 +"alias":"%s","name":"%s","id":"%s","filter":"%s","visible":"%s","tag":"","minScale":"%s",
  179 +"maxScale":"%s","geometry":"%s","alwaysShow":"%s","geomfield":"%s","srid":"%s","featurecount":"%ld")",
170 180 json_source.c_str(),
171 181 this->schema().c_str(),
172 182 this->title().c_str(),
... ... @@ -176,7 +186,11 @@ bool DmpVectorLayer::writejson(std::string &json)
176 186 "true",
177 187 buff_minscale, buff_maxscale,
178 188 shapeTypeString.c_str(),
179   - alwaysShow ? "true" : "false");
  189 + alwaysShow ? "true" : "false",
  190 + geom_.c_str(),
  191 + srid_.c_str(),
  192 + featurecount_
  193 + );
180 194
181 195 json.append(resultbuff);
182 196 if (this->renderer_30_ != nullptr)
... ...
... ... @@ -23,10 +23,9 @@ namespace DmapCore_30
23 23 m_iN = 0;
24 24 }
25 25
26   -
27   - void DataCollection::InitDataCollection(PGresult *res, int shapeType, int imageWidth, int imageHeight,
28   - int subset, double r,
29   - double dScaleDenominator, double x_dis, double y_dis)
  26 + void DataCollection::InitDataCollection(PGresult *res, int shapeType, int imageWidth, int imageHeight,
  27 + int subset, double r,
  28 + double dScaleDenominator, double x_dis, double y_dis)
30 29 {
31 30 //InitDataCollection();
32 31 m_iN = 1;
... ... @@ -47,7 +46,7 @@ namespace DmapCore_30
47 46 {
48 47 m_subset = subset + 2;
49 48 }
50   -
  49 +
51 50 this->CollectFieldName(res);
52 51
53 52 switch (shapeType)
... ... @@ -56,6 +55,7 @@ namespace DmapCore_30
56 55 MallocForPoint(res);
57 56 break;
58 57 case GeometryType_MultiPoint:
  58 + MallocForPoint(res);
59 59 break;
60 60 case GeometryType_LineString:
61 61 MallocForLineStringGeom(res);
... ... @@ -70,14 +70,13 @@ namespace DmapCore_30
70 70 MallocForPolygonForGeom(res);
71 71 break;
72 72 default:
73   -
  73 +
74 74 break;
75 75 }
76 76 //CollectAllField(res);
77 77 }
78 78
79   -
80   -/*
  79 + /*
81 80 void DataCollection::InitDataCollection(Geometry *geom, double r, double dScaleDenominator,
82 81 double x_dis, double y_dis)
83 82 {
... ... @@ -139,7 +138,6 @@ namespace DmapCore_30
139 138 }
140 139 }*/
141 140
142   -
143 141 DataCollection::~DataCollection()
144 142 {
145 143 //cout<<"free begin;" <<endl;
... ... @@ -179,8 +177,6 @@ namespace DmapCore_30
179 177 //cout<<"free end;" <<endl;
180 178 }
181 179
182   -
183   -
184 180 /*
185 181 Malloc PGresult
186 182 */
... ... @@ -264,6 +260,94 @@ namespace DmapCore_30
264 260 return true;
265 261 }
266 262
  263 +
  264 + /*
  265 + Malloc PGresult
  266 + */
  267 + bool DataCollection::MallocForPointGeom(PGresult *res)
  268 + {
  269 + m_iStructType = clsStruct::Struct_Point;
  270 +
  271 + int n_fields = PQnfields(res);
  272 + map<int, PointClass *> map_Point;
  273 +
  274 + for (size_t i = 0; i < m_iPartCount; i++)
  275 + {
  276 + unsigned char *here = (unsigned char *)PQgetvalue(res, i, 0);
  277 + unsigned char hasZorSrsid = ((unsigned char *)(here + 4))[0] / 16;
  278 + unsigned char hasZ = hasZorSrsid / 8;
  279 + unsigned char hasSrsid = hasZorSrsid % 8;
  280 +
  281 + int not_big = here[0];
  282 + here++;
  283 + int shapetype = ((int *)here)[0];
  284 + here += 4;
  285 + if (hasSrsid)
  286 + here += 4;
  287 +
  288 + int size = ((int *)here)[0];
  289 +
  290 +
  291 + double x = ((double *)here)[0];
  292 + here += 8; // clsUtil::ReadDouble(here, not_big);
  293 + double y = ((double *)here)[0];
  294 + here += 8; // clsUtil::ReadDouble(here, not_big);
  295 + double x0 = 0, y0 = 0;
  296 + this->ToScale(x, y, x0, y0);
  297 +
  298 + int key = ((int)(x0 / m_subset)) * 10000 + ((int)(y0 / m_subset));
  299 + if (map_Point.find(key) == map_Point.end())
  300 + {
  301 + PointClass *pointClass = new PointClass();
  302 + pointClass->x = x0;
  303 + pointClass->y = y0;
  304 + /*clsStruct::POINT* pp0 = new clsStruct::POINT();
  305 + pp0->x = x0;
  306 + pp0->y = y0;*/
  307 + map_Point[key] = pointClass;
  308 + for (int i0 = 1; i0 < n_fields; i0++)
  309 + {
  310 + char *vc = PQgetvalue(res, i, i0);
  311 + pointClass->m_pdata.push_back(vc);
  312 + }
  313 + }
  314 + }
  315 +
  316 + clsStruct::POINT *pp = (clsStruct::POINT *)malloc(sizeof(clsStruct::POINT) * map_Point.size());
  317 + if (pp == NULL)
  318 + return false;
  319 + int index = 0;
  320 +
  321 + //创建预留空间
  322 + m_vAllField.resize(map_Point.size());
  323 + for (int i = 0; i < map_Point.size(); i++)
  324 + m_vAllField[i].resize(n_fields - 1); //这里是不包含shape 数据的
  325 + //开辟预留空间后, 可以直接赋值,不需要 pushback
  326 +
  327 + for (map<int, PointClass *>::iterator iter = map_Point.begin(); iter != map_Point.end(); iter++)
  328 + {
  329 + PointClass *p = iter->second;
  330 + pp[index].x = p->x;
  331 + pp[index].y = p->y;
  332 + for (int j = 0; j < n_fields - 1; j++) //这里从第二列开始
  333 + {
  334 + m_vAllField[index][j] = p->m_pdata.at(j);
  335 + }
  336 + p->m_pdata.clear();
  337 + delete p;
  338 + iter->second = NULL;
  339 + index++;
  340 + }
  341 +
  342 + this->m_iPartCount = map_Point.size();
  343 +
  344 + map_Point.clear();
  345 +
  346 + m_pData = pp;
  347 + return true;
  348 + }
  349 +
  350 +
267 351 bool DataCollection::MallocForLineStringGeom(PGresult *res)
268 352 {
269 353 m_iStructType = clsStruct::Struct_MLine;
... ... @@ -293,7 +377,7 @@ namespace DmapCore_30
293 377 //if (shapetype < 0) isLineZ = true;
294 378 if (geom_type == DCGeometryType::GeometryType_LineString)
295 379 {
296   - int nLine = 1;//clsUtil::ReadInt(here, not_big);
  380 + int nLine = 1; //clsUtil::ReadInt(here, not_big);
297 381 clsStruct::LINE *pPath = (clsStruct::LINE *)malloc(sizeof(clsStruct::LINE) * nLine);
298 382 if (pPath == 0)
299 383 continue;
... ... @@ -472,8 +556,6 @@ namespace DmapCore_30
472 556 return true;
473 557 }
474 558
475   -
476   -
477 559 bool DataCollection::PolygonIsLessThanOnePixel(unsigned char *here, int not_big1)
478 560 {
479 561 double dpix = 1 / this->m_dR;
... ... @@ -1138,7 +1220,7 @@ namespace DmapCore_30
1138 1220 return true;
1139 1221 }
1140 1222
1141   -/*
  1223 + /*
1142 1224 bool DataCollection::MallocForPoint(Point *p)
1143 1225 {
1144 1226 m_iStructType = clsStruct::Struct_Point;
... ... @@ -1598,7 +1680,7 @@ namespace DmapCore_30
1598 1680 return point;
1599 1681 }
1600 1682 shared_ptr<PointClass> point(new PointClass());
1601   - return point;
  1683 + return point;
1602 1684 }
1603 1685
1604 1686 shared_ptr<PolygonClass> DataCollection::GetDataLine(unsigned char *vc)
... ...
... ... @@ -259,6 +259,7 @@ upper表示使用大端点,不使用小端点
259 259 bool MallocForPolygon(PGresult *res);
260 260 bool MallocForMultiPolygon(PGresult* res);
261 261
  262 + bool MallocForPointGeom(PGresult *res);
262 263 bool MallocForPolygonForGeom(PGresult *res);
263 264 bool MallocForLineStringGeom(PGresult *res);
264 265
... ...
... ... @@ -39,7 +39,7 @@ namespace DmapCore_30
39 39 {
40 40 double r = data->m_dScaleDenominator;
41 41 //double r = r__ / (3779.52755905);
42   - if (r <m_dLower || (r > m_dUpper && m_dUpper< 100000000) || m_pRen == 0)
  42 + if (r <m_dLower || (r > m_dUpper && m_dUpper< 10000000000) || m_pRen == 0)
43 43 return false;
44 44 return m_pRen->DrawData(pClsCS, data, pFlag);
45 45 }
... ...
... ... @@ -13,184 +13,217 @@
13 13 #include <string>
14 14 #include <boost/asio.hpp>
15 15
16   -
17 16 using boost::asio::ip::tcp;
18 17
19 18 namespace mapserver
20   -{
21   -
22   -void DmpMapServerUtil::responseGml(shared_ptr<DmpPgsql> pPgsqlConn, std::string &responseData,const string& layerName,const std::string &srid)
23 19 {
24   -
25   -// rs->PrepareFieldhead(); //获得了结果集的字段类型
26   - int shapeType = -1;
27   -
28   - double xg1, yg1, xg2, yg2;
29   - int havegSet = 0;
30   - int count = 0;
31   - int pointCountTemp = 0;
32   - char buff[5000] = {0};
33   -
34   - responseData.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?><wfs:FeatureCollection ");
35   - responseData.append("xmlns:gims=\"http://www.esri.com/esri\" xmlns:gml=\"http://www.opengis.net/gml\" xmlns:wfs=\"http://www.opengis.net/wfs\" xmlns:ogc=\"http://www.opengis.net/ogc\">");
36   -
37   -
38   - //bool paff = parseString.affine;
39   - try
  20 +
  21 + void DmpMapServerUtil::responseGml(shared_ptr<DmpPgsql> pPgsqlConn, std::string &responseData, const string &layerName, const std::string &srid)
40 22 {
41   - int fieldsCount = pPgsqlConn->GetFieldCount();
42   - for (; pPgsqlConn->next();)
  23 +
  24 + // rs->PrepareFieldhead(); //获得了结果集的字段类型
  25 + int shapeType = -1;
  26 +
  27 + double xg1, yg1, xg2, yg2;
  28 + int havegSet = 0;
  29 + int count = 0;
  30 + int pointCountTemp = 0;
  31 + char buff[5000] = {0};
  32 +
  33 + responseData.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?><wfs:FeatureCollection ");
  34 + responseData.append("xmlns:gims=\"http://www.esri.com/esri\" xmlns:gml=\"http://www.opengis.net/gml\" xmlns:wfs=\"http://www.opengis.net/wfs\" xmlns:ogc=\"http://www.opengis.net/ogc\">");
  35 +
  36 + //bool paff = parseString.affine;
  37 + try
43 38 {
44   - // css++;
45   - //if(css!=24)continue;
46   - //break;
47   - //string geometry = "";
48   - //string properties = "";
49   - responseData.append("<gims:featureMember>");
50   - sprintf(buff, "<gims:%s fid=\"%s.%d\">", layerName.c_str(), layerName.c_str(), count + 1);
51   - responseData.append(buff);
52   - //responseData.append("\r\n");
53   -
54   - //columns[md[ i ].getString(MetaData::ATTR_NAME)] = i;
55   - for (int i = 0; i < fieldsCount; i++)
  39 + int fieldsCount = pPgsqlConn->GetFieldCount();
  40 + for (; pPgsqlConn->next();)
56 41 {
57   - const char *sfieldName = pPgsqlConn->GetFieldName(i); //pPgsqlConn->field_name[i].c_str();
58   - if (sfieldName == 0)
59   - {
60   - break;
61   - }
62   - if (strncmp(sfieldName, "RN_RN", 5) == 0)
63   - continue;
64   - std::string strFieldName = sfieldName;
65   - //DmapDll::StringHelp::ToXMLString(strFieldName);
66   -
67   - if (strFieldName == "geometry_as_gml")
68   - {
69   - const char* value = pPgsqlConn->getString(i);
70   - if(value)
71   - responseData.append(value);
72   - continue;
73   - }
74   - else
  42 + // css++;
  43 + //if(css!=24)continue;
  44 + //break;
  45 + //string geometry = "";
  46 + //string properties = "";
  47 + responseData.append("<gims:featureMember>");
  48 + sprintf(buff, "<gims:%s fid=\"%s.%d\">", layerName.c_str(), layerName.c_str(), count + 1);
  49 + responseData.append(buff);
  50 + //responseData.append("\r\n");
  51 +
  52 + //columns[md[ i ].getString(MetaData::ATTR_NAME)] = i;
  53 + for (int i = 0; i < fieldsCount; i++)
75 54 {
76   - const char *v = pPgsqlConn->getString(i);
77   - sprintf(buff, "<gims:%s>%s</gims:%s>", strFieldName.c_str(), v, strFieldName.c_str());
78   - //properties += buff;
79   - responseData.append(buff);
  55 + const char *sfieldName = pPgsqlConn->GetFieldName(i); //pPgsqlConn->field_name[i].c_str();
  56 + if (sfieldName == 0)
  57 + {
  58 + break;
  59 + }
  60 + if (strncmp(sfieldName, "RN_RN", 5) == 0)
  61 + continue;
  62 + std::string strFieldName = sfieldName;
  63 + //DmapDll::StringHelp::ToXMLString(strFieldName);
  64 +
  65 + if (strFieldName == "geometry_as_gml")
  66 + {
  67 + const char *value = pPgsqlConn->getString(i);
  68 + if (value)
  69 + responseData.append(value);
  70 + continue;
  71 + }
  72 + else
  73 + {
  74 + const char *v = pPgsqlConn->getString(i);
  75 + sprintf(buff, "<gims:%s>%s</gims:%s>", strFieldName.c_str(), v, strFieldName.c_str());
  76 + //properties += buff;
  77 + responseData.append(buff);
  78 + }
80 79 }
81   -
82   - }
83   - //tickAA=GetTickCount();
  80 + //tickAA=GetTickCount();
84 81
85   - sprintf(buff, "</gims:%s>\r",layerName.c_str());
86   - responseData.append(buff);
87   - responseData.append("</gims:featureMember>");
  82 + sprintf(buff, "</gims:%s>\r", layerName.c_str());
  83 + responseData.append(buff);
  84 + responseData.append("</gims:featureMember>");
88 85
89   - count++;
90   - //if(pointCount>25)break;
  86 + count++;
  87 + //if(pointCount>25)break;
91 88
92   - if (pointCountTemp > 2000)
93   - break;
94   - //Sleep(5000);
95   - // break;
  89 + if (pointCountTemp > 2000)
  90 + break;
  91 + //Sleep(5000);
  92 + // break;
  93 + }
  94 + }
  95 + catch (...)
  96 + {
96 97 }
97   - }
98   - catch (...)
99   - {
100   -
101   - }
102   -
103   - //sprintf(buff, "numberMatched=\"%ld\" numberReturned=\"%ld\" ", count, count);
104   - //responseData.append(insertBuf, sql, strlen(sql));
105 98
106   -
  99 + //sprintf(buff, "numberMatched=\"%ld\" numberReturned=\"%ld\" ", count, count);
  100 + //responseData.append(insertBuf, sql, strlen(sql));
107 101
108   - responseData.append("</wfs:FeatureCollection>");
  102 + responseData.append("</wfs:FeatureCollection>");
109 103
110   - return;
111   -}
  104 + return;
  105 + }
112 106
113   - //以GeoJson的形式返回
114   -void DmpMapServerUtil::responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::string &responseData,const string& layerName,const string& srid)
115   -{
116   - double xg1, yg1, xg2, yg2;
117   - int havegSet = 0;
118   - int count = 0;
119   - int pointCountTemp = 0;
120   - std::string stringTime;
121   - char buff[5000] = {0};
122   -
123   - responseData.append(R"({"type":"FeatureCollection","features":[)");
124   - try
  107 + //以GeoJson的形式返回
  108 + void DmpMapServerUtil::responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::string &responseData, const string &layerName, const string &srid)
125 109 {
126   - int fieldsCount = pPgsqlConn->GetFieldCount();
127   - for (int featureIndex = 0; pPgsqlConn->next(); featureIndex++)
  110 + double xg1, yg1, xg2, yg2;
  111 + int havegSet = 0;
  112 + int count = 0;
  113 + int pointCountTemp = 0;
  114 + std::string stringTime;
  115 + char buff[5000] = {0};
  116 +
  117 + responseData.append(R"({"type":"FeatureCollection","features":[)");
  118 + try
128 119 {
129   - if (featureIndex > 0)
130   - responseData.append(",");
131   -
132   - responseData.append(R"({"type":"Feature")");
  120 + int fieldsCount = pPgsqlConn->GetFieldCount();
  121 + for (int featureIndex = 0; pPgsqlConn->next(); featureIndex++)
  122 + {
  123 + if (featureIndex > 0)
  124 + responseData.append(",");
133 125
134   - string geometry = "";
135   - string properties = "";
  126 + responseData.append(R"({"type":"Feature")");
136 127
137   - for (int i = 0; i < fieldsCount; i++)
138   - {
139   - const char *sfieldName = pPgsqlConn->GetFieldName(i); //pPgsqlConn->field_name[i].c_str();
140   - if (sfieldName == 0)
  128 + string geometry = "";
  129 + string properties = "";
  130 +
  131 + for (int i = 0; i < fieldsCount; i++)
141 132 {
142   - break;
143   - }
144   -
  133 + const char *sfieldName = pPgsqlConn->GetFieldName(i); //pPgsqlConn->field_name[i].c_str();
  134 + if (sfieldName == 0)
  135 + {
  136 + break;
  137 + }
145 138
146   - if (strncmp(sfieldName, "RN_RN", 5) == 0)
147   - continue;
148   - std::string strFieldName = sfieldName;
149   - //XML转义
150   - DmpMapServerUtil::toJsonString(strFieldName);
151   - sfieldName = strFieldName.c_str();
  139 + if (strncmp(sfieldName, "RN_RN", 5) == 0)
  140 + continue;
  141 + std::string strFieldName = sfieldName;
  142 + //XML转义
  143 + DmpMapServerUtil::toJsonString(strFieldName);
  144 + sfieldName = strFieldName.c_str();
152 145
153   - if (strFieldName == "geometry_as_geojson")
154   - {
155   - geometry = pPgsqlConn->getString(i);
156   - continue;
  146 + if (strFieldName == "geometry_as_geojson")
  147 + {
  148 + geometry = pPgsqlConn->getString(i);
  149 + continue;
  150 + }
  151 + else
  152 + {
  153 + const char *v = pPgsqlConn->getString(i);
  154 + std::sprintf(buff, R"(,"%s":"%s")", sfieldName, v);
  155 + properties += buff;
  156 + }
157 157 }
158   - else
  158 +
  159 + if (geometry != "")
159 160 {
160   - const char *v = pPgsqlConn->getString(i);
161   - std::sprintf(buff, R"(,"%s":"%s")", sfieldName, v);
162   - properties += buff;
  161 + responseData.append(R"(,"geometry":)");
  162 + responseData.append(geometry.c_str());
163 163 }
164   - }
165 164
166   - if (geometry != "")
167   - {
168   - responseData.append(R"(,"geometry":)");
169   - responseData.append(geometry.c_str());
170   - }
171   -
172   - if (properties != "")
173   - {
174   - responseData.append(R"(,"properties":)");
175   - properties[0] = '{';
176   - responseData.append(properties.c_str());
  165 + if (properties != "")
  166 + {
  167 + responseData.append(R"(,"properties":)");
  168 + properties[0] = '{';
  169 + responseData.append(properties.c_str());
  170 + responseData.append("}");
  171 + }
177 172 responseData.append("}");
  173 + count++;
178 174 }
179   - responseData.append("}");
180   - count++;
181 175 }
  176 + catch (...)
  177 + {
  178 + return;
  179 + }
  180 +
  181 + responseData.append("]}");
  182 +
  183 + return;
182 184 }
183   - catch (...)
  185 +
  186 + void DmpMapServerUtil::toXmlString(std::string &s)
184 187 {
  188 + const char *str1 = s.c_str();
  189 + if (strstr(str1, "&"))
  190 + {
  191 + s = replace(s, "&", "&amp;");
  192 + str1 = s.c_str();
  193 + }
  194 + if (strstr(str1, "<"))
  195 + {
  196 + s = replace(s, "<", "&lt;");
  197 + str1 = s.c_str();
  198 + }
  199 + if (strstr(str1, ">"))
  200 + {
  201 + s = replace(s, ">", "&gt;");
  202 + str1 = s.c_str();
  203 + }
  204 + if (strstr(str1, "\""))
  205 + {
  206 + s = replace(s, "\"", "&quot;");
  207 + str1 = s.c_str();
  208 + }
  209 + if (strstr(str1, "\r"))
  210 + {
  211 + s = replace(s, "\r", "");
  212 + str1 = s.c_str();
  213 + }
  214 + if (strstr(str1, "\n"))
  215 + {
  216 + s = replace(s, "\n", "");
  217 + str1 = s.c_str();
  218 + }
  219 + if (strstr(str1, "'"))
  220 + {
  221 + s = replace(s, "'", "&apos;");
  222 + //str1=s.c_str();
  223 + }
185 224 return;
186 225 }
187 226
188   - responseData.append("]}");
189   -
190   - return;
191   -}
192   -
193   -
194 227 void DmpMapServerUtil::toJsonString(std::string &s)
195 228 {
196 229 const char *str1 = s.c_str();
... ... @@ -236,21 +269,19 @@ void DmpMapServerUtil::responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::str
236 269 return;
237 270 }
238 271
239   - std::string DmpMapServerUtil::replace(std::string strsrc, std::string strfind, std::string strrep)
240   - {
241   - for(std::string::size_type pos(0); pos!=std::string::npos;pos+=strrep.length())
242   - {
243   - if((pos=strsrc.find(strfind,pos))!=std::string::npos)
244   - strsrc.replace(pos,strfind.length(),strrep);
245   - else
246   - break;
247   - }
248   - return strsrc;
249   - }
250   -
251   -
  272 + std::string DmpMapServerUtil::replace(std::string strsrc, std::string strfind, std::string strrep)
  273 + {
  274 + for (std::string::size_type pos(0); pos != std::string::npos; pos += strrep.length())
  275 + {
  276 + if ((pos = strsrc.find(strfind, pos)) != std::string::npos)
  277 + strsrc.replace(pos, strfind.length(), strrep);
  278 + else
  279 + break;
  280 + }
  281 + return strsrc;
  282 + }
252 283
253   - std::vector<std::string> DmpMapServerUtil::stringSplit(const std::string &str, const std::string &pattern)
  284 + std::vector<std::string> DmpMapServerUtil::stringSplit(const std::string &str, const std::string &pattern)
254 285 {
255 286 vector<std::string> stringList;
256 287 std::string subStr;
... ... @@ -258,15 +289,15 @@ void DmpMapServerUtil::responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::str
258 289 size_t patternLen = pattern.length();
259 290 for (size_t i = 0; i < str.length(); i++)
260 291 {
261   - if(pattern[0] == str[i])
  292 + if (pattern[0] == str[i])
262 293 {
263 294 tPattern = str.substr(i, patternLen);
264   - if(tPattern == pattern)
  295 + if (tPattern == pattern)
265 296 {
266   - i += patternLen -1;
267   - if(!subStr.empty())
  297 + i += patternLen - 1;
  298 + if (!subStr.empty())
268 299 {
269   - stringList.push_back(subStr);
  300 + stringList.push_back(subStr);
270 301 subStr.clear();
271 302 }
272 303 }
... ... @@ -281,18 +312,16 @@ void DmpMapServerUtil::responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::str
281 312 }
282 313 }
283 314
284   - if(!subStr.empty())
  315 + if (!subStr.empty())
285 316 {
286 317 stringList.push_back(subStr);
287 318 }
288 319 return stringList;
289   -
290 320 }
291 321
292   -
293   - int DmpMapServerUtil::HttpPost(const std::string& url, std::string& postData, std::string &reponse_data)
  322 + int DmpMapServerUtil::HttpPost(const std::string &url, std::string &postData, std::string &reponse_data)
294 323 {
295   - string host, port,path;
  324 + string host, port, path;
296 325 const std::string &http_ = "http://";
297 326 const std::string &https_ = "https://";
298 327 std::string temp_data = url;
... ... @@ -334,7 +363,6 @@ void DmpMapServerUtil::responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::str
334 363 host = host.substr(0, idx);
335 364 }
336 365
337   -
338 366 try
339 367 {
340 368 boost::asio::io_service io_service;
... ...
... ... @@ -22,6 +22,7 @@ namespace mapserver
22 22 public:
23 23 static void responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::string &responseData,const string& layerName,const std::string &srid);
24 24 static void responseGml(shared_ptr<DmpPgsql> pPgsqlConn, std::string &responseData,const string& layerName,const std::string &srid);
  25 + static void toXmlString(std::string &s);
25 26 static void toJsonString(std::string &s);
26 27 static std::string replace(std::string strsrc, std::string strfind, std::string strrep);
27 28
... ...
... ... @@ -560,7 +560,7 @@ namespace mapserver
560 560 // newPool->m_name = databaseName;
561 561 // newPool->m_alias = alias;
562 562 // newPool->Connect(connStr.c_str());
563   - // newPool->Connect("PostgreSQLConn=hostaddr=172.26.99.173 port=5433 dbname='postgres' user='postgres' password='chinadci'");
  563 + // newPool->Connect("PostgreSQLConn=hostaddr=172.26.99.173 port=5433 dbname='postgres' user='postgres' password='chinadci'");
564 564 // pgsqlPool_[guid] = newPool;
565 565 return true;
566 566 }
... ...
... ... @@ -52,20 +52,21 @@ namespace DmpMapping
52 52 std::string projectData = project->WriteXml();
53 53 if(!guid.empty() && !projectData.empty())
54 54 {
55   -
  55 +
56 56 shared_ptr<DmpProject> project(new DmpProject());
57 57 if (!project->Read(projectData))
58 58 {
  59 + context.response()->writeJson("{\"status\":\"false\",\"message\":\"加载DMD符号化失败!\"}");
59 60 return false;
60 61 }
61   - vectorMappingProjects[guid] = project;
  62 + vectorMappingProjects[guid] = project;
62 63
63   - int i = 0;
  64 + // int i = 0;
64 65 double minx, miny, maxx, maxy;
65   - std::map<std::string, DmpMapLayer *> mapLayers = project->mapLayers();
66   - for (std::map<std::string, DmpMapLayer *>::iterator iter = mapLayers.begin(); iter != mapLayers.end(); iter++)
  66 + std::vector<DmpMapLayer *> vectorLayers = project->vectorLayers();
  67 + for (size_t i = 0; i < vectorLayers.size(); i++)
67 68 {
68   - DmpMapLayer *layer = iter->second;
  69 + DmpMapLayer *layer = vectorLayers[i];
69 70 if (i == 0)
70 71 {
71 72 minx = layer->extent().xmin();
... ... @@ -93,16 +94,15 @@ namespace DmpMapping
93 94 std::string json = buff;
94 95 json.append(",\"maplayer\":[");
95 96
96   - i = 0;
97   - for (std::map<std::string, DmpMapLayer *>::iterator iter = mapLayers.begin(); iter != mapLayers.end(); iter++)
  97 +
  98 + for (int i=0; i<vectorLayers.size(); i++ )
98 99 {
99   - DmpVectorLayer *layer = (DmpVectorLayer*) iter->second;
  100 + DmpVectorLayer *layer = (DmpVectorLayer*) vectorLayers[i];
100 101 if(i>0)
101 102 {
102 103 json.append(",");
103 104 }
104 105 layer->writejson(json);
105   - i++;
106 106 }
107 107
108 108 json.append("]}");
... ... @@ -167,12 +167,11 @@ namespace DmpMapping
167 167 }
168 168 vectorMappingProjects[guid] = project;
169 169
170   - int i = 0;
171 170 double minx, miny, maxx, maxy;
172   - std::map<std::string, DmpMapLayer *> mapLayers = project->mapLayers();
173   - for (std::map<std::string, DmpMapLayer *>::iterator iter = mapLayers.begin(); iter != mapLayers.end(); iter++)
  171 + std::vector<DmpMapLayer *> vectorLayers = project->vectorLayers();
  172 + for (size_t i = 0; i < vectorLayers.size(); i++)
174 173 {
175   - DmpMapLayer *layer = iter->second;
  174 + DmpMapLayer *layer = vectorLayers[i];
176 175 if (i == 0)
177 176 {
178 177 minx = layer->extent().xmin();
... ... @@ -200,16 +199,14 @@ namespace DmpMapping
200 199 std::string json = buff;
201 200 json.append(",\"maplayer\":[");
202 201
203   - i = 0;
204   - for (std::map<std::string, DmpMapLayer *>::iterator iter = mapLayers.begin(); iter != mapLayers.end(); iter++)
  202 + for (int i=0; i<vectorLayers.size(); i++ )
205 203 {
206   - DmpVectorLayer *layer = (DmpVectorLayer*) iter->second;
  204 + DmpVectorLayer *layer = (DmpVectorLayer*) vectorLayers[i];
207 205 if(i>0)
208 206 {
209 207 json.append(",");
210 208 }
211 209 layer->writejson(json);
212   - i++;
213 210 }
214 211
215 212 json.append("]}");
... ...
... ... @@ -70,6 +70,19 @@ namespace DmpMapping
70 70 else if (boost::iequals(request,"getimage")) {
71 71 getImage(context);
72 72 }
  73 + else if(boost::iequals(request, "getmaplog")){
  74 + const std::string mapGuid = params.MapGuid();
  75 + if (vectorMappingProjects_.find(mapGuid) != vectorMappingProjects_.end())
  76 + {
  77 + shared_ptr<DmpProject> project = vectorMappingProjects_.find(mapGuid)->second;
  78 + const DmpWms::DmpWmsParameters wmsParams(context.request()->serverParameters());
  79 + DmpWms::writeGetMapLog(context, wmsParams, project.get());
  80 + }
  81 + else
  82 + {
  83 + context.response()->writeJson("{\"status\":\"false\",\"message\":\"未找到服务\"}");
  84 + }
  85 + }
73 86 else if (boost::iequals(request, "getmap"))
74 87 {
75 88 const std::string mapGuid = params.MapGuid();
... ...
... ... @@ -143,17 +143,16 @@ namespace DmpWfs
143 143 pt.add_child("DCPType", pt_dcpType);
144 144 }
145 145
146   - void addFeatureTypeList(boost::property_tree::ptree &pt,const DmpProject *project)
  146 + void addFeatureTypeList(boost::property_tree::ptree &pt, const DmpProject *project)
147 147 {
148 148 boost::property_tree::ptree ptOperations;
149   - ptOperations.add("Query","");
  149 + ptOperations.add("Query", "");
150 150 pt.add_child("Operations", ptOperations);
151 151
152   - int i = 0;
153   - std::map<std::string, DmpMapLayer *> mapLayers = project->mapLayers();
154   - for (std::map<std::string, DmpMapLayer *>::iterator iter = mapLayers.begin(); iter != mapLayers.end(); iter++, i++)
  152 + std::vector<DmpMapLayer *> vectorLayers = project->vectorLayers();
  153 + for (int i = 0; i < vectorLayers.size(); i++)
155 154 {
156   - DmpVectorLayer *layer = (DmpVectorLayer *)iter->second;
  155 + DmpVectorLayer *layer = (DmpVectorLayer*) vectorLayers[i];
157 156 std::string source = layer->source();
158 157 shared_ptr<DmpPgsql> pPgsqlConn = DmpPgsqlSourcePools::get_instance()->GetPgsqlConn(layer->source());
159 158 if (pPgsqlConn != nullptr)
... ... @@ -188,11 +187,11 @@ namespace DmpWfs
188 187
189 188 boost::property_tree::ptree ptFields;
190 189 char tablesql_buff[300];
191   - sprintf(tablesql_buff, "select column_name,data_type from information_schema.columns where table_schema = '%s' and table_name = '%s'",
192   - layer->schema().c_str(),
193   - layer->name().c_str());
194   - bool returnResult = pPgsqlConn->ExecWait(tablesql_buff);
195   - for (;returnResult && pPgsqlConn->next();)
  190 + sprintf(tablesql_buff, "select column_name,data_type from information_schema.columns where table_schema = '%s' and table_name = '%s'",
  191 + layer->schema().c_str(),
  192 + layer->name().c_str());
  193 + bool returnResult = pPgsqlConn->ExecWait(tablesql_buff);
  194 + for (; returnResult && pPgsqlConn->next();)
196 195 {
197 196 std::string fieldname = pPgsqlConn->getString(0);
198 197 std::string typeString = pPgsqlConn->getString(1);
... ... @@ -259,11 +258,9 @@ namespace DmpWfs
259 258 ptFeatureType.add_child("Fields", ptFields);
260 259 pt.add_child("FeatureType", ptFeatureType);
261 260 }
262   -
263 261 }
264 262 }
265 263
266   -
267 264 void addFilterCapabilities(boost::property_tree::ptree &pt,const std::string &hrefUrl)
268 265 {
269 266 boost::property_tree::ptree ptFilterCapabilities;
... ...
... ... @@ -52,6 +52,10 @@ namespace DmpWms
52 52 {
53 53 writeGetMap(context,params, project);
54 54 }
  55 + else if(boost::iequals(request, "getmaplog"))
  56 + {
  57 + writeGetMapLog(context,params, project);
  58 + }
55 59 else if(boost::iequals(request,"thumbnail") || boost::iequals(request,"getthumbnail"))
56 60 {
57 61 writeThumbnail(context,params, project);
... ...
... ... @@ -156,11 +156,11 @@ namespace DmpWms
156 156
157 157
158 158 double minx,miny,maxx,maxy;
159   - int i =0;
160   - std::map<std::string, DmpMapLayer*> mapLayers = project->mapLayers();
161   - for (std::map<std::string, DmpMapLayer*>::iterator iter = mapLayers.begin();iter != mapLayers.end(); iter++)
  159 +
  160 + std::vector<DmpMapLayer*> vectorLayers = project->vectorLayers();
  161 + for (int i=0; i<vectorLayers.size(); i++)
162 162 {
163   - DmpMapLayer* layer = iter->second;
  163 + DmpMapLayer* layer = vectorLayers[i];
164 164 if(i ==0)
165 165 {
166 166 minx = layer->extent().xmin();
... ... @@ -175,9 +175,8 @@ namespace DmpWms
175 175 if(maxx < layer->extent().xmax()) maxx = layer->extent().xmax();
176 176 if(maxy < layer->extent().ymax()) maxy = layer->extent().ymax();
177 177 }
178   - i++;
179 178 }
180   -
  179 +
181 180 boost::property_tree::ptree ptGeographicBoundingbox;
182 181 ptGeographicBoundingbox.add("westBoundLongitude", minx);
183 182 ptGeographicBoundingbox.add("eastBoundLongitude", maxx);
... ... @@ -203,9 +202,9 @@ namespace DmpWms
203 202 }
204 203 ptProject.add_child("BoundingBox",ptBoundingbox);
205 204
206   - for (std::map<std::string, DmpMapLayer*>::iterator iter= mapLayers.begin();iter != mapLayers.end(); iter++)
  205 + for (int i=0; i<vectorLayers.size(); i++)
207 206 {
208   - DmpMapLayer* layer = iter->second;
  207 + DmpMapLayer* layer = vectorLayers[i];
209 208 addCapabilitiesLayer(ptProject, layer,srs);
210 209 }
211 210 pt.add_child("Layer", ptProject);
... ...
... ... @@ -22,7 +22,9 @@ namespace DmpWms
22 22 string exception = WmsGetMap(context,params, project,projectSettings);
23 23 if(exception.length() >0)
24 24 {
25   -
  25 + context.response()->removeHeader("Content-Type");
  26 + context.response()->setHeader("Content-Type", "text/json");
  27 + context.response()->writeJson(exception);
26 28 }
27 29 }
28 30
... ... @@ -32,7 +34,6 @@ namespace DmpWms
32 34 {
33 35 try
34 36 {
35   -
36 37 double boxX1, boxY1, boxX2, boxY2;
37 38 std::string srs = params.Srs();
38 39 std::string recbox = params.BBox();
... ... @@ -70,6 +71,7 @@ namespace DmpWms
70 71 else
71 72 {
72 73 char strlayers[1000] = {0};
  74 + boost::to_lower(layers);
73 75 strcpy(strlayers,(char *)layers.c_str());
74 76 mapRenderer.AddWmsMapLayers(project, strlayers);
75 77 }
... ... @@ -92,6 +94,76 @@ namespace DmpWms
92 94 }
93 95 }
94 96
  97 +
  98 + void writeGetMapLog(const DmpServerContext &context, const DmpWmsParameters& params,
  99 + const DmpProject* project, bool projectSettings)
  100 + {
  101 + try
  102 + {
  103 +
  104 + double boxX1, boxY1, boxX2, boxY2;
  105 + std::string srs = params.Srs();
  106 + std::string recbox = params.BBox();
  107 +
  108 + int width = params.Width();
  109 + int height = params.Height();
  110 + std::string layerDefs = params.layerDefs();
  111 + std::string regionDefs = params.regionDefs();
  112 + std::map<std::string, std::string> mapLayerDefs;
  113 + std::map<std::string, std::string> mapRegionDefs;
  114 + StrDefs2Map(mapLayerDefs,layerDefs);
  115 + StrDefs2Map(mapRegionDefs,regionDefs);
  116 +
  117 + stringstream stream;
  118 + stream << "<getmaplog>";
  119 +
  120 + if (boost::iequals(srs, "CRS:84")|| boost::iequals(srs, "EPSG:4326"))
  121 + {
  122 + sscanf(recbox.c_str(), "%lf,%lf,%lf,%lf", &boxY1, &boxX1, &boxY2, &boxX2);
  123 + }
  124 + else
  125 + {
  126 + sscanf(recbox.c_str(), "%lf,%lf,%lf,%lf", &boxX1, &boxY1, &boxX2, &boxY2);
  127 + }
  128 +
  129 +
  130 + //stbstb:应该检查大量地方的 width和height不为零 ,char* regionDefs
  131 + if (width <= 0 || height <= 0) return ;// "width和height 参数错误";
  132 + if (width > 8000 || height > 6000) return ;// "参数错误,图片大小 宽不能大于8000像素 高大于6000像素";
  133 +
  134 + DmpWms::DmpWmsRenderer mapRenderer(height, width);
  135 +
  136 + std::string layers = params.Layers();
  137 + if (layers =="")
  138 + {
  139 + mapRenderer.AddWmsMapLayers(project);
  140 + }
  141 + else
  142 + {
  143 + char strlayers[1000] = {0};
  144 + boost::to_lower(layers);
  145 + strcpy(strlayers,(char *)layers.c_str());
  146 + mapRenderer.AddWmsMapLayers(project, strlayers);
  147 + }
  148 +
  149 +
  150 + shared_ptr<Rect> rect (new Rect(boxY2, boxX2, boxY1, boxX1));
  151 + mapRenderer.SetExtent(rect);
  152 + mapRenderer.GetMapLog(stream, &mapLayerDefs,&mapRegionDefs);
  153 + stream << "</getmaplog>";
  154 + string responseData = stream.str();
  155 +
  156 + context.response()->removeHeader("Content-Type");
  157 + context.response()->setHeader("Content-Type", "text/xml");
  158 + context.response()->write(responseData);
  159 + }
  160 + catch (const std::exception &e)
  161 + {
  162 + std::cerr << " GetMap " << e.what() << '\n';
  163 + //return e.what();
  164 + }
  165 + }
  166 +
95 167 void writeThumbnail(const DmpServerContext &context,const DmpWmsParameters& params,
96 168 const DmpProject* project,bool projectSettings)
97 169 {
... ...
... ... @@ -24,6 +24,9 @@ namespace DmpWms
24 24 void writeGetMap(const DmpServerContext &context,const DmpWmsParameters& params,
25 25 const DmpProject* project,
26 26 bool projectSettings = false );
  27 + void writeGetMapLog(const DmpServerContext &context,const DmpWmsParameters& params,
  28 + const DmpProject* project,
  29 + bool projectSettings = false );
27 30 std::string WmsGetMap(const DmpServerContext &context,const DmpWmsParameters& params,
28 31 const DmpProject* project,
29 32 bool projectSettings = false );
... ...
... ... @@ -9,6 +9,8 @@
9 9 #include <boost/property_tree/ptree.hpp>
10 10 #include <boost/property_tree/xml_parser.hpp>
11 11 #include <boost/typeof/typeof.hpp>
  12 +#include <boost/algorithm/algorithm.hpp>
  13 +#include <boost/algorithm/string/case_conv.hpp>
12 14 #include "dmpwmsrenderer.h"
13 15 #include "dmpmapserverutil.h"
14 16 #include <sstream>
... ... @@ -45,7 +47,6 @@ namespace DmpWms
45 47 pRasterBufferObj = rb;
46 48
47 49 oneInchInLayoutUnits = 0.0254;
48   -
49 50 m_dHeight = height;
50 51 m_dWidth = width;
51 52 m_vLayers = {};
... ... @@ -628,11 +629,10 @@ ST_GeometryFromText('POLYGON((%f %f, %f %f, %f %f, %f %f, %f %f))',%s),\
628 629
629 630 bool DmpWmsRenderer::AddWmsMapLayers(const DmpProject *project) //插入型加入
630 631 {
631   - std::map<std::string, DmpMapLayer *> mapLayers = project->mapLayers();
632   - for (std::map<std::string, DmpMapLayer *>::iterator iter = mapLayers.begin();
633   - iter != mapLayers.end(); iter++)
  632 + std::vector<DmpMapLayer *> vectorLayers = project->vectorLayers();
  633 + for (int i =0;i< vectorLayers.size(); i++)
634 634 {
635   - this->AddMapLayer(-1, (DmpVectorLayer *)iter->second);
  635 + this->AddMapLayer(-1, (DmpVectorLayer*)vectorLayers[i]);
636 636 }
637 637 return true;
638 638 }
... ... @@ -669,13 +669,17 @@ ST_GeometryFromText('POLYGON((%f %f, %f %f, %f %f, %f %f, %f %f))',%s),\
669 669 i++;
670 670 }
671 671
672   - std::map<std::string, DmpMapLayer *> mapLayers = project->mapLayers();
673   - for (std::map<std::string, DmpMapLayer *>::iterator iter = mapLayers.begin();
674   - iter != mapLayers.end(); iter++)
  672 +
  673 +
  674 + std::vector<DmpMapLayer *> vectorLayers = project->vectorLayers();
  675 + for (std::vector<DmpMapLayer *>::iterator iter = vectorLayers.begin();
  676 + iter != vectorLayers.end(); iter++)
675 677 {
676   - if (set_layer.find(iter->first) != set_layer.end())
  678 + std::string lowname = (*iter)->name();
  679 + boost::to_lower(lowname);
  680 + if (set_layer.find(lowname) != set_layer.end())
677 681 {
678   - this->AddMapLayer(-1, (DmpVectorLayer *)iter->second);
  682 + this->AddMapLayer(-1, (DmpVectorLayer *)(*iter));
679 683 }
680 684 }
681 685
... ... @@ -848,7 +852,8 @@ ST_GeometryFromText('POLYGON((%f %f, %f %f, %f %f, %f %f, %f %f))',%s),\
848 852 }
849 853 return true;
850 854 }
851   - /*
  855 +
  856 +/*
852 857 bool DmpWmsRenderer::DrawData(DataCollection *data, Renderer *renderer, clsCrSurf *pClsCS)
853 858 {
854 859
... ... @@ -915,6 +920,226 @@ ST_GeometryFromText('POLYGON((%f %f, %f %f, %f %f, %f %f, %f %f))',%s),\
915 920 }
916 921
917 922 //在DC上绘制时是否使用一个临时的 image_surface, 然后拷上去,这样具体的细节处理就没有区别了
  923 + bool DmpWmsRenderer::GetMapLog(std::stringstream &outputStream, map<string, string> *map_layerDefs,
  924 + map<string, string> *map_regionDefs,
  925 + shared_ptr<Rect> pRect, double r__, double x_dis__, double y_dis__)
  926 + {
  927 + char buff[500];
  928 + sprintf(buff, "<log>layer count =%ld</log>", m_vLayers.size());
  929 + outputStream << buff;
  930 +
  931 + bool has_regionDefs = false;
  932 + string strRegionColDefs = "";
  933 + string strRegionLayerNameDefs = "";
  934 +
  935 + if (map_regionDefs)
  936 + {
  937 + map<string, string>::iterator iter_regionDef = map_regionDefs->begin();
  938 + if (iter_regionDef != map_regionDefs->end())
  939 + {
  940 + strRegionColDefs = iter_regionDef->second.c_str();
  941 + strRegionLayerNameDefs = iter_regionDef->first.c_str();
  942 + has_regionDefs = true;
  943 + }
  944 + }
  945 +
  946 + for (int i = 0; i < (int)(m_vLayers.size()); i++)
  947 + {
  948 + DmpVectorLayer *layer = m_vLayers[i];
  949 + sprintf(buff, "<log>draw layer %s</log>", layer->name().c_str());
  950 + outputStream << buff;
  951 +
  952 + double r1 = layer->minScale(); // *
  953 + double r2 = layer->maxScale(); // *
  954 +
  955 + shared_ptr<Rect> pExtent;
  956 + if (pRect == NULL)
  957 + pExtent = m_pExtent;
  958 + else
  959 + pExtent = pRect;
  960 +
  961 + sprintf(buff,"<log>显示范围 %f,%f,%f,%f </log>",
  962 + pExtent->m_dLeft, pExtent->m_dBottom, pExtent->m_dTop, pExtent->m_dRight);
  963 + outputStream << buff;
  964 +
  965 + sprintf(buff,"<log>数据范围 %f,%f,%f,%f </log>",
  966 + layer->extent().xmin(), layer->extent().ymin(), layer->extent().xmax(), layer->extent().ymax() );
  967 + outputStream << buff;
  968 +
  969 + double x_dis, y_dis;
  970 + if (r__ == -1)
  971 + {
  972 + x_dis = m_dXdis;
  973 + y_dis = m_dYdis;
  974 + }
  975 + else
  976 + {
  977 + x_dis = x_dis__;
  978 + y_dis = y_dis__;
  979 + }
  980 +
  981 + if ((this->m_dScaleDenominator > r1 || this->m_dScaleDenominator < r2 || layer->GetRenderer30() == nullptr))
  982 + {
  983 + sprintf(buff,"<log>draw not Denominator</log>");
  984 + outputStream << buff;
  985 + continue;
  986 + }
  987 +
  988 + const char *strLayerDef = nullptr;
  989 + bool has_layerDef = false;
  990 + if (map_layerDefs)
  991 + {
  992 + map<string, string>::iterator iter_layerDef = map_layerDefs->find(layer->name());
  993 + if (iter_layerDef != map_layerDefs->end())
  994 + {
  995 + has_layerDef = true;
  996 + strLayerDef = iter_layerDef->second.c_str();
  997 + }
  998 + }
  999 +
  1000 + //绘图操作从始至终不传到 maplayer 那一层
  1001 +
  1002 + /*if (layer->featurecount() <= 0)
  1003 + {
  1004 + string sql0 = GetCountSQL(ml.get());
  1005 + const char *ss0__ = "";
  1006 + const char **pmsg0 = &ss0__;
  1007 + shared_ptr<DmpPgsql> pWorkspace = DataSourcePools::get_instance()->GetWorkspace(layer->source());
  1008 + if (pWorkspace == nullptr)
  1009 + break;
  1010 + //CWorkspacePoolZero2 Zero(pWorkspacePool, pWorkspace);
  1011 + shared_ptr<Recordsets> recss0 = pWorkspace->ExecuteBinary(sql0, "", pmsg0);
  1012 + if (recss0 != NULL)
  1013 + {
  1014 + int dataCount = PQntuples(recss0->m_pPGresult);
  1015 +
  1016 + sprintf(buff, "<log>read dataCount</log>");
  1017 + outputStream << buff;
  1018 + sprintf(buff, "<log>dataCount=%d</log>", layer->featurecount());
  1019 + outputStream << buff;
  1020 + }
  1021 + else
  1022 + {
  1023 + sprintf(buff, "<log>read dataCount fail</log>");
  1024 + outputStream << buff;
  1025 + return false;
  1026 + }
  1027 + }
  1028 + else
  1029 + {
  1030 + sprintf(buff,"<log>dataCount=%d</log>", layer->featurecount()));
  1031 + outputStream << buff;
  1032 + }
  1033 +*/
  1034 +
  1035 +
  1036 + sprintf(buff,"<log>load data from dababase</log>");
  1037 + outputStream << buff;
  1038 +
  1039 + string sql = "";
  1040 + shared_ptr<DmpVectorThinLayer> pVectorThinLayer = nullptr;
  1041 +
  1042 + shared_ptr<DataCollection> data(new DataCollection());
  1043 +
  1044 + if (!has_regionDefs)
  1045 + {
  1046 + sql = GetDrawSQL(layer, pExtent.get(), strLayerDef);
  1047 + }
  1048 + else
  1049 + {
  1050 + sql = GetRegionQuerySQL(layer, pExtent.get(), format("%d", layer->crs().srid()), strRegionLayerNameDefs, strRegionColDefs, strLayerDef);
  1051 + }
  1052 +
  1053 + pVectorThinLayer = layer->GetCurrentScaleTable(1 / this->m_dR);
  1054 +
  1055 + string sqlLog = sql;
  1056 + DmpMapServerUtil::toXmlString(sqlLog);
  1057 +
  1058 + sprintf(buff,"<log>sql = %s</log>", sqlLog.c_str());
  1059 + outputStream << buff;
  1060 +
  1061 + if (sql == "")
  1062 + continue;
  1063 +
  1064 + string tableName = layer->name();
  1065 +
  1066 + if (pVectorThinLayer != nullptr)
  1067 + {
  1068 + tableName = pVectorThinLayer->tableName();
  1069 + }
  1070 +
  1071 + if (tableName.length() > 32)
  1072 + {
  1073 + tableName = tableName.substr(32);
  1074 + }
  1075 +
  1076 + const char *ss__ = "";
  1077 + const char **pmsg = &ss__;
  1078 + try
  1079 + {
  1080 +
  1081 + shared_ptr<DmpPgsql> pPgsqlConn = nullptr;
  1082 + if (pVectorThinLayer == nullptr)
  1083 + {
  1084 + pPgsqlConn = DmpPgsqlSourcePools::get_instance()->GetPgsqlConn(layer->source());
  1085 + }
  1086 + else
  1087 + {
  1088 + pPgsqlConn = DmpPgsqlSourcePools::get_instance()->GetDefaultPgsqlConn();
  1089 + }
  1090 +
  1091 + if (pPgsqlConn == nullptr)
  1092 + {
  1093 + sprintf(buff,"<log>pWorkspace is null</log>");
  1094 + outputStream << buff;
  1095 + break;
  1096 + }
  1097 +
  1098 + if (pPgsqlConn->ExecWaitBinary(sql))
  1099 + {
  1100 + sprintf(buff,"<log>从原始图层获取数据</log>");
  1101 + outputStream << buff;
  1102 + if( pPgsqlConn->GetRowCount())
  1103 + continue;
  1104 +
  1105 + sprintf(buff,"<log>draw success</log>");
  1106 + outputStream << buff;
  1107 + }
  1108 + else if (pVectorThinLayer != nullptr)
  1109 + {
  1110 + /*shared_ptr<DmpPgsql> pPgsqlConn1 = DmpPgsqlSourcePools::get_instance()->GetPgsqlConn(layer->source());
  1111 + sprintf(buff,"<log>从抽稀图层获取数据%s</log>", pMapLayerThinning->m_tableName.c_str());
  1112 + if (pPgsqlConn1 == nullptr)
  1113 + break;
  1114 + if (pPgsqlConn1->ExecWaitBinary(sql))
  1115 + {
  1116 + PGresult *res = pPgsqlConn1->m_pConn->m_pPGresult;
  1117 + if (PQntuples(res) == 0)
  1118 + continue;
  1119 + //data->InitDataCollection(res, shapeType, this->m_dWidth, this->m_dHeight, (int)ml->subset, m_dR, m_dScaleDenominator, x_dis, y_dis);
  1120 + sprintf(buff,"<log>draw success</log>");
  1121 + outputStream << buff;
  1122 + }
  1123 + else
  1124 + {
  1125 + sprintf(buff,"<log>获取数据失败,找不到图层</log>");
  1126 + //DrawText2("获取数据失败,找不到图层" ,pClsSurfThis,10,10);
  1127 + }*/
  1128 + }
  1129 + }
  1130 + catch (const std::exception &e)
  1131 + {
  1132 + sprintf(buff,"DrawSimpleData");
  1133 + std::cerr << "#DrawSimpleData " << e.what() << '\n';
  1134 + }
  1135 + }
  1136 +
  1137 + sprintf(buff,"<log>return</log>");
  1138 +
  1139 + return true;
  1140 + }
  1141 +
  1142 + //在DC上绘制时是否使用一个临时的 image_surface, 然后拷上去,这样具体的细节处理就没有区别了
918 1143 bool DmpWmsRenderer::GetMap(map<string, string> *map_layerDefs, map<string, string> *map_regionDefs, clsCrSurf *pClsCS, bool isThumbnail,
919 1144 shared_ptr<Rect> pRect, double r__, double x_dis__, double y_dis__)
920 1145 {
... ... @@ -1072,17 +1297,7 @@ ST_GeometryFromText('POLYGON((%f %f, %f %f, %f %f, %f %f, %f %f))',%s),\
1072 1297
1073 1298 allDataCount += PQntuples(res);
1074 1299 this->DrawSimpleData(data.get(), layer->GetRenderer30().get(), pClsSurfThis);
1075   - // DrawText(StringHelp::fmt("data %.0fm",(endTime_data - startTime).count()/1000000.0)
1076   - // ,pClsSurfThis,10,50);
1077   -
1078   - /*
1079   - DrawText(tableName ,pClsSurfThis,10,100);
1080   -
1081   - char ptext[100] = {0};
1082   - sprintf(ptext, "count = %d",allDataCount);
1083   - DrawText2(ptext ,pClsSurfThis,10,140);
1084   -
1085   - */
  1300 +
1086 1301 }
1087 1302 else if (pVectorThinLayer != nullptr)
1088 1303 {
... ...
注册登录 后发表评论