正在显示
53 个修改的文件
包含
1644 行增加
和
387 行删除
... | ... | @@ -30,6 +30,7 @@ SET(DMAP_CORE_SRCS |
30 | 30 | |
31 | 31 | renderer/clsMalloc.cpp |
32 | 32 | renderer/clsStruct.cpp |
33 | + renderer/clsPtree.cpp | |
33 | 34 | renderer/clsJson.cpp |
34 | 35 | renderer/clsXML.cpp |
35 | 36 | renderer/clsUtil.cpp |
... | ... | @@ -82,6 +83,7 @@ SET(DMAP_CORE_HDRS |
82 | 83 | renderer/clsMalloc.h |
83 | 84 | renderer/clsStruct.h |
84 | 85 | renderer/clsJson.h |
86 | + renderer/clsPtree.h | |
85 | 87 | renderer/clsXML.h |
86 | 88 | renderer/clsUtil.h |
87 | 89 | renderer/clsRect.h | ... | ... |
... | ... | @@ -55,9 +55,9 @@ bool DmpVectorLayer::readXml(const boost::property_tree::ptree &layerNode) |
55 | 55 | // geom_ = layerNode.get<std::string>("geom"); |
56 | 56 | // featurecount_ = layerNode.get<unsigned int>("featurecount"); |
57 | 57 | |
58 | - boost::property_tree::ptree pRenderer = layerNode.get_child("renderer"); | |
59 | - auto pIter = pRenderer.begin(); | |
60 | - if(pIter == pRenderer.end())return false; | |
58 | + boost::property_tree::ptree ptRenderer = layerNode.get_child("renderer"); | |
59 | + auto pIter = ptRenderer.begin(); | |
60 | + if(pIter == ptRenderer.end())return false; | |
61 | 61 | DmapCore_30::Renderer* renderer_30 = nullptr; |
62 | 62 | DmapCore_30::clsXML::XMLParse(pIter->first, pIter->second, &renderer_30); |
63 | 63 | renderer_30_ = shared_ptr<DmapCore_30::Renderer>(renderer_30); |
... | ... | @@ -71,7 +71,26 @@ bool DmpVectorLayer::readXml(const boost::property_tree::ptree &layerNode) |
71 | 71 | |
72 | 72 | bool DmpVectorLayer::writeXml(boost::property_tree::ptree &layerNode) |
73 | 73 | { |
74 | - return false; | |
74 | + layerNode.add("<xmlattr>.id", id_); | |
75 | + layerNode.add("<xmlattr>.name", name_); | |
76 | + layerNode.add("<xmlattr>.alias", title_); | |
77 | + | |
78 | + boost::property_tree::ptree ptExtent; | |
79 | + ptExtent.add("xmin", extent_.xmin()); | |
80 | + ptExtent.add("ymin", extent_.ymin()); | |
81 | + ptExtent.add("xmax", extent_.xmax()); | |
82 | + ptExtent.add("ymax", extent_.ymax()); | |
83 | + layerNode.add_child("extent", ptExtent); | |
84 | + | |
85 | + layerNode.add("datasource", dataSource_); | |
86 | + | |
87 | + if(this->renderer_30_) | |
88 | + { | |
89 | + boost::property_tree::ptree ptRenderer; | |
90 | + this->renderer_30_->ParsePtree(ptRenderer); | |
91 | + } | |
92 | + | |
93 | + return true; | |
75 | 94 | } |
76 | 95 | |
77 | 96 | void DmpVectorLayer::setRenderer(DmpFeatureRenderer *renderer) | ... | ... |
... | ... | @@ -13,7 +13,7 @@ |
13 | 13 | #include"TrueTypeMarkerSymbol.h" |
14 | 14 | #include "clsUtil.h" |
15 | 15 | #include "clsXML.h" |
16 | - | |
16 | +#include "clsPtree.h" | |
17 | 17 | namespace DmapCore_30 |
18 | 18 | { |
19 | 19 | GroupRenderer::GroupRenderer() |
... | ... | @@ -45,6 +45,19 @@ namespace DmapCore_30 |
45 | 45 | |
46 | 46 | } |
47 | 47 | |
48 | + bool GroupRenderer::ParsePtree( boost::property_tree::ptree &pt) | |
49 | + { | |
50 | + boost::property_tree::ptree ptRenderer; | |
51 | + int length = (int)m_vSymbols.size(); | |
52 | + for (int i = 0; i < length; i++) | |
53 | + { | |
54 | + Renderer* renderer = m_vSymbols[i]; | |
55 | + renderer->ParsePtree(ptRenderer); | |
56 | + } | |
57 | + pt.add_child("GROUPRENDERER",ptRenderer); | |
58 | + return true; | |
59 | + } | |
60 | + | |
48 | 61 | void GroupRenderer::ToJson(AppendBuffer *ab) |
49 | 62 | { |
50 | 63 | ... | ... |
... | ... | @@ -16,6 +16,7 @@ namespace DmapCore_30 |
16 | 16 | virtual int RendererType(); |
17 | 17 | virtual bool Parse(boost::property_tree::ptree &pt, AppendBuffer *f); |
18 | 18 | virtual void ToJson(AppendBuffer *ab); |
19 | + virtual bool ParsePtree( boost::property_tree::ptree &pt); | |
19 | 20 | // virtual bool DrawSimpleData(clsCrSurf* pClsCS, DataCollection* data, char* pFlag); |
20 | 21 | virtual bool DrawData(clsCrSurf* pClsCS, DataCollection* data, bool drawSimpleData, char* pFlag); |
21 | 22 | virtual bool DrawData(clsCrSurf* pClsCS, DataCollection* data, int dataIndex, char* pFlag); | ... | ... |
... | ... | @@ -47,6 +47,7 @@ namespace DmapCore_30 |
47 | 47 | virtual bool DrawData(clsCrSurf* pClsCS, DataCollection* data, bool drawSimpleData, char* pFlag = NULL) = 0; |
48 | 48 | virtual bool DrawData(clsCrSurf* pClsCS, DataCollection* data, int dataIndex, char* pFlag = NULL) =0; |
49 | 49 | virtual bool Parse( boost::property_tree::ptree &pt, AppendBuffer *f) = 0; |
50 | + virtual bool ParsePtree( boost::property_tree::ptree &pt)=0; | |
50 | 51 | //static bool RendererXmlParse(Renderer**pRen, const char* fileName); |
51 | 52 | //static bool RenStr(Renderer** ppRen, const char** psXML); //纯粹作弊,什么都没干,直接调用现有接口 |
52 | 53 | ... | ... |
... | ... | @@ -18,6 +18,7 @@ namespace DmapCore_30 |
18 | 18 | ScaleDependentRenderer(); |
19 | 19 | ~ScaleDependentRenderer(); |
20 | 20 | virtual BOOL Parse(rapidxml::xml_node<char>* node, AppendBuffer *f); |
21 | + virtual bool ParsePtree( boost::property_tree::ptree &pt); | |
21 | 22 | virtual void ToJson(AppendBuffer *ab); |
22 | 23 | //virtual BOOL RendererString(Renderer** ppRen, const char** psXML); |
23 | 24 | virtual BOOL DrawData(clsCrSurf* pClsCS, DataCollection* data, bool drawSimpleData, char* pFlag); | ... | ... |
... | ... | @@ -14,6 +14,7 @@ |
14 | 14 | #include <stdlib.h> |
15 | 15 | #include <iostream> |
16 | 16 | #include "clsJson.h" |
17 | +#include "clsPtree.h" | |
17 | 18 | #include <string.h> |
18 | 19 | //#include <string.h> |
19 | 20 | #define dotX 5 |
... | ... | @@ -105,6 +106,30 @@ bool SimpleLabelRenderer::Parse(boost::property_tree::ptree &pt, AppendBuffer * |
105 | 106 | return true; |
106 | 107 | } |
107 | 108 | |
109 | +bool SimpleLabelRenderer::ParsePtree( boost::property_tree::ptree &pt) | |
110 | +{ | |
111 | + boost::property_tree::ptree ptRenderer; | |
112 | + clsPtree::PtreeAttrParse("field", ptRenderer, this->m_sField); | |
113 | + clsPtree::PtreeAttrParse("labelpriorities", ptRenderer, this->m_sLabelPriorities); | |
114 | + clsPtree::PtreeAttrParse("rotationangles", ptRenderer, this->m_sRotationAngles); | |
115 | + clsPtree::PtreeAttrParse("rotationanglefield", ptRenderer, this->m_sRotationAngleField); | |
116 | + clsPtree::PtreeAttrParse("isverticaltoangle", ptRenderer, this->m_bIsVerticalToAngle); | |
117 | + | |
118 | + clsPtree::ParseEnum("linelabelpositiondirection", ptRenderer, m_iLineLabelPositionDirection, "level", "parallel", "curved","vertical"); | |
119 | + clsPtree::ParseEnum("linelabelpositionstartorend", ptRenderer, m_iLineLabelPositionStartOrEnd, "start","end","center"); | |
120 | + clsPtree::PtreeAttrParse("linelabelpositionplace", ptRenderer, m_sLineLabelPositionPlaces); | |
121 | + clsPtree::ParseEnum("polygonlabelpositiondirection", ptRenderer, m_iPolygonLabelPositionDirection, "parallel","straight","parallelandstraight"); | |
122 | + | |
123 | + clsPtree::PtreeAttrParse("labelinpolygon", ptRenderer, this->m_bLabelInPolygon); | |
124 | + | |
125 | + if(m_pTextSymbol) | |
126 | + { | |
127 | + m_pTextSymbol->ParsePtree(ptRenderer); | |
128 | + } | |
129 | + pt.add_child("SIMPLELABELRENDERER", ptRenderer); | |
130 | + return true; | |
131 | +} | |
132 | + | |
108 | 133 | void SimpleLabelRenderer::ToJson(AppendBuffer *ab) |
109 | 134 | { |
110 | 135 | char buff[300] = {0}; | ... | ... |
... | ... | @@ -17,7 +17,8 @@ namespace DmapCore_30 |
17 | 17 | SimpleLabelRenderer(); |
18 | 18 | ~SimpleLabelRenderer(); |
19 | 19 | int RendererType(); |
20 | - virtual bool Parse(boost::property_tree::ptree &pt, AppendBuffer *f); | |
20 | + virtual bool Parse(boost::property_tree::ptree &pt, AppendBuffer *f); | |
21 | + virtual bool ParsePtree( boost::property_tree::ptree &pt); | |
21 | 22 | virtual void ToJson(AppendBuffer *ab); |
22 | 23 | //virtual bool RendererString(Renderer** ppRen, const char** psXML); |
23 | 24 | virtual bool DrawData(clsCrSurf* pClsCS, DataCollection* data, bool drawSimpleData, char* pFlag = NULL); | ... | ... |
... | ... | @@ -4,6 +4,7 @@ |
4 | 4 | #include"clsXML.h" |
5 | 5 | #include"clsCrSurf.h" |
6 | 6 | #include "clsJson.h" |
7 | +#include "clsPtree.h" | |
7 | 8 | #define _USE_MATH_DEFINES |
8 | 9 | #include<math.h> |
9 | 10 | namespace DmapCore_30 |
... | ... | @@ -69,6 +70,21 @@ namespace DmapCore_30 |
69 | 70 | return true; |
70 | 71 | } |
71 | 72 | |
73 | + bool SimpleLineSymbol::ParsePtree( boost::property_tree::ptree &pt) | |
74 | + { | |
75 | + boost::property_tree::ptree ptRenderer; | |
76 | + clsPtree::PtreeAttrParse("icon", ptRenderer, this->m_sPNG); | |
77 | + //clsPtree::ParseEnum("type", resultbuff, buff, m_iAntialiasing, "antialias_default", "antialias_none", "antialias_gray", "antialias_subpixel", "antialias_fase", "antialias_good", "antialias_best", "true", "false"); | |
78 | + clsPtree::ParseEnum("type", ptRenderer, m_iType, "solid", "dash", "dot", "dash_dot", "dash_dot_dot"); | |
79 | + clsPtree::PtreeAttrParseColor("color", "transparency", ptRenderer, m_iColor); | |
80 | + clsPtree::PtreeAttrParse("width", ptRenderer, m_dWidth); | |
81 | + | |
82 | + clsPtree::ParseEnum("captype", ptRenderer, m_iCapType, "cap_butt", "cap_round", "cap_square"); | |
83 | + clsPtree::ParseEnum("jiontype", ptRenderer, m_iJionType, "jion_miter", "jion_round", "jion_bevel"); | |
84 | + pt.add_child("SIMPLELINESYMBOL",ptRenderer); | |
85 | + return true; | |
86 | + } | |
87 | + | |
72 | 88 | void SimpleLineSymbol::ToJson(AppendBuffer *ab) |
73 | 89 | { |
74 | 90 | char buff[300] = {0}; | ... | ... |
... | ... | @@ -29,6 +29,7 @@ namespace DmapCore_30 |
29 | 29 | static SimpleLineSymbol* CreateNew(); |
30 | 30 | virtual int RendererType(); |
31 | 31 | virtual bool Parse(boost::property_tree::ptree &pt, AppendBuffer *f); |
32 | + virtual bool ParsePtree( boost::property_tree::ptree &pt); | |
32 | 33 | virtual void ToJson(AppendBuffer *ab); |
33 | 34 | //virtual bool RendererString(Renderer** ppRen, const char** psXML); |
34 | 35 | virtual bool DrawData(clsCrSurf* clsCS, DataCollection* data, bool drawSimpleData, char* pFlag = NULL); | ... | ... |
... | ... | @@ -5,6 +5,7 @@ |
5 | 5 | #include "clsXML.h" |
6 | 6 | #include "DataCollection.h" |
7 | 7 | #include "clsJson.h" |
8 | +#include "clsPtree.h" | |
8 | 9 | #define _USE_MATH_DEFINES |
9 | 10 | #include <math.h> |
10 | 11 | namespace DmapCore_30 |
... | ... | @@ -75,6 +76,27 @@ namespace DmapCore_30 |
75 | 76 | return true; |
76 | 77 | } |
77 | 78 | |
79 | + bool SimpleMarkerSymbol::ParsePtree( boost::property_tree::ptree &pt) | |
80 | + { | |
81 | + boost::property_tree::ptree ptRenderer; | |
82 | + string png = this->m_sPNG; | |
83 | + if(png != "" && png.find("symbollib") != png.npos) | |
84 | + { | |
85 | + int pos = png.find("symbollib"); | |
86 | + png = "../" + png.substr(pos,png.length() - pos); | |
87 | + } | |
88 | + clsPtree::PtreeAttrParse("png", ptRenderer, png); | |
89 | + clsPtree::ParseEnum("type", ptRenderer, m_iType, "circle", "triangle", "square", "cross", "star", "icon"); | |
90 | + clsPtree::PtreeAttrParseColor("color", "transparency", ptRenderer, m_iColor); | |
91 | + clsPtree::PtreeAttrParse("boundary", ptRenderer, m_bBoundary); | |
92 | + clsPtree::PtreeAttrParseColor("outline", "outlinetransparency", ptRenderer, m_iOutline); | |
93 | + clsPtree::PtreeAttrParse("width", ptRenderer, m_dWidth); | |
94 | + clsPtree::PtreeAttrParse("size", ptRenderer, m_dSize); | |
95 | + pt.add_child("SIMPLEMARKERSYMBOL",ptRenderer); | |
96 | + return true; | |
97 | + } | |
98 | + | |
99 | + | |
78 | 100 | void SimpleMarkerSymbol::ToJson(AppendBuffer* ab) |
79 | 101 | { |
80 | 102 | ... | ... |
... | ... | @@ -28,7 +28,7 @@ namespace DmapCore_30 |
28 | 28 | virtual bool DrawLegend(clsCrSurf* pClsCS, shared_ptr<legendParamater> pLegendParamater, int layerType,char* pFlag = NULL); |
29 | 29 | virtual bool Parse(boost::property_tree::ptree &pt, AppendBuffer *f); |
30 | 30 | virtual void ToJson(AppendBuffer* ab); |
31 | - | |
31 | + virtual bool ParsePtree( boost::property_tree::ptree &pt); | |
32 | 32 | bool TryFindHeatRenderer(){ return false; } |
33 | 33 | |
34 | 34 | ... | ... |
... | ... | @@ -4,6 +4,7 @@ |
4 | 4 | #include"clsCrSurf.h" |
5 | 5 | #include"clsXML.h" |
6 | 6 | #include "clsJson.h" |
7 | +#include "clsPtree.h" | |
7 | 8 | #include"clsStruct.h" |
8 | 9 | #include "DataCollection.h" |
9 | 10 | |
... | ... | @@ -127,6 +128,38 @@ namespace DmapCore_30 |
127 | 128 | } |
128 | 129 | return true; |
129 | 130 | } |
131 | + | |
132 | + bool SimplePolygonSymbol::ParsePtree( boost::property_tree::ptree &pt) | |
133 | + { | |
134 | + boost::property_tree::ptree ptRenderer; | |
135 | + clsPtree::PtreeAttrParse("icon", ptRenderer, this->m_sPNG); | |
136 | + clsPtree::ParseEnum("filltype", ptRenderer, m_iFillType, "solid", "bdiagonal", "fdiagonal", "cross", "diagcross", "horizontal", "vertical", "gray", "lightgray", "darkgray", "icon","character" ), | |
137 | + clsPtree::PtreeAttrParseColor("fillcolor", "filltransparency", ptRenderer, m_iFillColor); | |
138 | + | |
139 | + clsPtree::PtreeAttrParse("boundary", ptRenderer, m_bBoundary); | |
140 | + clsPtree::PtreeAttrParse("width", ptRenderer, m_dWidth); | |
141 | + clsPtree::ParseEnum("linetype", ptRenderer, m_iLineType, "solid", "dash", "dot", "dash_dot", "dash_dot_dot"); | |
142 | + clsPtree::PtreeAttrParseColor("boundarycolor", "boundarytransparency", ptRenderer, m_iBoundaryColor); | |
143 | + clsPtree::PtreeAttrParse("fillinterval", ptRenderer, m_lFillInterval); | |
144 | + clsPtree::PtreeAttrParse("needfill", ptRenderer, m_bNeedFill); | |
145 | + | |
146 | + clsPtree::PtreeAttrParse("needbackground", ptRenderer, m_bNeedBackground); | |
147 | + clsPtree::PtreeAttrParseColor("backgroundcolor", "backgroundtransparency", ptRenderer, m_iBackgroundColor); | |
148 | + | |
149 | + clsPtree::PtreeAttrParse("fillsize", ptRenderer, m_iFillsize); | |
150 | + | |
151 | + clsPtree::PtreeAttrParse("diagalignment", ptRenderer, m_diagalignment); | |
152 | + if(m_iFillType == dmapFillTypeCharacter) | |
153 | + { | |
154 | + clsPtree::PtreeAttrParse("character", ptRenderer, m_lCharacter); | |
155 | + clsPtree::PtreeAttrParse("font", ptRenderer, m_sFont); | |
156 | + clsPtree::PtreeAttrParse("fontname", ptRenderer, m_sFontname); | |
157 | + } | |
158 | + pt.add_child("SIMPLEPOLYGONSYMBOL",ptRenderer); | |
159 | + | |
160 | + return true; | |
161 | + } | |
162 | + | |
130 | 163 | void SimplePolygonSymbol::ToJson(AppendBuffer *ab) |
131 | 164 | { |
132 | 165 | char buff[300] = {0}; | ... | ... |
... | ... | @@ -44,6 +44,7 @@ namespace DmapCore_30 |
44 | 44 | virtual bool DrawData(clsCrSurf* pClsCS, DataCollection* data, int dataIndex, char* pFlag = NULL); |
45 | 45 | virtual bool DrawLegend(clsCrSurf* pClsCS, shared_ptr<legendParamater> pLegendParamater,int layerType, char* pFlag = NULL); |
46 | 46 | virtual void ToJson(AppendBuffer *ab); |
47 | + virtual bool ParsePtree( boost::property_tree::ptree &pt); | |
47 | 48 | int m_iAntialiasing; |
48 | 49 | |
49 | 50 | bool TryFindHeatRenderer(){ return false; } | ... | ... |
... | ... | @@ -11,6 +11,7 @@ |
11 | 11 | #include"ValueMapRenderer.h" |
12 | 12 | //#include"RangeMapRenderer.h" |
13 | 13 | #include"GroupRenderer.h" |
14 | +#include "clsPtree.h" | |
14 | 15 | namespace DmapCore_30 |
15 | 16 | { |
16 | 17 | SimpleRenderer::SimpleRenderer() |
... | ... | @@ -93,6 +94,41 @@ namespace DmapCore_30 |
93 | 94 | return true; |
94 | 95 | } |
95 | 96 | |
97 | + bool SimpleRenderer::ParsePtree( boost::property_tree::ptree &pt) | |
98 | + { | |
99 | + boost::property_tree::ptree ptRenderer; | |
100 | + char buff_maxscale[100]; | |
101 | + char buff_minscale[100]; | |
102 | + if(this->m_dUpper>100000000) | |
103 | + { | |
104 | + sprintf(buff_maxscale,"%e", this->m_dUpper); | |
105 | + } | |
106 | + else | |
107 | + { | |
108 | + sprintf(buff_maxscale,"%.0f", this->m_dUpper); | |
109 | + } | |
110 | + | |
111 | + if(this->m_dLower>100000000) | |
112 | + { | |
113 | + sprintf(buff_minscale,"%e", this->m_dLower); | |
114 | + } | |
115 | + else | |
116 | + { | |
117 | + sprintf(buff_minscale,"%.0f", this->m_dLower); | |
118 | + } | |
119 | + | |
120 | + ptRenderer.add("maxscale",buff_maxscale); | |
121 | + ptRenderer.add("minscale",buff_minscale); | |
122 | + ptRenderer.add("alwaysShow", m_alwaysShow?"true":"false"); | |
123 | + | |
124 | + if(this->m_pRen) | |
125 | + { | |
126 | + this->m_pRen->ParsePtree(ptRenderer); | |
127 | + } | |
128 | + pt.add_child("TEXTSYMBOL",ptRenderer); | |
129 | + return true; | |
130 | + } | |
131 | + | |
96 | 132 | void SimpleRenderer::ToJson(AppendBuffer *ab) |
97 | 133 | { |
98 | 134 | char buff[600]; | ... | ... |
... | ... | @@ -17,6 +17,7 @@ namespace DmapCore_30 |
17 | 17 | virtual bool DrawLegend(clsCrSurf* pClsCS, shared_ptr<legendParamater> pLegendParamater,int layerType, char* pFlag = NULL); |
18 | 18 | virtual bool Parse(boost::property_tree::ptree &pt, AppendBuffer *f); |
19 | 19 | virtual void ToJson(AppendBuffer *ab); |
20 | + virtual bool ParsePtree( boost::property_tree::ptree &pt); | |
20 | 21 | void TryAddField(vector<string>&pvField); |
21 | 22 | bool TryFindHeatRenderer(); |
22 | 23 | ... | ... |
... | ... | @@ -4,6 +4,7 @@ |
4 | 4 | #include"clsUtil.h" |
5 | 5 | #include"clsMalloc.h" |
6 | 6 | #include "clsJson.h" |
7 | +#include "clsPtree.h" | |
7 | 8 | #include <math.h> |
8 | 9 | namespace DmapCore_30 |
9 | 10 | { |
... | ... | @@ -96,6 +97,36 @@ namespace DmapCore_30 |
96 | 97 | return true; |
97 | 98 | } |
98 | 99 | |
100 | + bool TextSymbol::ParsePtree( boost::property_tree::ptree &pt) | |
101 | + { | |
102 | + boost::property_tree::ptree ptRenderer; | |
103 | + //sprintf(resultbuff, R"("TEXTSYMBOL":{"antialiasing":"antialias_default",)"); | |
104 | + clsPtree::PtreeAttrParse("font", ptRenderer, this->m_sFont); | |
105 | + clsPtree::PtreeAttrParse("fontsize", ptRenderer, this->m_iFontSize); | |
106 | + // | |
107 | + clsPtree::PtreeAttrParseColor("fontcolor", "fonttransparency", ptRenderer, m_iFontColor); | |
108 | + clsPtree::PtreeAttrParse("x_dis", ptRenderer, this->m_dXdis); | |
109 | + clsPtree::PtreeAttrParse("y_dis", ptRenderer, this->m_dYdis); | |
110 | + //clsPtree::ParseEnum("antialiasing", ptRenderer, m_iAntialiasing, "antialias_default", "antialias_none", "antialias_gray", "antialias_subpixel", "antialias_fase", "antialias_good", "antialias_best", "true", "false"); | |
111 | + clsPtree::ParseEnum("slant", ptRenderer, m_iSlant,"normal", "italic", "oblique"); | |
112 | + clsPtree::ParseEnum("weight", ptRenderer, m_iWeight, "normal", "bold"); | |
113 | + clsPtree::PtreeAttrParse("background", ptRenderer, m_bBackGround); | |
114 | + if (m_bBackGround) | |
115 | + clsPtree::PtreeAttrParseColor("bgcolor", "bgtransparency", ptRenderer, m_iBGColor); | |
116 | + | |
117 | + clsPtree::PtreeAttrParse("glowing", ptRenderer, m_bGlowing); | |
118 | + if (m_bGlowing) | |
119 | + clsPtree::PtreeAttrParseColor("glowingcolor", "glowingtransparency", ptRenderer, m_iBGColor); | |
120 | + | |
121 | + | |
122 | + clsPtree::PtreeAttrParse("shadow", ptRenderer, m_bGlowing); | |
123 | + if (m_bGlowing) | |
124 | + clsPtree::PtreeAttrParseColor("shadowcolor", "shadowtransparency", ptRenderer, m_iShadowColor); | |
125 | + | |
126 | + pt.add_child("TEXTSYMBOL",ptRenderer); | |
127 | + return true; | |
128 | + } | |
129 | + | |
99 | 130 | void TextSymbol::ToJson(AppendBuffer *ab) |
100 | 131 | { |
101 | 132 | char buff[300] = {0}; | ... | ... |
... | ... | @@ -28,6 +28,7 @@ namespace DmapCore_30 |
28 | 28 | virtual bool DrawLegend(clsCrSurf* pClsCS, shared_ptr<legendParamater> pLegendParamater, int layerType,char* pFlag = NULL); |
29 | 29 | bool Parse(boost::property_tree::ptree &pt, AppendBuffer *f); |
30 | 30 | virtual void ToJson(AppendBuffer *ab); |
31 | + virtual bool ParsePtree( boost::property_tree::ptree &pt); | |
31 | 32 | static bool RendererXmlParse(Renderer**pRen, const char* fileName); |
32 | 33 | |
33 | 34 | bool TryFindHeatRenderer(){ return false; } | ... | ... |
... | ... | @@ -6,6 +6,7 @@ |
6 | 6 | #include"clsUtil.h" |
7 | 7 | #include"clsXML.h" |
8 | 8 | #include "clsJson.h" |
9 | +#include "clsPtree.h" | |
9 | 10 | #define _USE_MATH_DEFINES |
10 | 11 | #include<math.h> |
11 | 12 | #define ShadowSize 1 |
... | ... | @@ -384,6 +385,37 @@ namespace DmapCore_30 |
384 | 385 | return true; |
385 | 386 | } |
386 | 387 | |
388 | + bool TrueTypeMarkerSymbol::ParsePtree( boost::property_tree::ptree &pt) | |
389 | + { | |
390 | + boost::property_tree::ptree ptRenderer; | |
391 | + clsPtree::PtreeAttrParse("angle",ptRenderer, m_dAngle); | |
392 | + clsPtree::PtreeAttrParse("anglefield",ptRenderer, m_sAngleField); | |
393 | + clsPtree::ParseEnum("antialiasing",ptRenderer, m_iAntialiasing,"default", "none", "gray", "subpixel", "fast", "good", "best", "true", "false"); | |
394 | + clsPtree::PtreeAttrParse("character",ptRenderer, m_lCharacter); | |
395 | + clsPtree::PtreeAttrParseColor("fontcolor", "fonttransparency",ptRenderer, m_iFontColor); | |
396 | + | |
397 | + clsPtree::PtreeAttrParse("fontname",ptRenderer,m_fontname); | |
398 | + clsPtree::PtreeAttrParse("characterxdis",ptRenderer, m_dCharacterXdis); | |
399 | + clsPtree::PtreeAttrParse("characterydis",ptRenderer, m_dCharacterYdis); | |
400 | + clsPtree::PtreeAttrParse("font",ptRenderer, m_sFont); | |
401 | + clsPtree::PtreeAttrParseColor("glowingcolor", "glowingtransparency",ptRenderer, m_iFontColor); | |
402 | + clsPtree::PtreeAttrParse("fontsize",ptRenderer, m_lFontSize); | |
403 | + | |
404 | + clsPtree::PtreeAttrParse("haveglowing",ptRenderer, m_bHaveGlowing); | |
405 | + if (m_bHaveGlowing) | |
406 | + { | |
407 | + clsPtree::PtreeAttrParseColor("haveglowing", "fonttransparency",ptRenderer, m_iGlowingColor); | |
408 | + } | |
409 | + clsPtree::PtreeAttrParse("haveglowing",ptRenderer, m_bHaveGlowing); | |
410 | + | |
411 | + clsPtree::ParseEnum("linetype",ptRenderer, m_iSlant,"normal", "italic", "oblique"); | |
412 | + clsPtree::ParseEnum("linetype",ptRenderer, m_iWeight,"normal", "bold"); | |
413 | + clsPtree::PtreeAttrParse("haveunderline",ptRenderer, m_bHaveUnderLine); | |
414 | + clsPtree::PtreeAttrParse("havedeleteline",ptRenderer, m_bHaveDeleteLine); | |
415 | + pt.add_child("TRUETYPEMARKERSYMBOL",ptRenderer); | |
416 | + return true; | |
417 | + } | |
418 | + | |
387 | 419 | void TrueTypeMarkerSymbol::ToJson(AppendBuffer *ab) |
388 | 420 | { |
389 | 421 | char buff[300] = {0}; | ... | ... |
... | ... | @@ -25,7 +25,7 @@ namespace DmapCore_30 |
25 | 25 | virtual bool DrawLegend(clsCrSurf* pClsCS, shared_ptr<legendParamater> pLegendParamater,int layerType, char* pFlag = NULL); |
26 | 26 | virtual bool Parse(boost::property_tree::ptree &pt, AppendBuffer *f); |
27 | 27 | virtual void ToJson(AppendBuffer *ab); |
28 | - | |
28 | + virtual bool ParsePtree( boost::property_tree::ptree &pt); | |
29 | 29 | double m_dAngle; //旋转角度固定值 |
30 | 30 | string m_sAngleField; //旋转角度以某个字段的数据为依据,改数据获取后会转化成 0~2π |
31 | 31 | /* | ... | ... |
... | ... | @@ -2,6 +2,7 @@ |
2 | 2 | #include "ValueMapRenderer.h" |
3 | 3 | #include"clsXML.h" |
4 | 4 | #include "clsJson.h" |
5 | +#include "clsPtree.h" | |
5 | 6 | #include"ValueMapRendererComponent.h" |
6 | 7 | #include<map> |
7 | 8 | using namespace std; |
... | ... | @@ -74,6 +75,34 @@ namespace DmapCore_30 |
74 | 75 | return true; |
75 | 76 | } |
76 | 77 | |
78 | + bool ValueMapRenderer::ParsePtree( boost::property_tree::ptree &pt) | |
79 | + { | |
80 | + char buff[300] = {0}; | |
81 | + boost::property_tree::ptree ptRenderer; | |
82 | + ptRenderer.add("lookupfield",m_sField); | |
83 | + | |
84 | + int length = (int)m_vComponents.size(); | |
85 | + for (int i = 0; i < length; i++) | |
86 | + { | |
87 | + boost::property_tree::ptree ptNode; | |
88 | + ValueMapRendererComponent* vmrc = m_vComponents[i]; | |
89 | + ptNode.add("value",vmrc->GetValue()); | |
90 | + if(vmrc->m_pSymbol) | |
91 | + { | |
92 | + vmrc->m_pSymbol->ParsePtree(ptNode); | |
93 | + } | |
94 | + ptRenderer.add_child("EXACT",ptNode); | |
95 | + } | |
96 | + | |
97 | + if (m_pDefaultSymbol) | |
98 | + { | |
99 | + boost::property_tree::ptree ptNode; | |
100 | + this->m_pDefaultSymbol->ParsePtree(ptNode); | |
101 | + ptRenderer.add_child("OTHER",ptNode); | |
102 | + } | |
103 | + return true; | |
104 | + } | |
105 | + | |
77 | 106 | void ValueMapRenderer::ToJson(AppendBuffer *ab) |
78 | 107 | { |
79 | 108 | char buff[300] = {0}; | ... | ... |
... | ... | @@ -24,7 +24,7 @@ namespace DmapCore_30 |
24 | 24 | virtual bool DrawData(clsCrSurf* pClsCS, DataCollection* data, int dataIndex, char* pFlag = NULL); |
25 | 25 | virtual bool DrawLegend(clsCrSurf* pClsCS, shared_ptr<legendParamater> pLegendParamater,int layerType, char* pFlag = NULL); |
26 | 26 | virtual void ToJson(AppendBuffer *ab); |
27 | - | |
27 | + virtual bool ParsePtree( boost::property_tree::ptree &pt); | |
28 | 28 | const char* GetTag(); |
29 | 29 | bool SetTag(const char* sTag); |
30 | 30 | Renderer* GetDefaultSymbol(); | ... | ... |
src/core/renderer/clsPtree.cpp
0 → 100644
1 | +/************************************************************************** | |
2 | +* file: clsPtree.cpp | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-29 16:52:23 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | + | |
10 | + | |
11 | +#include "clsPtree.h" | |
12 | +#include <stdarg.h> | |
13 | +#include <string.h> | |
14 | + | |
15 | +namespace DmapCore_30 | |
16 | +{ | |
17 | + void clsPtree::ParseEnum(const char *name, boost::property_tree::ptree& pt, int v, string a1, string a2 , string a3, string a4, string a5, string a6, string a7, string a8, string a9, string a10, string a11, string a12, string a13, string a14, string a15, string a16) | |
18 | + { | |
19 | + | |
20 | + string vstring = a1; | |
21 | + switch (v) | |
22 | + { | |
23 | + case 0: vstring = a1; break; | |
24 | + case 1: vstring = a2; break; | |
25 | + case 2: vstring = a3; break; | |
26 | + case 3: vstring = a4; break; | |
27 | + case 4: vstring = a5; break; | |
28 | + case 5: vstring = a6; break; | |
29 | + case 6: vstring = a7; break; | |
30 | + case 7: vstring = a8; break; | |
31 | + case 8: vstring = a9; break; | |
32 | + case 9: vstring = a10; break; | |
33 | + case 10: vstring = a11; break; | |
34 | + case 11: vstring = a12; break; | |
35 | + case 12: vstring = a13; break; | |
36 | + case 13: vstring = a14; break; | |
37 | + case 14: vstring = a15; break; | |
38 | + case 15: vstring = a16; break; | |
39 | + } | |
40 | + std::string ptname = "<xmlattr>."; | |
41 | + ptname += name; | |
42 | + pt.add(ptname, vstring); | |
43 | + | |
44 | + } | |
45 | + | |
46 | + void clsPtree::PtreeAttrParse(const char* name, boost::property_tree::ptree& pt, string &v) | |
47 | + { | |
48 | + std::string ptname = "<xmlattr>."; | |
49 | + ptname += name; | |
50 | + pt.add(ptname, v); | |
51 | + } | |
52 | + | |
53 | + void clsPtree::PtreeAttrParse(const char* name, boost::property_tree::ptree& pt, bool &v) | |
54 | + { | |
55 | + std::string ptname = "<xmlattr>."; | |
56 | + ptname += name; | |
57 | + pt.add(ptname, v?"true":"false"); | |
58 | + } | |
59 | + | |
60 | + void clsPtree::PtreeAttrParse(const char* name, boost::property_tree::ptree& pt, double &v) | |
61 | + { | |
62 | + std::string ptname = "<xmlattr>."; | |
63 | + ptname += name; | |
64 | + pt.add(ptname, v); | |
65 | + } | |
66 | + | |
67 | + void clsPtree::PtreeAttrParse(const char* name, boost::property_tree::ptree& pt, int &v) | |
68 | + { | |
69 | + std::string ptname = "<xmlattr>."; | |
70 | + ptname += name; | |
71 | + pt.add(ptname, v); | |
72 | + } | |
73 | + | |
74 | + void clsPtree::PtreeAttrParse(const char* name, boost::property_tree::ptree& pt, long &v) | |
75 | + { | |
76 | + std::string ptname = "<xmlattr>."; | |
77 | + ptname += name; | |
78 | + pt.add(ptname, v); | |
79 | + } | |
80 | + | |
81 | + | |
82 | + | |
83 | + | |
84 | + void clsPtree::PtreeAttrParseColor(const char* name,const char*name2, boost::property_tree::ptree& pt,unsigned int& value) | |
85 | + { | |
86 | + string sColor = "", sTransparency = ""; | |
87 | + std::string ptname = "<xmlattr>."; | |
88 | + pt.add(ptname + name, sColor); | |
89 | + pt.add(ptname + name2, sTransparency); | |
90 | + | |
91 | + } | |
92 | + | |
93 | +} // namespace DmapDll | |
\ No newline at end of file | ... | ... |
src/core/renderer/clsPtree.h
0 → 100644
1 | +/************************************************************************** | |
2 | +* file: clsPtree.h | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-29 16:52:09 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | + | |
10 | +#ifndef __clsPtree_h__ | |
11 | +#define __clsPtree_h__ | |
12 | + | |
13 | +#include <boost/property_tree/ptree.hpp> | |
14 | +#include <boost/property_tree/json_parser.hpp> | |
15 | +#include <boost/foreach.hpp> | |
16 | +using namespace std; | |
17 | +namespace DmapCore_30 | |
18 | +{ | |
19 | + class Renderer; | |
20 | + class clsPtree | |
21 | + { | |
22 | + public: | |
23 | + static void ParseEnum(const char* name, boost::property_tree::ptree& pt,int, string a1 = "", string a2 = "", string a3 = "", string a4 = "", string a5 = "", string a6 = "", string a7 = "", string a8 = "", string a9 = "", string a10 = "", string a11 = "", string a12 = "", string a13 = "", string a14 = "", string a15 = "", string a16 = ""); | |
24 | + static void PtreeAttrParse(const char* name, boost::property_tree::ptree& pt, string &v); | |
25 | + static void PtreeAttrParse(const char* name, boost::property_tree::ptree& pt, bool &v); | |
26 | + static void PtreeAttrParse(const char* name, boost::property_tree::ptree& pt, double &v); | |
27 | + static void PtreeAttrParse(const char* name, boost::property_tree::ptree& pt, int &v); | |
28 | + static void PtreeAttrParse(const char* name, boost::property_tree::ptree& pt, long &v); | |
29 | + // static void JsonAttrEnd(char* resultbuff); | |
30 | + | |
31 | + static void PtreeAttrParseColor(const char* name,const char*name2, boost::property_tree::ptree& pt, unsigned int&value); | |
32 | + }; | |
33 | +} | |
34 | + | |
35 | +#endif // __clsPtree_h__ | ... | ... |
... | ... | @@ -6,10 +6,12 @@ |
6 | 6 | SET (API_SRCS |
7 | 7 | dmpapi.cpp |
8 | 8 | dmpmanagerapihandler.cpp |
9 | + dmpvectormappingapihandler.cpp | |
9 | 10 | ) |
10 | 11 | |
11 | 12 | SET (API_HDRS |
12 | 13 | dmpmanagerapihandler.h |
14 | + dmpvectormappingapihandler.h | |
13 | 15 | ) |
14 | 16 | |
15 | 17 | ######################################################## | ... | ... |
... | ... | @@ -15,6 +15,7 @@ |
15 | 15 | #include <boost/make_shared.hpp> |
16 | 16 | #include "dmpservermanagerapi.h" |
17 | 17 | #include "dmpmanagerapihandler.h" |
18 | +#include "dmpvectormappingapihandler.h" | |
18 | 19 | |
19 | 20 | using namespace std; |
20 | 21 | |
... | ... | @@ -33,6 +34,8 @@ namespace DmpApi |
33 | 34 | }; |
34 | 35 | // Register handlers |
35 | 36 | mgr_api->registerHandler<DmpManagerApiHandler>(); |
37 | + // Register VectorMapping handlers | |
38 | + mgr_api->registerHandler<DmpVectorMappingApiHandler>(); | |
36 | 39 | // Register API |
37 | 40 | std::shared_ptr<DmpServerApi> api(mgr_api); |
38 | 41 | registry.registerApi(api); | ... | ... |
1 | +/************************************************************************** | |
2 | +* file: dmpvectormappingapihandler.cpp | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-27 10:58:08 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | + | |
10 | +#include <unistd.h> | |
11 | +#include <dirent.h> | |
12 | +#include <stdlib.h> | |
13 | +#include <sys/stat.h> | |
14 | +#include <map> | |
15 | +#include <set> | |
16 | +#include <fontconfig/fontconfig.h> | |
17 | + | |
18 | +#include <boost/foreach.hpp> | |
19 | +#include <boost/lexical_cast.hpp> | |
20 | +#include <boost/algorithm/string.hpp> | |
21 | +#include <boost/date_time.hpp> | |
22 | +#include <boost/property_tree/ptree.hpp> | |
23 | +#include <boost/property_tree/json_parser.hpp> | |
24 | +#include <boost/typeof/typeof.hpp> | |
25 | + | |
26 | +#include "dmpserverrequest.h" | |
27 | +#include "dmpserverresponse.h" | |
28 | +#include "dmplogger.h" | |
29 | +#include "dmpservermanager.h" | |
30 | +#include "dmpserverutils.h" | |
31 | +#include "dmpvectormappingapihandler.h" | |
32 | + | |
33 | +DmpVectorMappingApiHandler::DmpVectorMappingApiHandler() | |
34 | +{ | |
35 | + | |
36 | +} | |
37 | + | |
38 | +void DmpVectorMappingApiHandler::HandleRequest(const DmpServerApiContext &context) const | |
39 | +{ | |
40 | + if (OperationId().compare("getmap") == 0) { | |
41 | + | |
42 | + } | |
43 | + else if (OperationId().compare("getdmd") == 0) { | |
44 | + | |
45 | + } | |
46 | + else if (OperationId().compare("getdatatabledetail") == 0) { | |
47 | + | |
48 | + } | |
49 | + else if (OperationId().compare("gettypefacelist") == 0) { | |
50 | + getTypefaceList(context); | |
51 | + } | |
52 | + else if (OperationId().compare("getimagetyplist") == 0) { | |
53 | + getImageTypeList(context); | |
54 | + } | |
55 | + else if (OperationId().compare("getimagelist") == 0) { | |
56 | + getImageList(context); | |
57 | + } | |
58 | + else if (OperationId().compare("getimage") == 0) { | |
59 | + getImage(context); | |
60 | + } | |
61 | +} | |
62 | + | |
63 | + | |
64 | +void DmpVectorMappingApiHandler::getDataTableDetail(const DmpServerApiContext &context) const | |
65 | +{ | |
66 | + switch (context.request()->method()) | |
67 | + { | |
68 | + case DmpServerRequest::Method::GET_METHOD: | |
69 | + { | |
70 | + context.response()->write("{\"status\":\"true\",\"message\":\"服务发布测试——————GET\"}"); | |
71 | + break; | |
72 | + } | |
73 | + case DmpServerRequest::Method::POST_METHOD: | |
74 | + { | |
75 | + std::string dbsource; | |
76 | + std::string schema; | |
77 | + std::string tablename; | |
78 | + | |
79 | + const char* data = (char*)(context.request()->GetData()); | |
80 | + if(data && *data != '\0') | |
81 | + { | |
82 | + try | |
83 | + { | |
84 | + std::stringstream stream(data); | |
85 | + boost::property_tree::ptree pt; | |
86 | + boost::property_tree::read_json(stream, pt); | |
87 | + | |
88 | + dbsource = pt.get<std::string>("dbsource"); | |
89 | + schema = pt.get<std::string>("schema"); | |
90 | + tablename = pt.get<int>("tablename"); | |
91 | + | |
92 | + } | |
93 | + catch (boost::property_tree::ptree_bad_path& e) { | |
94 | + LOGGER_ERROR(e.what()); | |
95 | + context.response()->write("{\"status\":\"false\",\"message\":\"获取表信息失败\"}"); | |
96 | + return; | |
97 | + } | |
98 | + catch (boost::property_tree::ptree_bad_data& e) { | |
99 | + LOGGER_ERROR(e.what()); | |
100 | + context.response()->write("{\"status\":\"false\",\"message\":\"获取表信息失败\"}"); | |
101 | + return; | |
102 | + } | |
103 | + if(false) { | |
104 | + // context.manager()->publish(serverType, name, title, capabilities, project) | |
105 | + LOGGER_INFO("服务发布成功"); | |
106 | + context.response()->write("{\"status\":\"true\",\"message\":\"Pulish service successful!\"}"); | |
107 | + // std::string projData; | |
108 | + // DmpServerUtils::Base64Decode(project, &projData); | |
109 | + // context.response()->removeHeader("Content-Type"); | |
110 | + // context.response()->setHeader("Content-Type", "text/xml;charset=utf-8"); | |
111 | + // context.response()->write(projData); | |
112 | + } | |
113 | + else | |
114 | + { | |
115 | + LOGGER_ERROR("获取表信息失败"); | |
116 | + context.response()->write("{\"status\":\"false\",\"message\":\"获取表信息失败!\"}"); | |
117 | + } | |
118 | + } | |
119 | + else | |
120 | + { | |
121 | + LOGGER_ERROR("POST数据为空"); | |
122 | + context.response()->write("{\"status\":\"false\",\"message\":\"POST数据为空,获取表信息失败!\"}"); | |
123 | + return; | |
124 | + } | |
125 | + break; | |
126 | + | |
127 | + } | |
128 | + default: | |
129 | + { | |
130 | + | |
131 | + } | |
132 | + } | |
133 | +} | |
134 | + | |
135 | + | |
136 | +void DmpVectorMappingApiHandler::getTypefaceList(const DmpServerApiContext &context) const | |
137 | +{ | |
138 | + FcConfig *config = FcInitLoadConfigAndFonts(); | |
139 | + FcPattern *pat = FcPatternCreate(); | |
140 | + FcObjectSet *os = FcObjectSetBuild(FC_FAMILY, FC_STYLE, FC_LANG, FC_FILE, (char *)0); | |
141 | + FcFontSet *fs = FcFontList(config, pat, os); | |
142 | + if(fs == nullptr) | |
143 | + { | |
144 | + context.response()->writeJson("{\"error\":\"load FcFontSet failed\"}"); | |
145 | + return; | |
146 | + } | |
147 | + //printf("Total matching fonts: %d\n", fs->nfont); | |
148 | + boost::property_tree::ptree ptDoc; | |
149 | + boost::property_tree::ptree ptRoot; | |
150 | + | |
151 | + std::map<std::string, std::string> mapFont; | |
152 | + mapFont["SimSun"] = "宋体"; | |
153 | + mapFont["NSimSun"] = "新宋体"; | |
154 | + mapFont["SimHei"] = "黑体"; | |
155 | + mapFont["FangSong"] = "仿宋"; | |
156 | + mapFont["KaiTi"] = "楷体"; | |
157 | + mapFont["LiSu"] = "隶书"; | |
158 | + mapFont["YouYuan"] = "幼圆"; | |
159 | + mapFont["STXihei"] = "华文细黑"; | |
160 | + mapFont["STKaiti"] = "华文楷体"; | |
161 | + mapFont["STSong"] = "华文宋体"; | |
162 | + mapFont["STZhongsong"] = "华文中宋"; | |
163 | + mapFont["STFangsong"] = "华文仿宋"; | |
164 | + mapFont["FZShuTi"] = "方正舒体"; | |
165 | + mapFont["FZYaoti"] = "方正姚体"; | |
166 | + mapFont["STCaiyun"] = "华文彩云"; | |
167 | + mapFont["STHupo"] = "华文琥珀"; | |
168 | + mapFont["STLiti"] = "华文隶书"; | |
169 | + mapFont["STXingkai"] = "华文行楷"; | |
170 | + mapFont["STXinwei"] = "华文新魏"; | |
171 | + mapFont["Microsoft YaHei"] = "微软雅黑"; | |
172 | + mapFont["Microsoft JhengHei"] = "微軟正黑體"; | |
173 | + mapFont["DengXian"] = "等线"; | |
174 | + mapFont["MingLiU"] = "細明體"; | |
175 | + mapFont["MingLiU_HKSCS"] = "細明體_HKSCS"; | |
176 | + mapFont["MingLiU"] = "細明體"; | |
177 | + | |
178 | + std::set<std::string> setFont; | |
179 | + char buff[1000]; | |
180 | + for (int i = 0; fs && i < fs->nfont; ++i) | |
181 | + { | |
182 | + | |
183 | + FcPattern *font = fs->fonts[i]; | |
184 | + FcChar8 *file, *style, *family, *prgname; | |
185 | + if (FcPatternGetString(font, FC_FILE, 0, &file) == FcResultMatch && | |
186 | + FcPatternGetString(font, FC_FAMILY, 0, &family) == FcResultMatch && | |
187 | + FcPatternGetString(font, FC_STYLE, 0, &style) == FcResultMatch) | |
188 | + { | |
189 | + sprintf(buff, "%s", family); | |
190 | + if (setFont.find(buff) == setFont.end()) | |
191 | + { | |
192 | + | |
193 | + setFont.insert(buff); | |
194 | + if (mapFont.find(buff) != mapFont.end()) | |
195 | + { | |
196 | + boost::property_tree::ptree ptNode; | |
197 | + ptNode.put("",buff); | |
198 | + ptRoot.push_back(std::make_pair("",ptNode)); | |
199 | + } | |
200 | + } | |
201 | + } | |
202 | + } | |
203 | + | |
204 | + for (std::set<std::string>::iterator iter = setFont.begin(); | |
205 | + iter != setFont.end(); iter++) | |
206 | + { | |
207 | + if (mapFont.find(*iter) == mapFont.end()) | |
208 | + { | |
209 | + boost::property_tree::ptree ptNode; | |
210 | + ptNode.put("",*iter); | |
211 | + ptRoot.push_back(std::make_pair("",ptNode)); | |
212 | + } | |
213 | + } | |
214 | + | |
215 | + FcFontSetDestroy(fs); | |
216 | + | |
217 | + ptDoc.add_child("value",ptRoot); | |
218 | + std::stringstream stream; | |
219 | + write_json(stream, ptDoc); | |
220 | + std::string responseStr = stream.str(); | |
221 | + context.response()->writeJson(responseStr); | |
222 | + | |
223 | +} | |
224 | + | |
225 | +void DmpVectorMappingApiHandler::getImage(const DmpServerApiContext &context) const | |
226 | +{ | |
227 | + DmpServerParameters params = context.request()->serverParameters(); | |
228 | + std::string name; | |
229 | + params.getValue("name", name); | |
230 | + | |
231 | + std::string imagePath = getFilePath("../symbollib/" + name); | |
232 | + FILE *file = fopen(imagePath.c_str(), "rb"); | |
233 | + | |
234 | + try | |
235 | + { | |
236 | + char buff[1024]; | |
237 | + if (file == 0) | |
238 | + { | |
239 | + context.response()->writeJson("{\"error\":\"open file failed\"}"); | |
240 | + return; | |
241 | + } | |
242 | + | |
243 | + context.response()->removeHeader("Content-Type"); | |
244 | + context.response()->setHeader("Content-Type", "image/png"); | |
245 | + | |
246 | + for (int i = 0; i < 20000; i++) | |
247 | + { | |
248 | + size_t t = fread(buff, 1, sizeof(buff), file); | |
249 | + context.response()->writeContent(buff,t); | |
250 | + | |
251 | + if (t != sizeof(buff)) | |
252 | + break; | |
253 | + } | |
254 | + fclose(file); | |
255 | + return; | |
256 | + } | |
257 | + catch (...) | |
258 | + { | |
259 | + if (file) | |
260 | + fclose(file); | |
261 | + | |
262 | + } | |
263 | + context.response()->writeJson("{\"error\":\"Parameter name is null\"}"); | |
264 | + | |
265 | +} | |
266 | + | |
267 | + | |
268 | +void DmpVectorMappingApiHandler::getImageTypeList(const DmpServerApiContext &context) const | |
269 | +{ | |
270 | + DIR *dirp; | |
271 | + struct dirent *dp; | |
272 | + std::string imagePath = getFilePath("../symbollib"); | |
273 | + dirp = opendir(imagePath.c_str()); | |
274 | + | |
275 | + boost::property_tree::ptree ptDoc; | |
276 | + boost::property_tree::ptree ptRoot; | |
277 | + | |
278 | + if (dirp) | |
279 | + { | |
280 | + while ((dp = readdir(dirp)) != NULL) | |
281 | + { | |
282 | + if (dp->d_name == NULL || dp->d_name[0] == '.') | |
283 | + { | |
284 | + continue; | |
285 | + } | |
286 | + | |
287 | + boost::property_tree::ptree ptDir; | |
288 | + | |
289 | + ptDir.add("name", dp->d_name); | |
290 | + ptRoot.push_back(std::make_pair("",ptDir)); | |
291 | + //ptRoot.add_child("imageType",ptDir); | |
292 | + } | |
293 | + closedir(dirp); | |
294 | + } | |
295 | + else | |
296 | + { | |
297 | + LOGGER_ERROR("not find dir "+ imagePath); | |
298 | + } | |
299 | + | |
300 | + ptDoc.add_child("value",ptRoot); | |
301 | + std::stringstream stream; | |
302 | + write_json(stream, ptDoc); | |
303 | + std::string responseStr = stream.str(); | |
304 | + context.response()->writeJson(responseStr); | |
305 | +} | |
306 | + | |
307 | + void DmpVectorMappingApiHandler::getImageList(const DmpServerApiContext &context) const | |
308 | + { | |
309 | + DmpServerParameters params = context.request()->serverParameters(); | |
310 | + std::string name; | |
311 | + params.getValue("name", name); | |
312 | + | |
313 | + if(name.empty()) | |
314 | + { | |
315 | + context.response()->writeJson("{\"error\":\"Parameter name is null\"}"); | |
316 | + return; | |
317 | + } | |
318 | + | |
319 | + struct dirent *dp; | |
320 | + std::string imagePath = getFilePath("../symbollib/" + name); | |
321 | + DIR *dirp = opendir(imagePath.c_str()); | |
322 | + | |
323 | + boost::property_tree::ptree ptDoc; | |
324 | + boost::property_tree::ptree ptRoot; | |
325 | + | |
326 | + if (dirp) | |
327 | + { | |
328 | + while ((dp = readdir(dirp)) != NULL) | |
329 | + { | |
330 | + boost::property_tree::ptree ptDir; | |
331 | + if (dp->d_name == NULL || dp->d_name[0] == '.') | |
332 | + { | |
333 | + continue; | |
334 | + } | |
335 | + ptDir.add("name", dp->d_name); | |
336 | + ptDir.add("path", ("../symbollib/" + name + "/" + dp->d_name)); | |
337 | + ptRoot.push_back(std::make_pair("",ptDir)); | |
338 | + } | |
339 | + closedir(dirp); | |
340 | + } | |
341 | + else | |
342 | + { | |
343 | + LOGGER_ERROR("not find dir " + imagePath); | |
344 | + } | |
345 | + | |
346 | + ptDoc.add_child("value",ptRoot); | |
347 | + std::stringstream stream; | |
348 | + write_json(stream, ptDoc); | |
349 | + std::string responseStr = stream.str(); | |
350 | + context.response()->writeJson(responseStr); | |
351 | + | |
352 | + } | |
353 | + | |
354 | + std::string DmpVectorMappingApiHandler::getFilePath(const std::string& path) const | |
355 | + { | |
356 | + char sz[300] = {0}; | |
357 | + if (getCurrentFolderPath(sz, sizeof(sz)) > 0) | |
358 | + { | |
359 | + std::string s; | |
360 | + s = sz; | |
361 | + size_t t = s.rfind('/'); | |
362 | + sz[t] = 0; | |
363 | + if (path[0] == '/') | |
364 | + { | |
365 | + return path; | |
366 | + } | |
367 | + int i = 0; | |
368 | + if (path[0] == '.') | |
369 | + { | |
370 | + if (path[1] == '.') | |
371 | + { | |
372 | + i++; | |
373 | + s = sz; | |
374 | + t = s.rfind('/'); | |
375 | + sz[t] = 0; | |
376 | + } | |
377 | + i++; | |
378 | + } | |
379 | + if ((sz[t] == '/' || sz[t] == '\\') && (path[i] == '/' || path[i] == '\\')) | |
380 | + { | |
381 | + i++; | |
382 | + } | |
383 | + | |
384 | + int j = t; | |
385 | + for (j = t; i < path.length(); i++, j++) | |
386 | + { | |
387 | + if (path[i] == '\\') | |
388 | + { | |
389 | + sz[j] = '/'; | |
390 | + } | |
391 | + else | |
392 | + { | |
393 | + sz[j] = path[i]; | |
394 | + } | |
395 | + } | |
396 | + sz[j] = 0; | |
397 | + //strcat(sz, path.c_str()); | |
398 | + return sz; | |
399 | + } | |
400 | + else | |
401 | + return 0; | |
402 | + } | |
403 | + | |
404 | +size_t DmpVectorMappingApiHandler::getCurrentFolderPath(char *processdir, size_t len) const | |
405 | +{ | |
406 | + char *path_end; | |
407 | + if (readlink("/proc/self/exe", processdir, len) <= 0) | |
408 | + return -1; | |
409 | + path_end = strrchr(processdir, '/'); | |
410 | + if (path_end == NULL) | |
411 | + return -1; | |
412 | + ++path_end; | |
413 | + //strcpy(processname, path_end); | |
414 | + *path_end = '\0'; | |
415 | + return (size_t)(path_end - processdir); | |
416 | +} | |
\ No newline at end of file | ... | ... |
1 | +/************************************************************************** | |
2 | +* file: dmpvectormappingapihandler.h | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-27 10:58:13 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | + | |
10 | +#ifndef __dmpvectormappingapihandler_h__ | |
11 | +#define __dmpvectormappingapihandler_h__ | |
12 | + | |
13 | +#include "dmpserverapihandler.h" | |
14 | + | |
15 | + | |
16 | +class DmpVectorMappingApiHandler : public DmpServerApiHandler | |
17 | +{ | |
18 | +public: | |
19 | + DmpVectorMappingApiHandler(); | |
20 | + void HandleRequest(const DmpServerApiContext &context) const override; | |
21 | + //填写正则表达式,来验证对应的url是否符合handler的处理 | |
22 | + //Path: /dmap/api/Vectormapping/{action} | |
23 | + std::string Path() const override { return "/dmap/api/vectormapping/(?<action>[^/]+?)"; } | |
24 | +private: | |
25 | + | |
26 | + void setMapRenderer(const DmpServerApiContext &context) const; //提交符号化 | |
27 | + | |
28 | + void getValueList(const DmpServerApiContext &context) const; //获取数据表列表 | |
29 | + void getmap(const DmpServerApiContext &context) const; // getmap 获取图片 | |
30 | + void getTypefaceList(const DmpServerApiContext &context) const; //获取字体列表 | |
31 | + void getImageTypeList(const DmpServerApiContext &context) const; //获取图片目录列表 | |
32 | + void getImageList(const DmpServerApiContext &context) const; //获取图片列表 | |
33 | + void getImage(const DmpServerApiContext &context) const; //获取图片 | |
34 | + void getDMD(const DmpServerApiContext &context) const; //获取图片 | |
35 | + void getDataTableDetail(const DmpServerApiContext &context) const; //获取数据表信息 | |
36 | +private: | |
37 | + std::string getFilePath(const std::string& path) const; | |
38 | + size_t getCurrentFolderPath(char *processdir, size_t len) const; | |
39 | + | |
40 | +}; | |
41 | + | |
42 | + | |
43 | +#endif // __dmpvectormappingapihandler_h__ | ... | ... |
... | ... | @@ -8,16 +8,18 @@ SET (MAPSERVER_SRCS |
8 | 8 | dmppgsql.cpp |
9 | 9 | dmppgsqlpool.cpp |
10 | 10 | dmppgsqlsourcepools.cpp |
11 | - #wfs/dmpwfs.cpp | |
12 | - #wfs/dmpwfsgetcapabilities.cpp | |
13 | - #wfs/dmpwfsgetfeature.cpp | |
14 | - #wfs/dmpwfsparameters.cpp | |
11 | + wfs/dmpwfs.cpp | |
12 | + wfs/dmpwfsgetcapabilities.cpp | |
13 | + wfs/dmpwfsgetfeature.cpp | |
14 | + wfs/dmpwfsparameters.cpp | |
15 | 15 | wms/dmpwmsrenderer.cpp |
16 | 16 | wms/dmpwms.cpp |
17 | 17 | wms/dmpwmsparameters.cpp |
18 | 18 | wms/dmpwmsgetcapabilities.cpp |
19 | 19 | wms/dmpwmsgetmap.cpp |
20 | 20 | wms/dmpwmsgetfeatureinfo.cpp |
21 | + mapping/dmpmapping.cpp | |
22 | + mapping/dmpeditservice.cpp | |
21 | 23 | ) |
22 | 24 | |
23 | 25 | SET (MAPSERVER_HDRS |
... | ... | @@ -26,16 +28,18 @@ SET (MAPSERVER_HDRS |
26 | 28 | dmppgsql.h |
27 | 29 | dmppgsqlpool.h |
28 | 30 | dmppgsqlsourcepools.h |
29 | - #wfs/dmpwfs.h | |
30 | - #wfs/dmpwfsgetcapabilities.h | |
31 | - #wfs/dmpwfsgetfeature.h | |
32 | - #wfs/dmpwfsparameters.h | |
31 | + wfs/dmpwfs.h | |
32 | + wfs/dmpwfsgetcapabilities.h | |
33 | + wfs/dmpwfsgetfeature.h | |
34 | + wfs/dmpwfsparameters.h | |
33 | 35 | wms/dmpwmsrenderer.h |
34 | 36 | wms/dmpwms.h |
35 | 37 | wms/dmpwmsparameters.h |
36 | 38 | wms/dmpwmsgetcapabilities.h |
37 | 39 | wms/dmpwmsgetmap.h |
38 | 40 | wms/dmpwmsgetfeatureinfo.h |
41 | + mapping/dmpmapping.h | |
42 | + mapping/dmpeditservice.h | |
39 | 43 | ) |
40 | 44 | |
41 | 45 | ######################################################## | ... | ... |
... | ... | @@ -10,6 +10,8 @@ |
10 | 10 | #include <boost/regex.hpp> |
11 | 11 | #include <boost/lexical_cast.hpp> |
12 | 12 | #include "wms/dmpwms.h" |
13 | +#include "wfs/dmpwfs.h" | |
14 | +#include "mapping/dmpmapping.h" | |
13 | 15 | #include "dmpserverresponse.h" |
14 | 16 | |
15 | 17 | namespace mapserver |
... | ... | @@ -19,6 +21,12 @@ DmpMapServer::DmpMapServer() |
19 | 21 | { |
20 | 22 | DmpService* wmsServer = new DmpWms::DmpWMSService(); |
21 | 23 | services_[wmsServer->name()] = wmsServer; |
24 | + | |
25 | + DmpService* wfsServer = new DmpWfs::DmpWFSService(); | |
26 | + services_[wfsServer->name()] = wfsServer; | |
27 | + | |
28 | + DmpService* mappingServer = new DmpMapping::DmpMappingService(); | |
29 | + services_[mappingServer->name()] = mappingServer; | |
22 | 30 | } |
23 | 31 | |
24 | 32 | DmpMapServer::~DmpMapServer() |
... | ... | @@ -73,6 +81,10 @@ void DmpMapServer::executeRequest(DmpServerRequest &request, DmpServerResponse & |
73 | 81 | DmpServerContext context {&request, &response, serverProj}; |
74 | 82 | service->executeRequest(context); |
75 | 83 | } |
84 | + else if(service->name() == "MappingService"){ | |
85 | + DmpServerContext context {&request, &response, nullptr}; | |
86 | + service->executeRequest(context); | |
87 | + } | |
76 | 88 | else { |
77 | 89 | response.writeHtml(htmlstr + "找不到服务\"" + serviceName + "\"</p></body></html>\n"); |
78 | 90 | } | ... | ... |
1 | +/************************************************************************** | |
2 | +* file: dmpeditservice.cpp | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-29 14:32:34 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | +#include "dmpeditservice.h" | |
10 | +#include "dmplogger.h" | |
11 | +#include "dmpserverresponse.h" | |
12 | +#include "dmpserverrequest.h" | |
13 | +#include <boost/property_tree/ptree.hpp> | |
14 | +#include <boost/property_tree/json_parser.hpp> | |
15 | +#include <boost/typeof/typeof.hpp> | |
16 | + | |
17 | +namespace DmpMapping | |
18 | +{ | |
19 | + bool loadService(const DmpServerContext &context, ProjectMap& vectorMappingProjects, const char* data) | |
20 | + { | |
21 | + if(data== nullptr || *data == '\0') | |
22 | + { | |
23 | + LOGGER_ERROR("post 参数错误"); | |
24 | + context.response()->write("{\"status\":\"false\",\"message\":\"post 参数错误!\"}"); | |
25 | + return false; | |
26 | + } | |
27 | + | |
28 | + if(!context.serverProject()) | |
29 | + { | |
30 | + LOGGER_ERROR("加载服务信息失败,服务名称是否错误"); | |
31 | + context.response()->write("{\"status\":\"false\",\"message\":\"加载服务信息失败,服务名称是否错误!\"}"); | |
32 | + return false; | |
33 | + } | |
34 | + | |
35 | + try | |
36 | + { | |
37 | + std::stringstream stream(data); | |
38 | + boost::property_tree::ptree pt; | |
39 | + boost::property_tree::read_json(stream, pt); | |
40 | + | |
41 | + std::string guid = pt.get<std::string>("guid"); | |
42 | + std::string project = pt.get<std::string>("project"); | |
43 | + if(!guid.empty() && !project.empty()) | |
44 | + { | |
45 | + std::string projData; | |
46 | + if (!DmpServerUtils::Base64Decode(project, &projData)) | |
47 | + { | |
48 | + return false; | |
49 | + } | |
50 | + shared_ptr<DmpProject> project(new DmpProject()); | |
51 | + if (!project->Read(projData)) | |
52 | + { | |
53 | + return false; | |
54 | + } | |
55 | + vectorMappingProjects[guid] = project; | |
56 | + context.response()->write("{\"status\":\"true\",\"message\":\"创建编辑服务工作空间成功!\"}"); | |
57 | + } | |
58 | + else | |
59 | + { | |
60 | + LOGGER_ERROR("post 参数错误"); | |
61 | + context.response()->write("{\"status\":\"false\",\"message\":\"post 参数错误!\"}"); | |
62 | + return false; | |
63 | + } | |
64 | + | |
65 | + } | |
66 | + catch (boost::property_tree::ptree_bad_path &e) | |
67 | + { | |
68 | + LOGGER_ERROR(e.what()); | |
69 | + context.response()->write("{\"status\":\"false\",\"message\":\"post 参数错误\"}"); | |
70 | + return false; | |
71 | + } | |
72 | + catch (boost::property_tree::ptree_bad_data &e) | |
73 | + { | |
74 | + LOGGER_ERROR(e.what()); | |
75 | + context.response()->write("{\"status\":\"false\",\"message\":\"post 参数错误\"}"); | |
76 | + return false; | |
77 | + } | |
78 | + return false; | |
79 | + } | |
80 | + | |
81 | + bool editService(const DmpServerContext &context,ProjectMap& vectorMappingProjects, const char* data) | |
82 | + { | |
83 | + if(data== nullptr || *data == '\0') | |
84 | + { | |
85 | + LOGGER_ERROR("post 参数错误"); | |
86 | + context.response()->write("{\"status\":\"false\",\"message\":\"post 参数错误!\"}"); | |
87 | + return false; | |
88 | + } | |
89 | + | |
90 | + if(!context.serverProject()) | |
91 | + { | |
92 | + LOGGER_ERROR("加载服务信息失败,服务名称是否错误"); | |
93 | + context.response()->write("{\"status\":\"false\",\"message\":\"加载服务信息失败,服务名称是否错误!\"}"); | |
94 | + return false; | |
95 | + } | |
96 | + | |
97 | + try | |
98 | + { | |
99 | + std::stringstream stream(data); | |
100 | + boost::property_tree::ptree pt; | |
101 | + boost::property_tree::read_json(stream, pt); | |
102 | + | |
103 | + std::string guid = pt.get<std::string>("guid"); | |
104 | + std::string project = pt.get<std::string>("project"); | |
105 | + if(!guid.empty() && !project.empty()) | |
106 | + { | |
107 | + std::string projData; | |
108 | + if (!DmpServerUtils::Base64Decode(project, &projData)) | |
109 | + { | |
110 | + return false; | |
111 | + } | |
112 | + shared_ptr<DmpProject> project(new DmpProject()); | |
113 | + if (!project->Read(projData)) | |
114 | + { | |
115 | + return false; | |
116 | + } | |
117 | + vectorMappingProjects[guid] = project; | |
118 | + context.response()->write("{\"status\":\"true\",\"message\":\"创建编辑服务工作空间成功!\"}"); | |
119 | + } | |
120 | + else | |
121 | + { | |
122 | + LOGGER_ERROR("post 参数错误"); | |
123 | + context.response()->write("{\"status\":\"false\",\"message\":\"post 参数错误!\"}"); | |
124 | + return false; | |
125 | + } | |
126 | + | |
127 | + } | |
128 | + catch (boost::property_tree::ptree_bad_path &e) | |
129 | + { | |
130 | + LOGGER_ERROR(e.what()); | |
131 | + context.response()->write("{\"status\":\"false\",\"message\":\"post 参数错误\"}"); | |
132 | + return false; | |
133 | + } | |
134 | + catch (boost::property_tree::ptree_bad_data &e) | |
135 | + { | |
136 | + LOGGER_ERROR(e.what()); | |
137 | + context.response()->write("{\"status\":\"false\",\"message\":\"post 参数错误\"}"); | |
138 | + return false; | |
139 | + } | |
140 | + return false; | |
141 | + } | |
142 | + | |
143 | +} | |
\ No newline at end of file | ... | ... |
1 | +/************************************************************************** | |
2 | +* file: dmpeditservice.h | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-29 14:32:27 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | + | |
10 | +#ifndef __dmpeditservice_h__ | |
11 | +#define __dmpeditservice_h__ | |
12 | +#include <map> | |
13 | +#include <memory> | |
14 | +#include <functional> | |
15 | +#include "dmpproject.h" | |
16 | +#include "dmpservercontext.h" | |
17 | +#include "dmppgsqlsourcepools.h" | |
18 | + | |
19 | +namespace DmpMapping | |
20 | +{ | |
21 | + typedef std::map<std::string, std::shared_ptr<DmpProject>> ProjectMap; | |
22 | + | |
23 | + bool loadService(const DmpServerContext &context,ProjectMap& vectorMappingProjects, const char* data); | |
24 | + | |
25 | + | |
26 | + bool editService(const DmpServerContext &context,ProjectMap& vectorMappingProjects, const char* data); | |
27 | + | |
28 | +} | |
29 | + | |
30 | + | |
31 | +#endif // __dmpeditservice_h__ | ... | ... |
1 | +/************************************************************************** | |
2 | +* file: dmpgetdatatabledetail.cpp | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-29 13:39:55 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | +#include "dmpgetdatatabledetail.h" | |
10 | +#include "dmpserverresponse.h" | |
11 | +#include "dmpserverrequest.h" | |
12 | +#include "dmpserverproject.h" | |
13 | + | |
14 | +namespace DmpMapping | |
15 | +{ | |
16 | + bool getDataTableDetail(const DmpServerContext &context,const char* data); | |
17 | +} | |
\ No newline at end of file | ... | ... |
1 | +/************************************************************************** | |
2 | +* file: dmpgetdatatabledetail.h | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-29 13:39:50 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | + | |
10 | +#ifndef __dmpgetdatatabledetail_h__ | |
11 | +#define __dmpgetdatatabledetail_h__ | |
12 | + | |
13 | +#include <string> | |
14 | + | |
15 | +namespace DmpMapping | |
16 | +{ | |
17 | + bool getDataTableDetail(const DmpServerContext &context,const char* data); | |
18 | +} | |
19 | + | |
20 | +#endif // __dmpgetdatatabledetail_h__ | ... | ... |
1 | +/************************************************************************** | |
2 | +* file: dmpmapping.cpp | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-29 10:49:10 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | + | |
10 | +#include <iostream> | |
11 | +#include <string> | |
12 | +#include "dmpservice.h" | |
13 | +#include <boost/dll/alias.hpp> // for BOOST_DLL_ALIAS | |
14 | +#include <boost/filesystem.hpp> | |
15 | +#include <boost/function.hpp> | |
16 | +#include <boost/make_shared.hpp> | |
17 | +#include "dmpserverresponse.h" | |
18 | +#include "dmplogger.h" | |
19 | +#include "../wms/dmpwmsgetmap.h" | |
20 | +#include "dmpmapping.h" | |
21 | +using namespace std; | |
22 | + | |
23 | +namespace DmpMapping | |
24 | +{ | |
25 | + DmpMappingService::DmpMappingService() | |
26 | + { | |
27 | + LOGGER_DEBUG("Constructing WmsService"); | |
28 | + } | |
29 | + | |
30 | + DmpMappingService::~DmpMappingService() | |
31 | + { | |
32 | + LOGGER_DEBUG("Destructing WmsService"); | |
33 | + } | |
34 | + | |
35 | + void DmpMappingService::executeRequest(const DmpServerContext &context) | |
36 | + { | |
37 | + LOGGER_DEBUG("Destructing WmsService"); | |
38 | + | |
39 | + const char* data = (char*)(context.request()->GetData()); | |
40 | + | |
41 | + | |
42 | + | |
43 | + } | |
44 | +} | |
45 | + | ... | ... |
1 | +/************************************************************************** | |
2 | +* file: dmpmapping.h | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-29 10:49:16 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | +#ifndef __dmpmapping_h__ | |
10 | +#define __dmpmapping_h__ | |
11 | +#include <string> | |
12 | +#include <string> | |
13 | +#include "dmpeditservice.h" | |
14 | +#include "dmpservice.h" | |
15 | +namespace DmpMapping | |
16 | +{ | |
17 | + class DmpMappingService : public DmpService | |
18 | + { | |
19 | + public: | |
20 | + DmpMappingService(); | |
21 | + ~DmpMappingService(); | |
22 | + std::string name() const override { return std::string("MappingService"); } | |
23 | + std::string version() const override { return std::string("1.3.0"); } | |
24 | + std::string description() const override { return std::string("在线配图服务"); } | |
25 | + bool allowMethod(DmpServerRequest::Method method) const override { return method == DmpServerRequest::GET_METHOD; } | |
26 | + void executeRequest(const DmpServerContext &context) override; | |
27 | + private: | |
28 | + | |
29 | + //存储工程文档实例 | |
30 | + ProjectMap vectorMappingProjects_; | |
31 | + }; | |
32 | +} | |
33 | + | |
34 | +#endif // __dmpmapping_h__ | ... | ... |
1 | +/************************************************************************** | |
2 | +* file: dmpsqlfactory.cpp | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-27 20:31:37 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | +#include "dmpsqlfactory.h" | |
10 | + | |
11 | +namespace DmpWfs | |
12 | +{ | |
13 | + | |
14 | + DmpSqlFactory::DmpSqlFactory(void) | |
15 | + { | |
16 | + count_ = 1000; | |
17 | + startIndex_ = 0; | |
18 | + } | |
19 | + | |
20 | + DmpSqlFactory::~DmpSqlFactory(void) | |
21 | + { | |
22 | + } | |
23 | + | |
24 | + void DmpSqlFactory::setStartIndexCount(int startIndex, int count, const std::string& resultType) | |
25 | + { | |
26 | + if (count > 0) | |
27 | + { | |
28 | + this->count_ = count; | |
29 | + } | |
30 | + | |
31 | + if (startIndex >=0) | |
32 | + { | |
33 | + this->startIndex_ = startIndex; | |
34 | + } | |
35 | + this->resultType_ = resultType; | |
36 | + } | |
37 | + | |
38 | + void DmpSqlFactory::appendCondition(char *c) | |
39 | + { | |
40 | + if (condition.size() == 0) | |
41 | + { | |
42 | + condition = c; | |
43 | + } | |
44 | + else | |
45 | + { | |
46 | + condition += " and "; | |
47 | + condition += c; | |
48 | + } | |
49 | + } | |
50 | + | |
51 | + void DmpSqlFactory::appendCondition(std::string &c) | |
52 | + { | |
53 | + if (condition.size() == 0) | |
54 | + { | |
55 | + condition = c; | |
56 | + } | |
57 | + else | |
58 | + { | |
59 | + condition += " and "; | |
60 | + condition += c; | |
61 | + } | |
62 | + } | |
63 | + | |
64 | + std::string DmpSqlFactory::getSql() | |
65 | + { | |
66 | + std::string sql = "select "; | |
67 | + if (resultType_ == "hits") | |
68 | + { | |
69 | + sql += "count(*) as count"; | |
70 | + } | |
71 | + else | |
72 | + { | |
73 | + if (this->prop.size() == 0) | |
74 | + { | |
75 | + sql += "*"; | |
76 | + } | |
77 | + else | |
78 | + sql += this->prop; | |
79 | + } | |
80 | + sql += " from \""; | |
81 | + sql += this->table; | |
82 | + sql += "\" where "; | |
83 | + if (this->condition.size() == 0) | |
84 | + { | |
85 | + sql += "1=1"; | |
86 | + } | |
87 | + else | |
88 | + { | |
89 | + sql += this->condition; | |
90 | + } | |
91 | + if (this->order.size() > 0) | |
92 | + { | |
93 | + sql += this->order; | |
94 | + } | |
95 | + | |
96 | + if (count_ <= 0) | |
97 | + { | |
98 | + count_ = 1000; | |
99 | + } | |
100 | + if (count_ > 0 || startIndex_ > 0) | |
101 | + { | |
102 | + char sz[100]; | |
103 | + sprintf(sz, " limit %ld offset %ld", count_, startIndex_); | |
104 | + sql += sz; | |
105 | + } | |
106 | + return sql; | |
107 | + } | |
108 | + | |
109 | +} | |
\ No newline at end of file | ... | ... |
1 | +/************************************************************************** | |
2 | +* file: dmpsqlfactory.h | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-27 20:31:30 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | + | |
10 | +#ifndef __dmpsqlfactory_h__ | |
11 | +#define __dmpsqlfactory_h__ | |
12 | +#include <string> | |
13 | +#include <string.h> | |
14 | +namespace DmpWfs | |
15 | +{ | |
16 | + class DmpSqlFactory | |
17 | + { | |
18 | + public: | |
19 | + DmpSqlFactory(void); | |
20 | + ~DmpSqlFactory(void); | |
21 | + | |
22 | + void setStartIndexCount(int startIndex, int count, const std::string &resultType); | |
23 | + void appendCondition(std::string &c); | |
24 | + void appendCondition(char *c); | |
25 | + std::string getSql(); | |
26 | + | |
27 | + private: | |
28 | + std::string prop; | |
29 | + std::string condition; | |
30 | + std::string order; | |
31 | + std::string table; | |
32 | + | |
33 | + std::string resultType_; | |
34 | + int startIndex_; | |
35 | + int count_; | |
36 | + }; | |
37 | +} | |
38 | + | |
39 | +#endif // __dmpsqlfactory_h__ | ... | ... |
... | ... | @@ -14,61 +14,48 @@ |
14 | 14 | #include <boost/filesystem.hpp> |
15 | 15 | #include <boost/function.hpp> |
16 | 16 | #include <boost/make_shared.hpp> |
17 | +#include "dmpserverresponse.h" | |
18 | +#include "dmpwfs.h" | |
19 | +#include "dmplogger.h" | |
20 | +#include "dmpwfsparameters.h" | |
21 | +#include "dmpwfsgetcapabilities.h" | |
22 | +#include "dmpwfsgetfeature.h" | |
17 | 23 | using namespace std; |
18 | 24 | |
19 | 25 | namespace DmpWfs |
20 | 26 | { |
21 | - class DmpWFSService : public DmpService | |
22 | - { | |
23 | - public: | |
24 | - DmpWFSService() { | |
25 | - std::cout << "Constructing WfsService" << std::endl; | |
26 | - } | |
27 | - | |
28 | - ~DmpWFSService() { | |
29 | - std::cout << "Destructing WfsService" << std::endl; | |
30 | - } | |
31 | - | |
32 | - string name() const override { return string("WFSService"); } | |
33 | - string version() const override { return string("1.0.0"); } | |
34 | - string description() const override { return string("WFS服务"); } | |
35 | - bool allowMethod(DmpServerRequest::Method method) const override | |
36 | - { | |
37 | - return method == DmpServerRequest::GET_METHOD; | |
38 | - } | |
39 | - | |
40 | - void executeRequest(const DmpServerRequest &request, DmpServerResponse &response) override | |
41 | - { | |
42 | - std::string url = request.url(); | |
43 | - | |
44 | - response.Write("hello, wfs"); | |
45 | - } | |
46 | - | |
47 | - // bool Register(DmpServiceComposite* service_comp) override | |
48 | - // { | |
49 | - // return false; | |
50 | - // } | |
51 | - | |
52 | - }; | |
53 | - | |
54 | 27 | //实际中,WebGIS服务器针对这些功能并不是必须全部实现,而是实现全部或部分。 |
55 | 28 | //因此,根据依据这些功能的支持与否,可以将WFS分为3类: |
56 | 29 | //Basic WFS —— 必须支持GetCapabilities、DescribeFeature Type、GetFeature功能 |
57 | 30 | //XLink WFS —— 必须在Basic WFS基础上加上GetGmlObject操作 |
58 | 31 | //Transaction WFS —— 也称为WFS-T,必须在Basic WFS基础上加上Transaction功能以及支持编辑数据,另外也可以加上GetGmlObject或LockFeature功能 |
59 | - class DmpWfsModule : public DmpServiceModule | |
32 | + DmpWFSService::DmpWFSService() | |
33 | + { | |
34 | + LOGGER_DEBUG("Constructing WmsService"); | |
35 | + } | |
36 | + | |
37 | + DmpWFSService::~DmpWFSService() | |
60 | 38 | { |
61 | - public: | |
62 | - void registerSelf(DmpServerRegistry ®istry) override | |
63 | - { | |
64 | - cout<<"WFSModule::registerSelf called" <<endl; | |
65 | - registry.registerServer(make_shared<DmpWfs::DmpWFSService>()); | |
66 | - } | |
67 | - }; | |
39 | + LOGGER_DEBUG("Destructing WmsService"); | |
40 | + } | |
68 | 41 | |
69 | - shared_ptr<DmpServiceModule> Create() | |
42 | + void DmpWFSService::executeRequest(const DmpServerContext &context) | |
70 | 43 | { |
71 | - return make_shared<DmpWfsModule>(); | |
44 | + const DmpWfsParameters params(context.request()->serverParameters()); | |
45 | + const DmpProject* project = context.serverProject()->project(); | |
46 | + const std::string request = params.Request(); | |
47 | + if (request.empty()) | |
48 | + { | |
49 | + context.response()->writeHtml("wms,Operation is null"); | |
50 | + } | |
51 | + else if(boost::iequals(request, "getcapabilities")) | |
52 | + { | |
53 | + writeGetCapabilities(context,params, project); | |
54 | + } | |
55 | + else if(boost::iequals(request, "getmap")) | |
56 | + { | |
57 | + writeGetFeature(context,params, project); | |
58 | + } | |
72 | 59 | } |
73 | 60 | } |
74 | -BOOST_DLL_ALIAS(DmpWfs::Create, service_module) | |
61 | + | ... | ... |
... | ... | @@ -8,12 +8,12 @@ |
8 | 8 | ***************************************************************************/ |
9 | 9 | |
10 | 10 | #ifndef __dmpwfs_h__ |
11 | -#define __dmpwm]fs_h__ | |
11 | +#define __dmpwfs_h__ | |
12 | 12 | #include <string> |
13 | 13 | #include "dmpservice.h" |
14 | 14 | #include "dmpwfsparameters.h" |
15 | 15 | |
16 | -namespace DmpWms | |
16 | +namespace DmpWfs | |
17 | 17 | { |
18 | 18 | class DmpWFSService : public DmpService |
19 | 19 | { | ... | ... |
1 | +/************************************************************************** | |
2 | +* file: dmpwfsfilter.cpp | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-28 11:21:25 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | +#include "dmpwfsfilter.h" | |
10 | +namespace DmpWfs | |
11 | +{ | |
12 | + | |
13 | + dmpwfsfilter::dmpwfsfilter(/* args */) | |
14 | + { | |
15 | + } | |
16 | + | |
17 | + dmpwfsfilter::~dmpwfsfilter() | |
18 | + { | |
19 | + } | |
20 | +} | |
\ No newline at end of file | ... | ... |
1 | +/************************************************************************** | |
2 | +* file: dmpwfsfilter.h | |
3 | + | |
4 | +* Author: qingxiongf | |
5 | +* Date: 2021-12-28 11:21:20 | |
6 | +* Email: qingxiongf@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | + | |
10 | +#ifndef __dmpwfsfilter_h__ | |
11 | +#define __dmpwfsfilter_h__ | |
12 | + | |
13 | +namespace DmpWfs | |
14 | +{ | |
15 | + class dmpwfsfilter | |
16 | + { | |
17 | + public: | |
18 | + dmpwfsfilter(/* args */); | |
19 | + ~dmpwfsfilter(); | |
20 | + private: | |
21 | + /* data */ | |
22 | + }; | |
23 | + | |
24 | + | |
25 | +} | |
26 | + | |
27 | +#endif // __dmpwfsfilter_h__ | ... | ... |
... | ... | @@ -11,21 +11,21 @@ |
11 | 11 | #include "dmpserverrequest.h" |
12 | 12 | #include "dmpserverproject.h" |
13 | 13 | #include "dmpvectorlayer.h" |
14 | - | |
14 | +#include "dmpserverproject.h" | |
15 | 15 | |
16 | 16 | namespace DmpWfs |
17 | 17 | { |
18 | 18 | void writeGetCapabilities( const DmpServerContext &context, const DmpWfsParameters& params, |
19 | 19 | const DmpProject* project, bool projectSettings) |
20 | 20 | { |
21 | - std::string serviceName = context.serverProject()->name(); | |
22 | - std::string serviceTitle = context.serverProject()->title(); | |
23 | - if(serviceTitle.empty()) serviceTitle = serviceName; | |
21 | + std::string name = context.serverProject()->name(); | |
22 | + std::string title = context.serverProject()->title(); | |
23 | + if(title.empty()) title = name; | |
24 | 24 | |
25 | 25 | std::string version = params.Version(); |
26 | 26 | std::string hrefUrl; |
27 | 27 | char char_hrefUrl[1024] = {0}; |
28 | - std::string domain = context.request()->domain(); | |
28 | + std::string domain = context.request()->domain(); | |
29 | 29 | std::string port = context.request()->port(); |
30 | 30 | if(port == "80" || port =="") |
31 | 31 | { |
... | ... | @@ -37,7 +37,7 @@ namespace DmpWfs |
37 | 37 | } |
38 | 38 | hrefUrl = char_hrefUrl; |
39 | 39 | // hrefUrl = "http://172.26.40.51:8821/?mapService=test"; |
40 | - std::shared_ptr<boost::property_tree::ptree> doc = getCapabilities(project, version,hrefUrl,serviceName,serviceTitle,projectSettings); | |
40 | + std::shared_ptr<boost::property_tree::ptree> doc = getCapabilities(project, name,title, version,hrefUrl, projectSettings); | |
41 | 41 | |
42 | 42 | std::stringstream stream; |
43 | 43 | write_xml(stream, *doc.get()); |
... | ... | @@ -52,7 +52,7 @@ namespace DmpWfs |
52 | 52 | |
53 | 53 | |
54 | 54 | std::shared_ptr<boost::property_tree::ptree> getCapabilities( const DmpProject* project, |
55 | - const std::string &serviceName, const std::string &serviceTitle, | |
55 | + const std::string &name, const std::string &title, | |
56 | 56 | const std::string &version, const std::string &hrefUrl, |
57 | 57 | bool projectSettings ) |
58 | 58 | { |
... | ... | @@ -69,10 +69,10 @@ namespace DmpWfs |
69 | 69 | xmlRoot.add("<xmlattr>.updateSequence", "0"); |
70 | 70 | |
71 | 71 | boost::property_tree::ptree ptService; |
72 | - ptService.add("Name", serviceName); | |
73 | - ptService.add("Title", serviceTitle); | |
72 | + ptService.add("Name", name); | |
73 | + ptService.add("Title", title); | |
74 | 74 | ptService.add("Abstract", "dmap wfs service"); |
75 | - ptService.add("Keywords", "WFS,DMAP,"+ serviceName ); | |
75 | + ptService.add("Keywords", "WFS,DMAP,"+ name ); | |
76 | 76 | ptService.add("OnlineResource", hrefUrl); |
77 | 77 | ptService.add("Fees","none"); |
78 | 78 | ptService.add("AccessConstraints","none"); | ... | ... |
1 | -/************************************************************************** | |
2 | -* file: dmpwfsgetcapabilities.cpp | |
3 | - | |
4 | -* Author: qingxiongf | |
5 | -* Date: 2021-12-22 14:04:56 | |
6 | -* Email: qingxiongf@chinadci.com | |
7 | -* copyright: 广州城市信息研究所有限公司 | |
8 | -***************************************************************************/ | |
9 | -#include "dmpwfsgetcapabilities.h" | |
10 | -#include "dmpserverresponse.h" | |
11 | -#include "dmpserverrequest.h" | |
12 | -#include "dmpserverproject.h" | |
13 | -#include "dmpvectorlayer.h" | |
14 | - | |
15 | - | |
16 | -namespace DmpWfs | |
17 | -{ | |
18 | - void writeGetCapabilities( const DmpServerContext &context, const DmpWfsParameters& params, | |
19 | - const DmpProject* project, bool projectSettings) | |
20 | - { | |
21 | - std::string serviceName = context.serverProject()->name(); | |
22 | - std::string serviceTitle = context.serverProject()->title(); | |
23 | - if(serviceTitle.empty()) serviceTitle = serviceName; | |
24 | - | |
25 | - std::string version = params.Version(); | |
26 | - std::string hrefUrl; | |
27 | - char char_hrefUrl[1024] = {0}; | |
28 | - std::string domain = context.request()->domain(); | |
29 | - std::string port = context.request()->port(); | |
30 | - if(port == "80" || port =="") | |
31 | - { | |
32 | - sprintf(char_hrefUrl, "http://%s%s", domain.c_str(), context.request()->path().c_str()); | |
33 | - } | |
34 | - else | |
35 | - { | |
36 | - sprintf(char_hrefUrl, "http://%s:%s%s", domain.c_str(),port.c_str(), context.request()->path().c_str()); | |
37 | - } | |
38 | - hrefUrl = char_hrefUrl; | |
39 | - // hrefUrl = "http://172.26.40.51:8821/?mapService=test"; | |
40 | - std::shared_ptr<boost::property_tree::ptree> doc = getCapabilities(project, version,hrefUrl,serviceName,serviceTitle,projectSettings); | |
41 | - | |
42 | - std::stringstream stream; | |
43 | - write_xml(stream, *doc.get()); | |
44 | - std::string xml; | |
45 | - xml = stream.str(); | |
46 | - | |
47 | - // DmpServerResponse* response = context.response(); | |
48 | - context.response()->removeHeader("Content-Type"); | |
49 | - context.response()->setHeader("Content-Type", "text/xml;charset=utf-8"); | |
50 | - context.response()->write(xml); | |
51 | - } | |
52 | - | |
53 | - | |
54 | - std::shared_ptr<boost::property_tree::ptree> getCapabilities( const DmpProject* project, | |
55 | - const std::string &serviceName, const std::string &serviceTitle, | |
56 | - const std::string &version, const std::string &hrefUrl, | |
57 | - bool projectSettings ) | |
58 | - { | |
59 | - std::shared_ptr<boost::property_tree::ptree> xmlRootDoc(new boost::property_tree::ptree()); | |
60 | - boost::property_tree::ptree xmlRoot; | |
61 | - std::string rootname; | |
62 | - | |
63 | - rootname = "WFS_Capabilities"; | |
64 | - xmlRoot.add("<xmlattr>.xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance"); | |
65 | - xmlRoot.add("<xmlattr>.xmlns","http://www.opengis.net/wfs"); | |
66 | - xmlRoot.add("<xmlattr>.xmlns:sld","http://www.opengis.net/sld"); | |
67 | - xmlRoot.add("<xmlattr>.xsi:schemaLocation","http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-capabilities.xsd"); | |
68 | - xmlRoot.add("<xmlattr>.version", version); | |
69 | - xmlRoot.add("<xmlattr>.updateSequence", "0"); | |
70 | - | |
71 | - boost::property_tree::ptree ptService; | |
72 | - ptService.add("Name", serviceName); | |
73 | - ptService.add("Title", serviceTitle); | |
74 | - ptService.add("Abstract", "dmap wfs service"); | |
75 | - ptService.add("Keywords", "WFS,DMAP,"+ serviceName ); | |
76 | - ptService.add("OnlineResource", hrefUrl); | |
77 | - ptService.add("Fees","none"); | |
78 | - ptService.add("AccessConstraints","none"); | |
79 | - xmlRoot.add_child("Service",ptService); | |
80 | - | |
81 | - boost::property_tree::ptree ptCapability; | |
82 | - addCapabilitiesRequest(ptCapability,hrefUrl); | |
83 | - xmlRoot.add_child("Capability",ptCapability); | |
84 | - | |
85 | - boost::property_tree::ptree ptFeatureTypeList; | |
86 | - addFeatureTypeList(ptFeatureTypeList,project); | |
87 | - xmlRoot.add_child("FeatureTypeList",ptFeatureTypeList); | |
88 | - | |
89 | - boost::property_tree::ptree ptFilter; | |
90 | - addFilterCapabilities(ptFilter,hrefUrl); | |
91 | - xmlRoot.add_child("ogc:Filter_Capabilities",ptFilter); | |
92 | - | |
93 | - xmlRootDoc->add_child(rootname,xmlRoot); | |
94 | - return xmlRootDoc; | |
95 | - | |
96 | - } | |
97 | - | |
98 | - void addCapabilitiesRequest(boost::property_tree::ptree &pt, const std::string &hrefUrl) | |
99 | - { | |
100 | - boost::property_tree::ptree ptRequest; | |
101 | - | |
102 | - boost::property_tree::ptree ptGetCapabilities; | |
103 | - addCapabilitiesRequest_DCPType(ptGetCapabilities, hrefUrl, "Get"); | |
104 | - addCapabilitiesRequest_DCPType(ptGetCapabilities, hrefUrl, "Post"); | |
105 | - ptRequest.add_child("GetCapabilities", ptGetCapabilities); | |
106 | - | |
107 | - boost::property_tree::ptree ptDescribeFeatureType; | |
108 | - boost::property_tree::ptree ptSchemaDescriptionLanguage; | |
109 | - ptSchemaDescriptionLanguage.add("XMLSCHEMA",""); | |
110 | - ptDescribeFeatureType.add_child("SchemaDescriptionLanguage",ptSchemaDescriptionLanguage); | |
111 | - addCapabilitiesRequest_DCPType(ptDescribeFeatureType, hrefUrl, "Get"); | |
112 | - addCapabilitiesRequest_DCPType(ptDescribeFeatureType, hrefUrl, "Post"); | |
113 | - ptRequest.add_child("DescribeFeatureType", ptDescribeFeatureType); | |
114 | - | |
115 | - boost::property_tree::ptree ptGetFeature; | |
116 | - boost::property_tree::ptree ptResultFormat; | |
117 | - ptResultFormat.add("GML2",""); | |
118 | - ptResultFormat.add("GML3",""); | |
119 | - ptResultFormat.add("GeoJSON",""); | |
120 | - ptGetFeature.add_child("ResultFormat",ptResultFormat); | |
121 | - addCapabilitiesRequest_DCPType(ptGetFeature, hrefUrl, "Get"); | |
122 | - addCapabilitiesRequest_DCPType(ptGetFeature, hrefUrl, "Post"); | |
123 | - ptRequest.add_child("GetFeature", ptGetFeature); | |
124 | - | |
125 | - boost::property_tree::ptree ptTransaction; | |
126 | - addCapabilitiesRequest_DCPType(ptTransaction, hrefUrl, "Post"); | |
127 | - ptRequest.add_child("Transaction", ptTransaction); | |
128 | - | |
129 | - pt.add_child("Request", ptRequest); | |
130 | - return; | |
131 | - } | |
132 | - | |
133 | - void addCapabilitiesRequest_DCPType(boost::property_tree::ptree &pt, const std::string &hrefUrl, std::string method) | |
134 | - { | |
135 | - boost::property_tree::ptree pt_dcpType; | |
136 | - boost::property_tree::ptree pt_http; | |
137 | - boost::property_tree::ptree pt_method; | |
138 | - | |
139 | - pt_method.add("<xmlattr>.onlineResource", hrefUrl); | |
140 | - | |
141 | - pt_http.add_child(method, pt_method); | |
142 | - pt_dcpType.add_child("HTTP", pt_http); | |
143 | - pt.add_child("DCPType", pt_dcpType); | |
144 | - } | |
145 | - | |
146 | - void addFeatureTypeList(boost::property_tree::ptree &pt,const DmpProject *project) | |
147 | - { | |
148 | - boost::property_tree::ptree ptOperations; | |
149 | - ptOperations.add("Query",""); | |
150 | - pt.add_child("Operations", ptOperations); | |
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++) | |
155 | - { | |
156 | - DmpVectorLayer *layer = (DmpVectorLayer *)iter->second; | |
157 | - std::string source = layer->source(); | |
158 | - shared_ptr<DmpPgsql> pPgsqlConn = DmpPgsqlSourcePools::get_instance()->GetPgsqlConn(layer->source()); | |
159 | - if (pPgsqlConn != nullptr) | |
160 | - { | |
161 | - boost::property_tree::ptree ptFeatureType; | |
162 | - std::string srs = "EPSG:" + std::__cxx11::to_string(project->crs().srid()); | |
163 | - ptFeatureType.add("<xmlattr>.id", i); | |
164 | - ptFeatureType.add("Name", layer->name()); | |
165 | - ptFeatureType.add("Title", layer->title()); | |
166 | - ptFeatureType.add("DisplayColumn", ""); | |
167 | - ptFeatureType.add("Geometry", "点"); | |
168 | - ptFeatureType.add("GeometryColumn", layer->geom()); | |
169 | - ptFeatureType.add("SRS", srs); | |
170 | - | |
171 | - boost::property_tree::ptree ptBoundingbox; | |
172 | - ptBoundingbox.add("<xmlattr>.CRS", srs); | |
173 | - if (boost::iequals(srs, "CRS:84") || boost::iequals(srs, "EPSG:4326")) | |
174 | - { | |
175 | - ptBoundingbox.add("<xmlattr>.miny", layer->extent().xmin()); | |
176 | - ptBoundingbox.add("<xmlattr>.maxy", layer->extent().xmax()); | |
177 | - ptBoundingbox.add("<xmlattr>.minx", layer->extent().ymin()); | |
178 | - ptBoundingbox.add("<xmlattr>.maxx", layer->extent().ymax()); | |
179 | - } | |
180 | - else | |
181 | - { | |
182 | - ptBoundingbox.add("<xmlattr>.minx", layer->extent().xmin()); | |
183 | - ptBoundingbox.add("<xmlattr>.maxx", layer->extent().xmax()); | |
184 | - ptBoundingbox.add("<xmlattr>.miny", layer->extent().ymin()); | |
185 | - ptBoundingbox.add("<xmlattr>.maxy", layer->extent().ymax()); | |
186 | - } | |
187 | - ptFeatureType.add_child("LatLongBoundingBox", ptBoundingbox); | |
188 | - | |
189 | - boost::property_tree::ptree ptFields; | |
190 | - for (; pPgsqlConn->next();) | |
191 | - { | |
192 | - std::string fieldname = pPgsqlConn->getString(0); | |
193 | - std::string typeString = pPgsqlConn->getString(1); | |
194 | - std::string aliasName = ""; | |
195 | - std::string type = ""; | |
196 | - int typeInt = PGFieldType::VarCharFieldType; | |
197 | - if (layer->geom() == fieldname) | |
198 | - { | |
199 | - typeString = "geometry"; | |
200 | - typeInt = PGFieldType::ShapeFieldType; | |
201 | - } | |
202 | - else if (typeString == "integer") | |
203 | - { | |
204 | - typeInt = PGFieldType::IntFieldType; | |
205 | - } | |
206 | - else if (typeString == "bigint") | |
207 | - { | |
208 | - typeInt = PGFieldType::BigIntFieldType; | |
209 | - } | |
210 | - else if (typeString == "double precision" || typeString == "real" || typeString == "numeric") | |
211 | - { | |
212 | - typeInt = PGFieldType::DoubleFieldType; | |
213 | - } | |
214 | - else if (typeString == "character varying" || typeString == "text") | |
215 | - { | |
216 | - typeInt = PGFieldType::VarCharFieldType; | |
217 | - } | |
218 | - else if (typeString == "geometry") | |
219 | - { | |
220 | - typeInt = PGFieldType::ShapeFieldType; | |
221 | - } | |
222 | - else if (typeString == "bytea") | |
223 | - { | |
224 | - typeInt = PGFieldType::ByteaFieldType; | |
225 | - } | |
226 | - else if (typeString == "timestamp without time zone") | |
227 | - { | |
228 | - typeInt = PGFieldType::TimestampWithoutTimeZone; | |
229 | - } | |
230 | - | |
231 | - switch (typeInt) | |
232 | - { | |
233 | - case PGFieldType::IntFieldType: | |
234 | - typeString = "integer"; | |
235 | - break; | |
236 | - case PGFieldType::BigIntFieldType: | |
237 | - case PGFieldType::DoubleFieldType: | |
238 | - typeString = "double"; | |
239 | - break; | |
240 | - case PGFieldType::VarCharFieldType: | |
241 | - typeString = "string"; | |
242 | - break; | |
243 | - default: | |
244 | - break; | |
245 | - } | |
246 | - boost::property_tree::ptree ptField; | |
247 | - ptField.add("<xmlattr>.name", fieldname); | |
248 | - ptField.add("<xmlattr>.aliasName", aliasName); | |
249 | - ptField.add("<xmlattr>.type", "xsd:" + typeString); | |
250 | - ptField.add("<xmlattr>.minOccurs", "0"); | |
251 | - ptField.add("<xmlattr>.maxOccurs", "1"); | |
252 | - ptFields.add_child("Field", ptField); | |
253 | - } | |
254 | - ptFeatureType.add_child("Fields", ptFields); | |
255 | - pt.add_child("FeatureType", ptFeatureType); | |
256 | - } | |
257 | - | |
258 | - } | |
259 | - } | |
260 | - | |
261 | - | |
262 | - void addFilterCapabilities(boost::property_tree::ptree &pt,const std::string &hrefUrl) | |
263 | - { | |
264 | - boost::property_tree::ptree ptFilterCapabilities; | |
265 | - | |
266 | - boost::property_tree::ptree ptSpatialCapabilities; | |
267 | - boost::property_tree::ptree ptSpatialOperators; | |
268 | - ptSpatialOperators.add("ogc:BBOX",""); | |
269 | - ptSpatialCapabilities.add_child("ogc:Spatial_Operators",ptSpatialOperators); | |
270 | - ptFilterCapabilities.add_child("ogc:Spatial_Capabilities", ptSpatialCapabilities); | |
271 | - | |
272 | - | |
273 | - boost::property_tree::ptree ptScalarCapabilities; | |
274 | - boost::property_tree::ptree ptComparisonOperators; | |
275 | - ptComparisonOperators.add("ogc:Simple_Comparisons",""); | |
276 | - ptScalarCapabilities.add_child("ogc:Comparison_Operators",ptComparisonOperators); | |
277 | - ptFilterCapabilities.add_child("ogc:Filter_Capabilities", ptScalarCapabilities); | |
278 | - | |
279 | - pt.add_child("ogc:Filter_Capabilities", ptFilterCapabilities); | |
280 | - } | |
281 | - | |
282 | - | |
283 | -} | |
\ No newline at end of file |
... | ... | @@ -41,7 +41,7 @@ namespace DmpWfs |
41 | 41 | * \returns GetCapabilities XML document |
42 | 42 | */ |
43 | 43 | std::shared_ptr<boost::property_tree::ptree> getCapabilities( const DmpProject* project, |
44 | - const std::string &serviceName, const std::string &serviceTitle, | |
44 | + const std::string &name, const std::string &title, | |
45 | 45 | const std::string &version, const std::string &hrefUrl, |
46 | 46 | bool projectSettings ); |
47 | 47 | ... | ... |
... | ... | @@ -7,6 +7,7 @@ |
7 | 7 | * copyright: 广州城市信息研究所有限公司 |
8 | 8 | ***************************************************************************/ |
9 | 9 | #include "dmpwfsgetfeature.h" |
10 | +#include "dmpsqlfactory.h" | |
10 | 11 | namespace DmpWfs |
11 | 12 | { |
12 | 13 | void writeGetFeature(const DmpServerContext &context,const DmpWfsParameters& params, |
... | ... | @@ -21,21 +22,23 @@ namespace DmpWfs |
21 | 22 | bool projectSettings) |
22 | 23 | { |
23 | 24 | char buff[5000]; |
24 | - return ""; | |
25 | - // SqlFactory sqlF; | |
25 | + DmpSqlFactory sqlFactory; | |
26 | 26 | |
27 | - /*shared_ptr<WMSServer> service = _dmapWms.GetWmsService(parseString.mapService); | |
28 | - if(service == nullptr) | |
29 | - { | |
30 | - return false; | |
31 | - } | |
27 | + int maxFeatures = params.MaxFeatures(); | |
28 | + int startIndex = params.StartIndex(); | |
29 | + std::string typeName = params.TypeName(); | |
30 | + std::string featureID = params.FeatureID(); | |
31 | + std::string propertyName = params.PropertyName(); | |
32 | + std::string resultType = params.ResultType(); | |
33 | + | |
34 | + sqlFactory.setStartIndexCount(startIndex, maxFeatures, resultType); | |
32 | 35 | |
33 | - sqlF.SetStartIndexCount(parseString.startIndex, parseString.maxFeatures, parseString.resulttype); | |
34 | 36 | std::vector<std::string> ids; |
35 | - if (parseString.featureid) | |
37 | + if (!featureID.empty()) | |
36 | 38 | { |
37 | 39 | char *idstring[1000]; |
38 | 40 | //将ID值以逗号分开,并返回个数 |
41 | + /* | |
39 | 42 | int idn = StringHelp::ParseStringTok(parseString.featureid, ',', idstring, 1000); |
40 | 43 | for (int i = 0; i < idn; i++) |
41 | 44 | { |
... | ... | @@ -55,11 +58,12 @@ namespace DmpWfs |
55 | 58 | ids.push_back(ss[0]); |
56 | 59 | } |
57 | 60 | } |
61 | + */ | |
58 | 62 | } |
59 | 63 | |
60 | - std::vector<std::string> props; | |
64 | + /* std::vector<std::string> props; | |
61 | 65 | std::vector<std::string> propsAs; |
62 | - if (parseString.propertyname) | |
66 | + if (propertyName.empty()) | |
63 | 67 | { |
64 | 68 | char *idstring[1000]; |
65 | 69 | int idn = StringHelp::ParseStringTok(parseString.propertyname, ',', idstring, 1000); |
... | ... | @@ -88,9 +92,10 @@ namespace DmpWfs |
88 | 92 | } |
89 | 93 | } |
90 | 94 | } |
95 | + */ | |
91 | 96 | |
92 | - if (parseString.layerName == 0) | |
93 | - return Error(buff, ErrorClass::ParaError, "layername not exist", ab); | |
97 | + // if (parseString.layerName == 0) | |
98 | + // return Error(buff, ErrorClass::ParaError, "layername not exist", ab); | |
94 | 99 | |
95 | 100 | //const char *realLayer=0; |
96 | 101 | //GetUpLayerID是干什么的? |
... | ... | @@ -98,7 +103,7 @@ namespace DmpWfs |
98 | 103 | // if (_GetUperLayerId(parseString.layerName, sLayer) == false) |
99 | 104 | // return Error(buff, ErrorClass::ParaError, "layer not exist", ab); |
100 | 105 | |
101 | - shared_ptr<MapLayer> mapLayer = service->GetLayer(parseString.layerName); | |
106 | + /* shared_ptr<MapLayer> mapLayer = service->GetLayer(parseString.layerName); | |
102 | 107 | |
103 | 108 | |
104 | 109 | if(mapLayer == nullptr) |
... | ... | @@ -118,9 +123,11 @@ namespace DmpWfs |
118 | 123 | return Error(buff, ErrorClass::ParaError, "layername not exist", ab); |
119 | 124 | } |
120 | 125 | |
126 | + | |
127 | + | |
121 | 128 | |
122 | 129 | shared_ptr<TableDesc> pTabledesc = this->ToTableDesc(fields,mapLayer->m_layerName); |
123 | - | |
130 | + | |
124 | 131 | |
125 | 132 | size_t propCount = props.size(); |
126 | 133 | if (propCount) |
... | ... | @@ -204,6 +211,7 @@ namespace DmpWfs |
204 | 211 | isPicture = 0; |
205 | 212 | return this->FormatWFSXMLCAll(pWorkspace, ab, parseString.layerName, buff, ver); |
206 | 213 | }*/ |
214 | + return ""; | |
207 | 215 | } |
208 | 216 | |
209 | 217 | ... | ... |
... | ... | @@ -6,9 +6,175 @@ |
6 | 6 | * Email: qingxiongf@chinadci.com |
7 | 7 | * copyright: 广州城市信息研究所有限公司 |
8 | 8 | ***************************************************************************/ |
9 | +#include <iostream> | |
10 | +#include <boost/lexical_cast.hpp> | |
11 | +#include <boost/algorithm/string.hpp> | |
12 | +#include "dmplogger.h" | |
13 | +#include "dmpserverutils.h" | |
9 | 14 | #include "dmpwfsparameters.h" |
10 | 15 | |
11 | 16 | namespace DmpWfs |
12 | 17 | { |
18 | + DmpWfsParameters::DmpWfsParameters() | |
19 | + : DmpServerParameters() | |
20 | + { | |
21 | + } | |
22 | + | |
23 | + DmpWfsParameters::DmpWfsParameters(const DmpServerParameters ¶ms) | |
24 | + { | |
25 | + params_ = params.parameters(); | |
26 | + } | |
27 | + | |
28 | + bool DmpWfsParameters::GetStringParameter(const char* key, std::string &value) const | |
29 | + { | |
30 | + std::map<std::string, std::string>::const_iterator iter; | |
31 | + iter = params_.find(key); | |
32 | + if (iter != params_.end()) | |
33 | + { | |
34 | + try | |
35 | + { | |
36 | + value = boost::lexical_cast<std::string>(iter->second); | |
37 | + return true; | |
38 | + } | |
39 | + catch (boost::bad_lexical_cast &e) | |
40 | + { | |
41 | + LOGGER_ERROR(e.what()); | |
42 | + } | |
43 | + } | |
44 | + return false; | |
45 | + } | |
46 | + | |
47 | + bool DmpWfsParameters::GetIntParameter(const char* key, int& value) const | |
48 | + { | |
49 | + std::map<std::string, std::string>::const_iterator iter; | |
50 | + iter = params_.find(key); | |
51 | + if (iter != params_.end()) | |
52 | + { | |
53 | + try | |
54 | + { | |
55 | + value= boost::lexical_cast<int>(iter->second); | |
56 | + return true; | |
57 | + } | |
58 | + catch (boost::bad_lexical_cast &e) | |
59 | + { | |
60 | + LOGGER_ERROR(e.what()); | |
61 | + } | |
62 | + } | |
63 | + return false; | |
64 | + } | |
65 | + | |
66 | + | |
67 | + std::string DmpWfsParameters::Service() const | |
68 | + { | |
69 | + std::string value = "WMS"; | |
70 | + this->GetStringParameter("SERVICE", value); | |
71 | + return value; | |
72 | + } | |
73 | + | |
74 | + //必须 值为GetCapabilities GetFeature DescribeFeatureType GetGmlObject Transaction LockFeature | |
75 | + std::string DmpWfsParameters::Request() const | |
76 | + { | |
77 | + std::string value = ""; | |
78 | + GetStringParameter("REQUEST",value); | |
79 | + return value; | |
80 | + } | |
81 | + | |
82 | + | |
83 | + //必须 服务版本, 值为 1.0.0, 1.1.0, 1.1.1, 1.3 | |
84 | + std::string DmpWfsParameters::Version() const | |
85 | + { | |
86 | + std::string value = ""; | |
87 | + GetStringParameter("VERSION",value); | |
88 | + return value; | |
89 | + } | |
90 | + | |
91 | + std::string DmpWfsParameters::TypeName() const | |
92 | + { | |
93 | + std::string value = ""; | |
94 | + if(!GetStringParameter("TYPENAME",value)) | |
95 | + { | |
96 | + GetStringParameter("LAYER",value); | |
97 | + } | |
98 | + return value; | |
99 | + } | |
100 | + | |
101 | + std::string DmpWfsParameters::OutputFormat() const | |
102 | + { | |
103 | + std::string value = ""; | |
104 | + if(!GetStringParameter("OUTPUTFORMAT",value)) | |
105 | + { | |
106 | + GetStringParameter("FORMAT",value); | |
107 | + } | |
108 | + return value; | |
109 | + } | |
110 | + | |
111 | + | |
112 | + | |
113 | + std::string DmpWfsParameters::BBox() const | |
114 | + { | |
115 | + std::string value = ""; | |
116 | + GetStringParameter("BBOX",value); | |
117 | + return value; | |
118 | + } | |
119 | + | |
120 | + std::string DmpWfsParameters::Filter() const | |
121 | + { | |
122 | + std::string value = ""; | |
123 | + GetStringParameter("FILTER",value); | |
124 | + return value; | |
125 | + } | |
126 | + | |
127 | + std::string DmpWfsParameters::Sortby() const | |
128 | + { | |
129 | + std::string value = ""; | |
130 | + GetStringParameter("SORTBY",value); | |
131 | + return value; | |
132 | + } | |
133 | + | |
134 | + int DmpWfsParameters::MaxFeatures() const //指定返回最多要素 | |
135 | + { | |
136 | + int value = 0; | |
137 | + if(!GetIntParameter("MAXFEATRUES",value)) | |
138 | + { | |
139 | + GetIntParameter("COUNT",value); | |
140 | + } | |
141 | + return value; | |
142 | + } | |
143 | + | |
144 | + int DmpWfsParameters::StartIndex() const | |
145 | + { | |
146 | + int value = 0; | |
147 | + GetIntParameter("STARTINDEX",value); | |
148 | + return value; | |
149 | + } | |
150 | + | |
151 | + std::string DmpWfsParameters::PropertyName() const | |
152 | + { | |
153 | + std::string value = ""; | |
154 | + GetStringParameter("PROPERTYNAME",value); | |
155 | + return value; | |
156 | + } | |
157 | + | |
158 | + | |
159 | + std::string DmpWfsParameters::SrsName() const //空间参考坐标 | |
160 | + { | |
161 | + std::string value = ""; | |
162 | + GetStringParameter("SYSNAME",value); | |
163 | + return value; | |
164 | + } | |
165 | + | |
166 | + std::string DmpWfsParameters::FeatureID() const //要素ID | |
167 | + { | |
168 | + std::string value = ""; | |
169 | + GetStringParameter("FEATUREID",value); | |
170 | + return value; | |
171 | + } | |
172 | + | |
173 | + std::string DmpWfsParameters::ResultType() const //要素ID | |
174 | + { | |
175 | + std::string value = ""; | |
176 | + GetStringParameter("RESULTTYPE",value); | |
177 | + return value; | |
178 | + } | |
13 | 179 | |
14 | 180 | } |
\ No newline at end of file | ... | ... |
... | ... | @@ -41,17 +41,20 @@ namespace DmpWfs |
41 | 41 | |
42 | 42 | //DescribeFeatureType |
43 | 43 | //GetFeature |
44 | - std::string TypeName() const; //必须 坐标系 | |
44 | + std::string TypeName() const; //必须 | |
45 | 45 | std::string OutputFormat() const; //必须 |
46 | - std::string BBox() const; //必须 | |
46 | + std::string BBox() const; | |
47 | 47 | std::string Filter() const; |
48 | 48 | std::string Sortby() const; |
49 | 49 | int MaxFeatures() const; //指定返回最多要素 |
50 | + int StartIndex() const; | |
50 | 51 | std::string PropertyName() const; //指定返回的要素属性,没有指定不返回 |
51 | 52 | std::string SrsName() const; //空间参考坐标 |
52 | 53 | std::string FeatureID() const; //要素ID |
54 | + std::string ResultType() const; | |
55 | + | |
53 | 56 | //std::string Expiry(); |
54 | - //std::string ResultType(); | |
57 | + | |
55 | 58 | //std::string FeatureVsrsion(); |
56 | 59 | |
57 | 60 | //Transaction(对要素数据增、删、改) | ... | ... |
... | ... | @@ -9,7 +9,7 @@ |
9 | 9 | #include "dmpwmsgetcapabilities.h" |
10 | 10 | #include "dmpserverresponse.h" |
11 | 11 | #include "dmpserverrequest.h" |
12 | - | |
12 | +#include "dmpserverproject.h" | |
13 | 13 | namespace DmpWms |
14 | 14 | { |
15 | 15 | void writeGetCapabilities( const DmpServerContext &context, const DmpWmsParameters& params, |
... | ... | @@ -20,6 +20,8 @@ namespace DmpWms |
20 | 20 | char char_hrefUrl[1024] = {0}; |
21 | 21 | std::string domain = context.request()->domain(); |
22 | 22 | std::string port = context.request()->port(); |
23 | + std::string name = context.serverProject()->name(); | |
24 | + std::string title = context.serverProject()->title(); | |
23 | 25 | if(port == "80" || port =="") |
24 | 26 | { |
25 | 27 | sprintf(char_hrefUrl, "http://%s%s", domain.c_str(), context.request()->path().c_str()); |
... | ... | @@ -30,7 +32,7 @@ namespace DmpWms |
30 | 32 | } |
31 | 33 | hrefUrl = char_hrefUrl; |
32 | 34 | // hrefUrl = "http://172.26.40.51:8821/?mapService=test"; |
33 | - std::shared_ptr<boost::property_tree::ptree> doc = getCapabilities(project, version,hrefUrl, projectSettings); | |
35 | + std::shared_ptr<boost::property_tree::ptree> doc = getCapabilities(project, version,hrefUrl,name,title, projectSettings); | |
34 | 36 | |
35 | 37 | std::stringstream stream; |
36 | 38 | write_xml(stream, *doc.get()); |
... | ... | @@ -44,7 +46,7 @@ namespace DmpWms |
44 | 46 | } |
45 | 47 | |
46 | 48 | std::shared_ptr<boost::property_tree::ptree> getCapabilities( const DmpProject* project, |
47 | - const std::string &version, const std::string &hrefUrl, | |
49 | + const std::string &version, const std::string &hrefUrl, std::string& name, std::string& title, | |
48 | 50 | bool projectSettings ) |
49 | 51 | { |
50 | 52 | std::shared_ptr<boost::property_tree::ptree> xmlRootDoc(new boost::property_tree::ptree()); |
... | ... | @@ -67,8 +69,8 @@ namespace DmpWms |
67 | 69 | } |
68 | 70 | |
69 | 71 | boost::property_tree::ptree ptService; |
70 | - ptService.add("Name", "project_name"); | |
71 | - ptService.add("Title", "project_title"==""? "project_name": "project_title"); | |
72 | + ptService.add("Name", name); | |
73 | + ptService.add("Title", title); | |
72 | 74 | ptService.add("Abstract", "dmap wms service"); |
73 | 75 | ptService.add("Keywords", "WMS,DMAP"); |
74 | 76 | ptService.add("OnlineResource", hrefUrl); |
... | ... | @@ -82,7 +84,7 @@ namespace DmpWms |
82 | 84 | boost::property_tree::ptree format; |
83 | 85 | format.add("Format", "XML"); |
84 | 86 | ptCapability.add_child("Exception",format); |
85 | - addCapabilitiesLayers(ptCapability,project); | |
87 | + addCapabilitiesLayers(ptCapability,project,name,title); | |
86 | 88 | |
87 | 89 | xmlRoot.add_child("Capability",ptCapability); |
88 | 90 | xmlRootDoc->add_child(rootname,xmlRoot); |
... | ... | @@ -142,14 +144,14 @@ namespace DmpWms |
142 | 144 | return; |
143 | 145 | } |
144 | 146 | |
145 | - void addCapabilitiesLayers(boost::property_tree::ptree &pt,const DmpProject* project) | |
147 | + void addCapabilitiesLayers(boost::property_tree::ptree &pt,const DmpProject* project, std::string& name, std::string& title) | |
146 | 148 | { |
147 | 149 | std::string srs = "EPSG:" + std::__cxx11::to_string(project->crs().srid()); |
148 | 150 | |
149 | 151 | boost::property_tree::ptree ptProject; |
150 | 152 | // ptProject.add("<xmlattr>.queryable","1"); |
151 | - ptProject.add("Name", "project_name"); | |
152 | - ptProject.add("Title", "project_title"==""? "project_name": "project_title"); | |
153 | + ptProject.add("Name", name); | |
154 | + ptProject.add("Title", title); | |
153 | 155 | ptProject.add("CRS", srs); |
154 | 156 | |
155 | 157 | ... | ... |
... | ... | @@ -16,12 +16,13 @@ |
16 | 16 | #include <memory> |
17 | 17 | #include <vector> |
18 | 18 | #include "dmpproject.h" |
19 | -#include "dmpwmsparameters.h" | |
19 | +#include "dmpwmsgetmap.h" | |
20 | 20 | #include "dmpservercontext.h" |
21 | 21 | |
22 | 22 | namespace DmpWms |
23 | 23 | { |
24 | 24 | |
25 | + | |
25 | 26 | /** |
26 | 27 | * Output GetCapabilities response |
27 | 28 | */ |
... | ... | @@ -39,7 +40,7 @@ namespace DmpWms |
39 | 40 | * \returns GetCapabilities XML document |
40 | 41 | */ |
41 | 42 | std::shared_ptr<boost::property_tree::ptree> getCapabilities( const DmpProject* project, |
42 | - const std::string &version, const std::string &hrefUrl, | |
43 | + const std::string &version, const std::string &hrefUrl,std::string& name, std::string& title, | |
43 | 44 | bool projectSettings ); |
44 | 45 | |
45 | 46 | void addCapabilitiesRequest(boost::property_tree::ptree &pt, const std::string &hrefUrl); |
... | ... | @@ -47,7 +48,7 @@ namespace DmpWms |
47 | 48 | void addCapabilitiesRequestNode(boost::property_tree::ptree &pt, const std::string &hrefUrl, |
48 | 49 | const char* request,const std::vector<const char*>& formatList); |
49 | 50 | |
50 | - void addCapabilitiesLayers(boost::property_tree::ptree &pt,const DmpProject* project); | |
51 | + void addCapabilitiesLayers(boost::property_tree::ptree &pt,const DmpProject* project,std::string& name, std::string& title); | |
51 | 52 | |
52 | 53 | void addCapabilitiesLayer(boost::property_tree::ptree &pt,DmpMapLayer* layer,const std::string& srs); |
53 | 54 | ... | ... |
... | ... | @@ -2,5 +2,11 @@ |
2 | 2 | URL 路径: |
3 | 3 | http://localhost:8088/DMap/Services/广州地址/MapServer/WMSService?Service=WMS |
4 | 4 | |
5 | +http://localhost:8088/DMap/Services/MapServer/WMSService?Service=WMS | |
6 | + | |
7 | + | |
8 | + | |
5 | 9 | /DMap/Services/?([\\w./]*)/MapServer/([\\w]+) |
6 | 10 | |
11 | +http://localhost:8088/dmap/api/vectormapping/gettypefacelist | |
12 | + | ... | ... |
请
注册
或
登录
后发表评论