前面的测试中我们使用shape文件作为地图数据源,下面我们将从Oracle Spatial空间数据库读取地理数据。
mapserver提供两种方式连接oracle空间数据库,native oracle spatial和ogr。安装包提供了支持native
oracle spatial的二进制文件,ogr方式需要自行编译源代码。借用以往项目的Oracle
10.2.0.3数据库,MapServer采用ms4w_2.3.1已编译包,地图服务器安装Oracle10.2客户端,进行本地网络配置,测试连接
正常。
关闭Apache MS4W Web
Server服务,进入\ms4w\Apache\cgi-bin\ignored-libmap\oracle11g目录,将libmap.dll复制
粘贴到\ms4w\Apache\cgi-bin目录,替换原有文件,启动Apache MS4W Web Server服务。
新建一个Mapfile文件,LAYER部分如下
LAYER
NAME "road"
TYPE LINE
CONNECTION "geouser/123456@geodb" #数据库连接字符串
CONNECTIONTYPE oraclespatial #连接类型为oracle spatial
DATA "GEOLOC FROM NAV_ROAD1 USING SRID 4326" #此处GEOLOC为GEOMETRY字段名,NAV_ROAD1为表名
PROJECTION
"init=epsg:4326" #必须指定SRS编码
END
DUMP TRUE
CLASS
STYLE
COLOR 0 128 128
END
END
END
DATA标签使用如下格式
"[geom_column]
FROM
[table]| [(SELECT [...]
FROM [table]|[Spatial Operator]
[WHERE condition] )]
[USING [UNIQUE column]| [SRID #srid]| [FUNCTION]| [VERSION #version]
]"
注意:不要在FROM之前加入属性字段名,属性字段可添加在FROM后的子查询中,如下所示 GEOLOC FROM (SELECT MI_PRINX AS OID, NAME AS ONAME, COLOR AS COLOR, GEOLOC AS GEOLOC FROM NAV_ROAD1) USING SRID 4326 LABEL或STYLE用到的属性字段必须包含在SELECT子查询中。 修改openlayers客户端代码 var ms_layer = new OpenLayers.Layer.WMS(
"Test Map",
"/cgi-bin/mapserv.exe",
{
layers: 'road',
map: 'I:/cn_data/c2.map',
format: 'png'
},
{
reproject: false,
'numZoomLevels': 20,
gutter: 15,
buffer: 0
}
);
打开浏览器,查看效果。
为图层添加标注(Label)
在地图上标注文字,必然涉及到字体,MapServer采用与操作系统无关的设计,不能自动获知当前操作系统下安装了哪些字体,必须手工创建字体集FONTSET文件。
该文件的格式非常简单,每行配置一个字体,左边是字体名(可自由命名),右边是字体文件的路径(请使用绝对路径),如下所示:
arial C:\WINDOWS\Fonts\arial.ttf
sans C:\WINDOWS\Fonts\SIMSUN.TTC
将以上内容保存为文本文件,文件名和扩展名不限,例如保存为fonts.txt
在Mapfile的Map标签下添加一行
FONTSET fonts.txt #指明字体集文件,可以包含路径
在Mapfile的Layer标签中添加一行
LABELITEM "NAME" #指明标注所用的字段名
在Layer下的CLASS标签中添加以下内容
LABEL
COLOR 0 0 0
OUTLINECOLOR 255 255 255
FONT "sans" #此处sans对应宋体SIMSUN.TTC
TYPE truetype
SIZE 6
POSITION AUTO
PARTIALS FALSE
ENCODING GBK #此处为文字编码,如果不设置该值,中文将不能正确显示。对于中文Windows系统,操作系统的默认编码为GBK。
END
注意:ms4w_3.0beta11属于开发版本,支持shape文件数据源配置label标签,不支持oracle spatial数据源配置label标签。
为了读取oracle空间表中的属性生成标签,我们换用ms4w_2.3.1正式版,系统工作正常。
使用动态样式(STYLE)
实际应用中对地图的渲染有很多要求,MapServer支持动态设置STYLE,修改Mapfile文件LAYER的STYLE,例如:
STYLE
COLOR [COLOR]
END
每条道路的颜色由道路表的属性字段COLOR决定,与之类似,可以从数据库取值填充SYMBOL,SIZE,ANGLE等标签。
提示:MapServer的颜色码可以使用[r] [g] [b]十进制格式,也可以使用Web开发中常用的RRGGBB十六进制格式,例如:#FF0000
我们看过很多例子介绍了EditText与TextView同步的方法,都是通过让EditText控件添加按键监听器来实现,在监听器中让TextView中的值显示为EditText中输入的内容,从而实现了基本的同步功能,大致的实现方法如下:
editText.setOnKeyListener(new EditText.OnClickListener(){
public boolean onKey(View v,int keyCode,KeyEvent event)
{
textView.setText(editText.getText());
return false;
}
});
今天ATAAW.COM来给大家介绍另一种能让EditText与TextView同步的绝世武功,这门功夫需要炼成一种叫做TextWatcher的东西,下面我们一起来练这门功夫,掌握绝世秘诀,从而实现更加专业的同步功能。
TextWatcher自身是一个接口,首先需要实现这个接口并覆盖其三个方法,分别为Text改变之前,改变之后以及改变的过程中各自发生的动作相应,这里我们只需要实现EditText在文本发生改变时候让TextView的内容跟着发生变化。
editText.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s,int start,int count,int after){
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
textView.setText(editText.getText());
}
});
可以看出TextWatcher是专门用来监听文本变化的,正因为它的这个技能,正是我们实现同步的功能所需要的
package com.example.ReadAsset; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import java.io.IOException; import java.io.InputStream; public class ReadAsset extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.read_asset); try { //Return an AssetManager instance for your application's package InputStream is = getAssets().open("index.txt"); int size = is.available(); // Read the entire asset into a local byte buffer. byte[] buffer = new byte[size]; is.read(buffer); is.close(); // Convert the buffer into a string. String text = new String(buffer, "GB2312"); // Finally stick the string into the text view. TextView tv = (TextView) findViewById(R.id.text); tv.setText(text); } catch (IOException e) { // Should never happen! throw new RuntimeException(e); } } }
main.xml
<?xml version="1.0" encoding="utf-8"?> <ScrollView android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:paddingTop="50dip"> <TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text /> </ScrollView>
.然后在工程里面新建一个assets文件夹,随便放一个index.txt的文件在其中,运行
Ctrl+F11进行测试即可;
http://edison-cool911.iteye.com/blog/695145