mapserver
import cgi
print( "Content-type: text/html" )
print("\n")
def load_mapfile():
pass
def load_template():
pass
def query():
pass
if __name__ == "__main__":
pass
scale = 1.0
req_msg = cgi.FieldStorage()
scale_str = req_msg.getvalue("scale")
if scale_str:
scale = float(scale_str)
print( """<html>
<body>
<h1>Web World map!!!</h1>
<div>
<form action="/cgi-bin/mapserver.py">
缩放因子:<input type="text" name="scale" value="%f"/>
<input type="submit" value="缩放"/>
</form>
</div>
<div id="id_div_map">
<svg id="id_svg_map" width="800px" height="600px" viewBox="-182 -92 364 184" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
""" % scale )
print( """
<image x="%d" y="%d" width="%dpx" height="%dpx" xlink:href="../images/world.jpg"></image>
""" % (int(-180 * scale), int(-90 * scale), int(360 * scale), int(180 * scale)) )
world_map = open("./cgi-bin/world.dat")
points = ""
for line in world_map:
line = line.strip()
if line.startswith("#"):
continue
point = line.split()
if len( point ) == 2:
longitude = float( point[0] )
latitude = float( point[1] )
x = longitude * scale
y = -latitude * scale
points = points + "%f, %f " % (x,y)
if len( line ) == 0 and len( points ) != 0:
print( '<polyline points="' + points + '" style="fill:none;stroke:red;stroke-width:1" />' )
points = ""
print( """</svg>
</div>
</body>
</html>
""" )
world_map.close()
mapserver_shp
import sys
import cgi
import csv
from osgeo import ogr
print( "Content-type: text/html" )
print("\n")
def load_mapfile():
pass
def load_template():
pass
def query():
pass
if __name__ == "__main__":
pass
scale = 1.0
req_msg = cgi.FieldStorage()
scale_str = req_msg.getvalue("scale")
if scale_str:
scale = float(scale_str)
print( """<html>
<body>
<div>
<div style="font-size:32px; color: red">Web地图服务器(shp2svg)</div><hr/>
<form action="/cgi-bin/mapserver_shp.py">
<span>缩放因子</span>
<input type="text" name="scale" value="%f"/>
<input type="submit" value="缩放"/>
<span>图层控制</span>
""" % scale )
map_layers_fo = open("./cgi-bin/map_layers.csv", encoding="GBK")
map_layers = list(csv.reader(map_layers_fo))
map_layers_fo.close()
del map_layers[0]
for idx,map_layer in enumerate(map_layers):
req_msg = cgi.FieldStorage()
isLayerPaint = req_msg.getvalue(str(map_layer[0]))
if isLayerPaint is None:
isLayerPaint = "n"
if isLayerPaint == "y":
print( ''' <input type="checkbox" οnclick="checkbox(this)" name="%s"''' %map_layer[0],end="")
print( ''' value="y" checked="checked"''',end="")
print("""/>%s """ %map_layer[0])
map_layers[idx][3] = "y"
elif isLayerPaint == "n":
print( ''' <input type="checkbox" οnclick="checkbox(this)" name="%s"''' %map_layer[0],end="")
print( ''' value="n"''',end="")
print("""/>%s """ %map_layer[0])
map_layers[idx][3] = "n"
print( """
<input type="submit" value="更新"/>
</form>
</div>
<div id="id_div_map">
<svg id="id_svg_map" viewBox="70 -55 70 50" version="1.1" style="height:800px"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">""")
def printPoint(data, strStyle):
s1 = data.split("POINT (")
s2 = s1[1].split(")")
for i in range(len(s2)):
points = s2[i].split(",")
strpoints = ""
for j in range(len(points)):
point = points[j].split(" ")
if len( point ) == 2:
longitude = float( point[0].replace(")","").replace("(","") )
latitude = float( point[1].replace(")","").replace("(","") )
x = longitude * scale
y = -latitude * scale
strpoints = 'cx="%f" cy="%f"' % (x,y)
print( ' <circle ' + strpoints + ' ' + strStyle + ' />' )
strpoints = ""
def printPolyline(data, strStyle):
s1 = data.split("LINESTRING (")
s2 = s1[1].split(")")
for i in range(len(s2)):
points = s2[i].split(",")
strpoints = ""
for j in range(len(points)):
point = points[j].split(" ")
if len( point ) == 2:
longitude = float( point[0].replace(")","").replace("(","") )
latitude = float( point[1].replace(")","").replace("(","") )
x = longitude * scale
y = -latitude * scale
strpoints = strpoints + "%f,%f " % (x,y)
print( ' <polyline points="' + strpoints + '" ' + strStyle + ' />' )
strpoints = ""
def printPolygon(data, strStyle):
s1 = data.split("POLYGON ((")
s2 = s1[1].split("))")
for i in range(len(s2)):
points = s2[i].split(",")
strpoints = ""
for j in range(len(points)):
point = points[j].split(" ")
if len( point ) == 2:
longitude = float( point[0].replace(")","").replace("(","") )
latitude = float( point[1].replace(")","").replace("(","") )
x = longitude * scale
y = -latitude * scale
strpoints = strpoints + "%f,%f " % (x,y)
print( ' <polygon points="' + strpoints + '" ' + strStyle + ' />' )
strpoints = ""
for idx,map_layer in enumerate(map_layers):
req_msg = cgi.FieldStorage()
isLayerPaint = req_msg.getvalue(str(map_layer[0]))
if isLayerPaint == "y":
map_layers[idx][3] = "y"
file_name = map_layer[1]
driver = ogr.GetDriverByName('ESRI Shapefile')
dataSource = driver.Open(file_name, 0)
if dataSource is None:
sys.exit(1)
layer = dataSource.GetLayer(0)
feature = layer.GetNextFeature()
while feature:
geometry = feature.GetGeometryRef()
geom_type=geometry.GetGeometryType()
data = geometry.ExportToWkt()
if geom_type == 1:
printPoint(data, map_layer[2])
if geom_type == 2:
printPolyline(data, map_layer[2])
if geom_type == 3:
printPolygon(data, map_layer[2])
feature.Destroy()
feature = layer.GetNextFeature()
else:
map_layers[idx][3] = "n"
print( """</svg>
</div>""")
print('''
<script>
function checkbox(obj) {
if(obj.checked){
obj.value = "y";
}
else obj.value = "n";
}
</script>
''')
print( """</body>
</html>
""" )
map_layers_fo = open("./cgi-bin/map_layers.csv", mode="w",encoding="GBK",newline='')
map_layers_writer = csv.writer(map_layers_fo)
headline = ["图层名","文件路径","格式","是否显示"]
map_layers_writer.writerow(headline)
for idx,map_layer in enumerate(map_layers):
req_msg = cgi.FieldStorage()
isLayerPaint = req_msg.getvalue(str(map_layer[0]))
if isLayerPaint is None:
isLayerPaint = 'n'
map_layers[idx][3] = isLayerPaint
map_layers_writer.writerows(map_layers)
map_layers_fo.close()