FAQ

MapServer 日志文件在哪里?

调试MapServer

有哪些关于 MapServer 的书籍?

"Mapping Hacks" Schuyler Erle、Rich Gibson和Jo Walsh可从O'Reilly获得。

"Web Mapping Illustrated" 泰勒·米切尔可以从奥雷利那里得到。介绍了MAPServer和许多其他相关技术,包括GDAL/OGR、mapscript、postgis、地图投影等。

"MapServer: Open Source GIS Development" Bill Kropla。

我如何在 Windows 中对 MapServer 进行编译?

看见 在Win32上编译 。此外,您还可以使用 OSGeo4W 作为起点,而不是自己构建所有的依赖库。Windows用户需要完整的安装程序(包括APACHE、MapServer、MAPSCRIPTS、GDAL)请参阅 MS4W

MapServer 的版本号是什么意思?

MapServer 的版本号组成方式与 Linux非常相似。例如,一个 MapServer 的版本号 4.2.5 可以理解为:

  • 4:主要版本号。MapServer 每两到三年发布一个主要版本。

  • 2:次要版本号。次要版本号的增量几乎总是与功能的增量有关。

  • 5:修订版本号。修订只用于错误修复。修订版本中不提供新的功能。

从开发人员的角度来看,MapServer版本编号方案也与Linux类似。偶数次要版本号(0..2..4..6)与 release 版本和奇数次版本(1..3..5..7)对应于开发版本。

MapServer 是线性安全的吗?

Q: MapServer线程安全吗?

A: 一般来说,没有(但见下一个问题)。MapServer的许多组件使用静态或全局数据,这些数据可能会被另一个线程修改。在重负荷下,这些不可能发生的事件变得不可避免,并可能导致零星的错误。

Q: 在多线程应用程序中是否可以安全地使用任何mapserver?

A: 有些是小心的。或者使用python:)程序员必须避免使用mapserver的不安全组件,或者小心地在它们周围放置锁。python的全局解释器锁可以防止mapserver线程问题;因为没有mapscript代码可以发布gil,所以所有mapscript函数或方法都是有效的原子性的。MaScript和Java、.NET、MODYPURL或MODYPHP的用户没有额外的保护层。

A: 应避免使用哪些组件?

Q: 以下是不安全和未受保护的组件以及不安全但已锁定的组件的列表。

不安全:

  • OGR 图层:使用不安全 CPL 服务

  • 制图线绘制:静止数据

  • 图像地图输出:静止数据

  • SWF 输出:静止数据与使用不安全 msGetBasename()

  • SVG 输出:静止数据

  • WMS/WFS 服务器:收发状态使用静止数据

  • 强制临时文件基础 (一个模糊的要素):静止数据

  • MyGIS:部分静止数据

不安全但已锁定:

  • 地图配置文件加载:全局解析器

  • 设置组与图层过滤表达式 (全局解析器)

  • 分类表达式评估 (全局解析器)

  • 设置地图与图层投影 (PROJ)

  • 栅格图层绘制与检索 (GDAL)

  • 数据库连接 (mappool.c)

  • PostGIS 支持

  • Oracle Spatial (为连接使用一个单一环境句柄)

  • SDE 支持 (全局图层缓存)

  • 错误处理 (错误项目的静态仓库)

  • WMS/WFS 客户连接:在 Curl 初始化中有潜在的紊乱情况

  • 插件图层 (已加载动态链接库的静态仓库)

以上功能中有一些相当粗糙的锁定在适当的地方。同一时间只有单一线程可以可以使用全局解析器且单一线程可以访问 GDAL 栅格数据。性能以安全性为交换。

状态在一个图层中是什么意思?

状态 开 与 状态 关 设置图层默认状态。如果一幅地图被请求,那些图层会被 开/关 除非在图层参数中被另外指定。这在使用 MapScript 和 MapServer 的嵌入式范本机制时尤其显著,但是在编写您自己的应用与设置初始地图视图时也可以作为一个提示使用。

状态 默认 意味着这个图层总是为开,即使在图层定义中没有说明。一个图层的状态可以在 MapScript 中从 默认 改变 为 关,但除此以外,该图层总是为开。

CGI 关闭所有非“状态默认值”的选项,以便所有层都从同一状态(例如关闭)开始,并且必须明确请求绘制或查询。这种公共状态使(至少在我看来)实现更容易。我的意思是,如果一个图层“lakes”开始在doing layer=lakes上,它就会关闭。所以我想消除开始状态的模糊性。

如何让我的地图运行更快?

除了通过显而易见且昂贵的购置更快的硬件配置,还有很多不同的方法可以提高地图性能。这里是指向几个不同优化方式的连接。

适用于所有情况的一些普通提示:

  • 首先最重要的是硬件配置。一个额外的内存 GB 将会使您的地图性能提高至通过扭曲您的数据无法达到的速度。以目前的内存价格,这是一个一次性提高每一幅地图速度的经济简单的方法。

  • 使用科学方法。每次改变一个设置或元素以查看其效果。尝试停用所有图层然后每次启用一个知道您发现哪一个图层存在问题。

  • 使用 Sp2IMG 程序来计时您的结果。它从命令行运行,并绘制整个地图的图像。因为它是从命令行运行的,所以它不受网络延迟的影响,并且会提供与Web浏览器更一致的测量结果。

MapServer 中的多段线是什么意思?

线状元素的定义在 MapServer 跟在 ESRI 中的定义有一些混淆。不同于 ESRI 线状元素代表多段线,在 MapServer 中,线性元素只是面状元素的线性表达。ESRI 中旧的 shapfile 技术表述版本更是不提及线状元素 shapefile。所以 ESRI 的线状元素 shapefile 只是线性元素且只可以被绘制及标志为线状图层。这些文件并没有面状元素文件所要求的闭合线段限制,这是很重要的区别。我认为会有比线状元素更好的表达,但是我并不知道会是什么。

备注

线状要素跟线图层唯一的不同是他们的标注方式。

什么是 MapScript?

mapscript是到mapserver的脚本接口,通常由 SWIG (以下情况除外 PHP映射脚本API )mapscript允许您直接使用mapserver的对象编程,而不是通过其 CGIMapfile .

MapServer 支持地理编码反查吗?

不支持

反向地理编码是一种活动,您可以从中获取已经拥有的街道功能列表,并从中生成邮政地址。这种空间功能由专有软件包(如ESRI工具套件)以及服务(如GDT提供的服务)提供。MAPServer用于 地图绘制, 它不提供像这样的高级空间操作。

MapServer 支持地理编码吗?

不支持

地理编码是一种活动,您可以获取地址列表并为其生成lat/lon点。这种空间功能由专有软件包(如ESRI工具套件)以及其他站点提供。MAPServer用于 地图绘制, 它不提供像这样的高级空间操作。

有许多免费的地理编码程序可用,例如http://geolytica.com(geocoder.ca)北美,或者您可以使用OpenStreetmap数据、Tiger数据或其他开放数据源建立自己的服务。然后您可以将应用程序挂接起来,使用此服务为地址提供lat/lon对,然后使用mapserver显示这些点(可能通过mapscript)。

如何在我的地图里设置线宽?

在当前的 MapServer 版本中,线宽被设定为使用样式中的宽度参数。对于一个线状图层,线段可以通过使用以下分类中的样式被设定为红色、3像素宽。

STYLE
  COLOR 255 0 0
  WIDTH 3
END

在早期版本的MapServer中,可以将层的符号设置为“圆形”,然后可以将符号大小设置为所需的宽度。“圆”符号可定义为

SYMBOL
  NAME 'circle'
  TYPE ELLIPSE
  FILLED TRUE
  POINTS 1 1 END
END

为什么我的jpeg输入图像通过mapserver看起来不同?

必须使用旧版本的mapserver(其中gd是用于渲染的默认库)。

新版本的mapserver使用agg进行渲染,默认的输出格式是24位颜色,因此不应该有问题。

带有gd的mapserver的默认输出格式是8bit伪彩色png或gif。从本质上讲,将24位图像(1600万色)转换为8位图像(256色)时,颜色会有所下降。

对于gd输出,mapserver使用了一种非常简单的方法来进行转换,将像素转换为175色colorcube中最接近的颜色。这通常会导致图像平滑变化时出现斑点。

对于GD,解决方案过去是:

  • 选择24位输出。这可能和地图部分中的“imagetype jpeg”一样简单。

  • 启用抖动(处理“抖动=是”)以产生更好的颜色外观。

  • 在将图像与外部应用程序(如gdal rgb2pct.py脚本)一起在MapServer中使用之前,请将图像预处理为8bit。

有关更多信息,请查看 栅格数据 .

我应该使用哪种图像格式?

尽管mapscript可以以任何所需的图像格式生成地图,但只考虑三种最常见的格式就足够了:jpeg、png和gif。

jpeg是一种图像格式,它使用有损压缩算法来减小图像的文件大小,并且主要用于压缩导致的细节丢失不明显或可以忽略的情况,就像大多数照片一样。另一方面,地图主要是由一种颜色的细线和区域组成,而这正是jpeg不太熟悉的显示方式。此外,地图,除非包括一些航空或卫星图像,一般只使用很少的不同颜色。jpeg的24位色深能够显示大约1670万种颜色,这很简单,不适合用于此目的。但是,GIF和PNG使用索引调色板,可以针对任意数量(最多256种)的颜色进行优化,这使得它们成为图标、徽标、图表或地图的完美解决方案。因此,以下比较(仅生成文件大小,而不是文件生成持续时间)将仅包括这两种文件格式:

GIF与PNG与PNG24生成的 Mapfile 大小

GIF

PNG

PNG24型

仅矢量数据

59千字节

26千字节

69千字节

矢量数据和彩色卫星图像

156kb

182千字节

53KB

矢量数据和卫星图像单色

142千B

134千字节

942KB

(结果基于平均630x396地图,包括各种颜色、符号、标签/注释等)

虽然在生成包含全色遥感图像的地图时,GIF比PNG在数量和质量上都有优势,但在生成的文件大小方面,PNG在有或无其他单色图像的地图中是明显的数量赢家,因此应是首选的图像格式。但是,如果映射应用程序也可以显示全色航空或卫星图像,则可以动态地将输出文件格式更改为GIF或PNG24,以获得尽可能高的图像质量。

为什么pil(python imaging library)不打开我的PNG?

PIL 目前不支持隔行扫描的PNG(也没有关于何时真正支持的时间表)。为了能够阅读PIL中的PNG,它们不能交错。使用如下格式修改您的OUTPUTFORMAT:

OUTPUTFORMAT
  NAME png
  DRIVER "GD/PNG"
  MIMETYPE "image/png"
  IMAGEMODE RGB
  EXTENSION "png"
  FORMATOPTION "INTERLACE=OFF"
END

为什么我的符号在jpeg输出中看起来很差?

当我将符号呈现到8bit输出(png、gif)时,它们看起来很好,但在24位jpeg输出中,它们看起来非常块状和粗糙。

您必须使用旧版本的MapServer。对于较新的版本,这不应该是问题。下面解释了旧的(gd)行为。

为了在24位输出中正确地呈现某些类型的符号,例如来自真正类型字体的符号,有必要强制呈现在rgba中发生。这可以通过在层定义中包含“透明度alpha”行来实现。不要不必要地使用它,因为会造成性能损失。

此问题还影响PNG24输出或任何RGB输出格式。8bit(PC256)或rgba输出类型已经正常。

我怎样才能得到一个既有填充又有宽度轮廓的多边形?

我怎样才能得到一个既有填充又有宽度轮廓的多边形?每当我在一个单一样式的多边形上同时放置颜色(填充)和宽度为的大纲颜色时,大纲宽度就不受尊重。

出于历史原因,宽度在填充多边形和轮廓笔划宽度的上下文中有两个含义。如果多边形被填充,则宽度定义符号的宽度。 inside 填充多边形。在这种情况下,将忽略轮廓宽度,并始终将其设置为1。达到的效果 both 一个填充和一个轮廓宽度,你需要在你的类中使用两种样式。

STYLE # solid fill
  COLOR 255 0 0
END
STYLE # thick outline
  OUTLINECOLOR 0 0 0
  WIDTH 3
END

如何创建简单的抗锯齿线功能?

对于agg(在最新的mapserver版本中使用),抗锯齿行是默认的,不能关闭。

使用gd,生成抗锯齿线的最简单方法是:

  • 使用24位输出图像类型(imagemode rgb(或rgb a))。

  • 使用抗锯齿线在图层中设置透明度alpha

  • 在具有反锯齿线的类的Style元素中设置Antialias为true

以下mapfile片段为gd启用反锯齿县边界:

...
IMAGETYPE "png24"
...
OUTPUTFORMAT
  NAME "png24"
  DRIVER "GD/PNG"
  MIMETYPE "image/png"
  IMAGEMODE RGB
  EXTENSION "png"
END
...
LAYER
  NAME "counties"
  TYPE line
  STATUS default
  DATA "bdry_counln2.shp"
  TRANSPARENCY alpha
  SYMBOLSCALE 5000000
  CLASS
    STYLE
       WIDTH 3
       COLOR 1 1 1
       ANTIALIAS true
    END
  END
END
...

备注

Countries层中引用的bdry counln2形状文件是一个线条形状文件。可以用大致相同的结果替换多边形形状文件,但由于形状文件的性质,每个边框将渲染两次,并且生成的输出行可能看起来稍微厚一些。或者,可以使用多边形形状文件,将类型设置为多边形,并在样式元素中使用大纲颜色代替颜色。

备注

您可以调整样式->宽度和符号缩放的组合,以修改输出图像中的线条宽度。

参见

Cartoline 符号可以用来达到更高的效果。

MapServer支持哪些OGC规范?

参见: MapServer OGC规范支持 .

为什么我请求的WMS层没有正确对齐?

从某些ArcIMS WMS连接器请求图层会导致地图中的数据未对齐(像素的纵横比看起来不正确)。

默认情况下,一些arcims站点没有设置为拉伸返回的图像以适应请求的信封。这会导致地图的数据层在地图的中心很好地重叠,但不会朝向边缘。这可以通过在请求中添加“respect=false”来解决(将其附加到连接字符串上)。

例如,如果映射文件位于epsg:4326以外的投影中,则以下层将无法正确呈现:

LAYER
    NAME "hillshade"
    TYPE RASTER
    STATUS OFF
    TRANSPARENCY 70
    CONNECTIONTYPE WMS
    CONNECTION "http://gisdata.usgs.net:80/servlet19/com.esri.wms.Esrimap/USGS_WMS_NED?"
    PROJECTION
            "init=epsg:4326"
    END
    METADATA
            "wms_srs" "EPSG:4326"
            "wms_title" "US_NED_Shaded_Relief"
            "wms_name" "US_NED_Shaded_Relief"
            "wms_server_version" "1.1.1"
            "wms_format" "image/png"
    END
END

在连接字符串中添加“respect=false”可以解决以下问题:

LAYER
    NAME "hillshade"
    TYPE RASTER
    STATUS OFF
    TRANSPARENCY 70
    CONNECTIONTYPE WMS
    CONNECTION "http://gisdata.usgs.net:80/servlet19/com.esri.wms.Esrimap/USGS_WMS_NED?reaspect=false"
    PROJECTION
            "init=epsg:4326"
    END
    METADATA
            "wms_srs" "EPSG:4326"
            "wms_title" "US_NED_Shaded_Relief"
            "wms_name" "US_NED_Shaded_Relief"
            "wms_server_version" "1.1.1"
            "wms_format" "image/png"
    END
END

当我执行getcapabilities时,为什么我的浏览器要下载mapserv.exe/mapserv?

一个初学者的问题…我对微软和阿帕奇都是新手。我已经安装了MS4W并运行了Itasca演示。现在我想把它作为一个WMS服务器启用。命令行的mapserv-v告诉我它支持wms_服务器。当我将浏览器指向它时,我的浏览器只想下载mapserv.exe!

我错过了什么?

这是我用来发出getcapabilities wms请求的URL:http://localhost/cgi-bin/mapserv.exe?map=../htdocs/itasca/demo.map&service=wms&version=1.1.1&request=getCapabilities

OGC:WMS 1.1.0和1.1.1规范(均受MapServer支持)规定,对于GetCapability响应,OGC:WMS服务器返回特定的MIME类型(即应用程序/vnd.ogc.xml(参见 OGC:WMS 1.1.1

mime类型从Web服务器传递到客户机(在您的例子中是Web浏览器),客户机可以从中决定如何处理它。

示例1:如果使用Web浏览器,如果Web服务器返回“content-type:image/png”的HTTP头,则Web浏览器将知道这是PNG图像,并相应地显示它。

示例2:如果使用Web浏览器,如果Web服务器返回“content-type:text/html”的HTTP头,则Web浏览器将知道这是一个HTML页,并相应地显示它(即表格、分隔符等)。

基本上,发生的情况是ogc:wms在HTTP响应的头中返回Web浏览器不理解的mime类型,这通常会提示打开或下载内容的对话框(即内容类型:application/vnd.ogc.wms-xml)。

您可以配置Web浏览器以某种方式处理应用程序/vnd.ogc.wms_xmlmime类型(即在记事本中打开等)。

为什么我的wms getmap请求使用mapserver 5.0返回异常?

在升级到MapServer 5.0之前,我能够以以下形式执行快速getmap测试:http://wms.example.com/wms?service=wms&version=1.1.1&request=getmap&layers=foo

现在,当我尝试相同的测试时,MapServerWMS返回一个XML文档,说明缺少必需的参数。这是怎么回事?

这是对MapServer5.0中WMS服务器支持的主要更改。mapserver wms server getmap请求现在需要以下附加参数:

  • SRS

  • 口技

  • 宽度

  • 高度

  • 格式

  • 风格

备注

这些参数在所有版本的WMS规范中都是必需的,但是MapServer以前在客户机请求中不需要这些参数(即使大多数OGC WMS客户机无论如何都会发布这些参数以与WMS规范保持一致)。

下面的请求现在构成有效的getmap请求:

http://wms.example.com/wms?service=WMS&version=1.1.1&request=GetMap&layers=foo&srs=EPSG:4326&bbox=-180,-90,180,90&format=image/png&width=400&height=300&styles=default

与WMS规范一致。

有关这些参数的详细信息,请参阅 WMS服务器 以及 OGC WMS 1.1.1 specification

有关更多详细信息,请参阅 ticket 1088

警告

样式虽然是必需的WMS参数,但现在在MapServer中又是可选的。有关更多详细信息,请参阅 ticket 2427

使用MapServer6.0,为什么我的层不显示在getCapabilities响应中,或者不再被找到?

MapServer6.0引入了针对OGC Web服务请求隐藏层的选项。OGC Web服务可以提供对地理空间数据的强大访问。决定禁用层级请求访问作为默认访问。见 MS RFC 67:启用/禁用OGC Web服务中的层 提供对变化和影响的完整解释。

要启用6.0之前的行为,可以将以下内容添加到 WEB 映射文件中对象的元数据部分:

"ows_enable_request" "*"

这将允许所有层访问所有OGC Web服务请求。

在哪里可以找到我的EPSG代码?

对于大于等于6的项目版本,有一个SpatiaLite数据库 proj.db 在您的proj安装(例如“/usr/local/share/proj/proj.db”)中,包含了proj使用的EPSG信息;对于低于6版的proj,有一个文本文件 epsg 在相同的共享位置。在Windows上, MS4W 用户可以在C:\ms4w\proj\nad中找到epsg文件,也可以使用名为 PROJ_LIB

https://epsg.io/ (recommended) and https://spatialreference.org (no longer maintained) allow you to search for EPSG codes.

有关EPSG的更多信息(现在还包含对EPSG码的文本或地图搜索):https://epsg.org/home.html

关于proj的更多信息:https://proj.org/

如何使用ogr2ogr重新投影数据?

当然是与Og2ogr合作!ogr2ogr是一个功能强大的实用程序,当传递适当的参数时,它将转换形状文件的投影。在我的案例中,我使用MapServer在RI州飞机的脚上提供数据。要做到这一点,首先必须将数据转换为米。以下是我使用的命令:

ogr2ogr -t_srs EPSG:32130 output.shp input.shp

因为我的数据已经定义了一个投影,所以我不需要显式地声明一个源投影。此命令使用NAD83罗德岛(32130)的EPSG定义并执行英尺到米的转换。

现在说我的数据还没有计划好?我们是这样处理的:

ogr2ogr -s_srs "+proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.999994 +x_0=100000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3408 +no_defs" -t_srs EPSG:32130 output.shp input.shp

让我们来看看这里发生了什么:

-s_SRS参数显式定义了数据的投影。这里使用的参数是从epsg文件中的epsg定义(在本例中是32130)中提取的(有关查找epsg定义的更多详细信息,请参阅前面的常见问题解答)。epsg文件中的ri条目如下:

# NAD83 / Rhode Island
<32130> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.999994 +x_0=100000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs  no_defs <>

您可以看到初始命令中的定义是如何制定的。注意“+Units=m”参数已更改为“+to_Meter=0.3408”。这对转换很重要。0.3408的值是从哪里来的?从epsg文件!它有很多好处,所以只要运行“grep”来测量“epsg”,你就可以在需要的时候刷新你的记忆。

命令中的下一个参数是“-t_srs epsg:32130”。此命令告诉ogr2ogr将数据转换为EPSG代码32130。声明后,只需为新形状文件声明一个文件名,并设置将哪个文件用作输入(注意:请确保不要混淆这两个文件的顺序)。

按回车键,轰炸,并享受您的新数据米!

如何帮助改进此网站上的文档?

新的文档资料和对现有文档的更正绝对是非常受欢迎的。这些贡献是通过跟踪软件缺陷和增强的同一问题跟踪器来处理的。

MapServer Documentation.

如果您有不符合文档定义的提示或示例,最好将它们放在MapServer wiki中:https://github.com/MapServer/MapServer/wiki