gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:2704回复:2

MapObjects开发指南 地址匹配及查找定位

楼主#
更多 发布于:2003-07-28 11:23
在我们所建立和管理的文件中,地址及地点名称是最常见的地理信息数据库中可以根本没有诸如纬度值,经度值或图象坐标之类的空间信息,但却存有大量有关地理邮政方面的数据.计算机可根据地址确定的一些位置自动地建立一个绘图层,并能自动访问到大量地图中的属性信息.MapObjects中包括一系列OLEAutomation目标,这些目标是专为地址匹配及根据地点名称查找定位任务而设计的.地址匹配是指在地图上找到并标明每条地址所对应的位置,它也称为地理编码.
下面是本章的概要:
.街道文件的必备条件
.交互式地址匹配
.地址转换及标准化
.批地址匹配
.查找十字路口
.查找所给地点名称位置并定位
AddressMatcher(地址匹配)目标要求你指定一个GeoDataset(地理数据设置),其中包括街道中心线,地址变动范围以及分别适用于单个和成批地址匹配的方法的设定.AddressLocation(地址定位)目标中的代码具有表明一条地址是否被解析以及如何被解析的作用,如果地址已被解析,它还能显示匹配地址的地理位置.
匹配地址
AddressMatcher,Address和AddressLocation目标用于交互式批地址匹配.首先,我们必须了解街道文件成立的具体要求,然后我们将讨论如何使用这些目标进行地址匹配.
用于地址匹配的专用文件
要进行地址匹配操作,你就必须有一个街道文件,其中包括具有地址信息的街道中心成路段.街道文件可以是一个图形文件.也可以是一个SDE(存储分配部件)层.一个适用于地址匹配的街道文件必须满足以下三个基本条件:
1.街道文件中必须有街道中心线段,并在街道交叉处形成清晰的结点.除了街道中心线段外,街道文件中不能再有其它任何特征.
2.这些中心线段中的每一段都必须至少具备以下五个要素:(字段);街道名称,街道左边的起始地址,街道右边的起始地址,街道左边的结束地址,街道右边的结束地址.
3.右边的一对地址和左边的一对地址必须分别编上双号和单号.这也就是说,任何一边的起点和终点地址必须同时为双号或同时为单号;而每一对左右两边的地址编号则形成互补,即一单一双.显然,一条道路的左和右取决于你所行驶的方向,街道文件则遵循以下的协定:街道的左右视起点到终点的方向而定.
MapObjects中的地址匹配目标是为美国使用而设计的.但只要你能够使用符合上述要求的街道文件,即使在世界其它地区,你也能够使用它们进行地址匹配.不过街道两边的地址编号必须是一边为双,一边为单.
另外,地址匹配目标也适用于中等长度的街道文件,如一个跨市中县的街道文件,但它们并不能设计成为大范围内的国家街道文件,比如一个囊括美国所有街道的文件.如果你的街道文件确实跨越了一个很大的地理区域,那么你可以自由使用一些地址中的城市名,邮政编码及乡村名以帮助你解决地址匹配问题.下面是街道文件的图解一览表:
1.街道文件是由具有规定的左,右两边及起点,终点特征的中央线路组成.其中左,右边之分取决于由起点到终点的方向.
2.地址数据是按各个路段储存起来的.储存的4个数值有:Left-From(左起点),Right-Trom(右起点),Left-To(左终点),Right-To(右终点).在美国,街道一边的地址号为双数,而另一边则为单数.
3.地址匹配,或地理编码,就是一个通过地址中某路段的起始,终了位置,并同时考虑到单双号因素,以确定地理位置的过程.
4.如果你指定了一个分支,那么估算出的地址位置将落在该路段垂直线上的左边或右边.
5.除了返回一个位置,地址匹配还返回标准化地址数据值,包括房号,街道名,首字符串和尾字符串,房号和邮区号码.
在美国,你可以使用由TIGER(地理地形综合密码参考系统)文件衔变而来的图形文件,这种文件由人口普查署以低廉的价格提供,或者你也可以使用由销售商提供的其它一些文件,这些文件有的是由TIGER文件增强功能后的新版本,有的则是完全由他们自己新开发出的版本.通常使用由商业渠道提供的街道文件要比你自己再去建立一个要快捷有效得多.
在应用过程中,你也许不会有一些其它包括附加通路信息的图层,如街道镶边石线这类信息,但这些必须与用于地址匹配的街道文件分离开来成为一个独立的图层.实际上,你会有一个可见的绘有镶边石线的图层以及一个不可见的绘有街道中心线的地址匹配图层.

街道绘制文件
当你利用街道文件和地址匹配工作时,如果你使描绘道路镶边石的详细的设计图层可见,而使用于地址匹配的街道中心线图层不可见,那么你就能绘制出一个精彩的界面.然而,那些绘有详细的街道边饰的设计图层通常并不很实用.这里有一个帮助你在实际运用过程中使绘制出的街道文件实现的技巧.
表格左边的街道文件是用一根简单的1单位宽度的细实线绘制的.而表格右边,同样的街道文件被绘制了两次.首先用5单位宽的粗黑实线绘制一次,然后再用3单位宽的白实线绘制一次.将两个图层重叠起来就形成了双线道路的效果
只要用几分钟的时间,你就可以在MapContralProperties(图象控制功能)窗口自己绘制出这张图.绘制两张同一街道文件的图层,如上所述分别使用不同颜色及粗细的线条,然后叠加起来.将黑线的图层放在下面.
如果你用这种方法绘图,建议你最好仅在某一区域内使用双线,以免交叉引起混乱.在更小的范围内(当你拉近时),用单线绘制即可.通过在图象控制器的BeforeLayerDraw(前图层绘制)操作中编写代码来估算当前图形范围,定义符号目标(这些符号目标与街道文件的MapLayer(图层)目标相关联)的可见性及大小尺寸,就可以有条理地绘制出一个街道文件.
如果使用ValueMapRenderer(图形赋值)将道路分类绘制,如公路用较粗的线绘制等等,那么你就能更有效地利用这些代码.这样绘制街道文件时,一定要注意规定好不同线条各自的比例尺寸.

地址匹配目标
在MapObjects中,AddressMatcher目标控制整个地址匹配过程.
1.BuildIndex(建立索引)为StreetTable(街道表)建立一个地理编码索引.FindAllStreetNames(查找所有街道名)查找指定字符串开头的街道FindApproximateMatches(查找近似配对)返回与指定街道相似的街道名.GeoCodeTable(地理代码表)用于你所指定的表中的批地址处理.
2.ExactMatches(精确配对)指明MatchAddress(匹配地址)方式是否使用近似匹配.Indexed(检索)返回StreetTable是否已有地理编码索引.Offset(距离)指明与街道中心线段的垂直距离.
3.MatchAddress方法将StreetTable中指定的地址配对并通过AddressLacation(地址定位)将结果返回.MatchIntersection(交叉点匹配)方法查找两条街道的交叉点.StandarolizeAddress(地址标准化)方法解析地址字符串并通过Address目标将标准化的地址返回.
4.StreetTable是街道网络的GeoDataset.Valid(有效的)表明StreetTable和所需字段名是否有效,可以进行MatchAddress和MatchIntersection.这些功能指定了StreetTable的字段名以进行地址匹配CityField(城市字段).CountryField(乡村字段),House-CoordinataField(房屋坐标字段),HouseSuffixField(房号尾字母缩写字段),LeftFromField(左起点字段),LeftToField(左终点字段),LeftzipField(左邮政区字段),PrefixDirection-Field(方向首字母缩写字段),RightFromField(右起点字段)RightToField(右终点字段),RightZipField(右邮政区字段),StateField(国家字段),StreetField(街道字段),StreetType-Field(街道类型字段),SuffixDirectionField(方向尾字母缩写字段).
利用它,你可以找到以指定字符开头的街道名返回与指定街道名相似的街道名,运用批地址匹配和交互地址匹配,找到两条街道交叉的地方,并使地址标准化.
下面是使用AddressMatcher目标的一般步骤:
1.指定一个StreetTable作为GeoDataset目标(该目标是通过DataConnection(数据连接)目标建立的).StreetTable必须满足前文所述街道文件的要求.
2.指定出你的街道文件中出现的地址内容,范围的部分或全部加以定义.你至少需要定义这几个字段:LeftFromField,LeftTo-Field,RightfromField,RightToField,和StreetField.
3.给StreetTable建立一个索引.利用Indexed功能核实一下这个索引是否已经存在.
4.运用下述方法中的一个进行一下你想要实现的地址或街道匹配类型的操作:FindAllStreetNames,FindApproximateMatches,GeocodeTable,MatchAddress,MatchIntersection和Standardize-Address.
AddressMatcher的有些功能有缺省值,如果它们符合你街道文件中的字段,那么不必去改变它们.这些缺省值是:
LeftFromField的缺省值为L-F-ADD
LeftToField的缺省值为L-T-ADD
LeftZipField的缺省值为ZIPL
PrefixDirectionField的缺省值为PREFIX
RightFromField的缺省值为R-F-ADD
RightToField的缺省值为R-T-ADD
RightZipField的缺省值为ZIPR
StreetField的缺省值为NAME
StreetTypeField的缺省值为TYPE
SuffixDirectionField的缺省值为SUFFIX

交互地址匹配
下面是MapObjects中进行交互地址匹配的步骤:
为AddressMatcher目标指定一个街道网络作为StreetTable的属性.这是一个GeoDataset,包括街道中心线.这些街道都有一组标准化字段提供街道及地址信息.
2.检查Indexed属性以确认StreetTable的地理编码索引是否已建立.如果没有,则利用BuildIndex方法建立一个.
3.检查Valid属性以确认StreetTable和指定地址字段(未显示在这张图形中)是否符合地址匹配的要求.
4.进行交互地址匹配最简单的途径是通过MatchAddress方法直接用一个地址字符串.AddressLocation目标被返回.如果成功了,你可以从Location属性中找到地理位置.反之,你可以从Matchcode(匹配代码)中找到失败的原因.
5.进行交互地址匹配的另一条途径是利用StandardizeAddress方法首先建立一个Address目标,然后在Address目标的基础上使用MatchAddress.利用这种方法,你可以访问到邮政编码,城市以及标准化的房号和街道名之类的地址信息.一旦你的地址匹配成功,你就能够进行Map控制器中的绘图操作,如用AfterTrackingLayerDraw(跟踪后图层绘制)在地址匹配成功的位置画一点.
这里有一个简单的代码片断,是在一个名为"C:\Files"的文件夹中查找"Streets"这个图形文件,并在一个固定版本字符串上进行匹配.
注意在这个分段码中无任何可参考的图层.事实上,不使用Map控制器你也能够实现地址匹配,只要在MapObjects中进行OLEAutomation目标操作即可.另外,在这个分段码中几手没有什么判断和检验的过程.与其麻烦地为图形文件名和文件夹编号,还不如操作VisualBasic(可视基础)共用对话来指定文件.

地址定位目标
当你在AddressMatcher上应用MatchAddress方法的时候,一个AddressLocation目标也就建立了.如果匹配成功,内插位置可作为Point(点)从Location属性被返回.查阅Matched(已匹配的)属性以确定匹配是否已查找到.
1.Location是已匹配地址的地理位置.Matched表明地址匹配是否成功
2.MatchCode(匹配代码)返回这些常数中的一个(整型),分别说明地址是如何被解析的或是地址匹配失败的原因.
3.ExactMatches的状态决定地址匹配是否能被调出修改错误.Offset指定个垂直位移值用来估计一个街道左边或右边的位置.
4.StreetSide(街道两侧)以整型的形式返回这些常数中的一个,表明地
址是在街道的哪一侧被发现的.
StreetSide属性返回常数值moLeftSide或moRightSide.该值表明地址是在路段的左边或是右边,左,右的从起点到终点的方向为准.

评估地址匹配
如果你设定AddressMatcher目标的ExactMatches属性为"真",那么街道名的拼写必须是正确的.常数moMatchSuccess会被返回(表明成功),或是以moMatchFailed开头的常数被返回(表明失败)且说明失败原因.
如果你设定ExactMatches为"假",那么寻找匹配的要求就不如此严格,MatchAddress方法会利用逻辑来辨别可能的正确拼写从而获得地址.有7个以moMatchSuccess开头的常数返回时表明成功状态,其后的代码则表明地址是如何被解析的.
下面是可被AddressLocation返回的所有表明MatchCode属性的常数
moMatchSuccess表明一个确定的地址匹配已查找到.如果ExactMatch设定为"真",那么这是唯一可被返回表明成功的常数.
moMatchSuccessUnresolredAmbiguity表明地址已配对,其中一条配对地址被AddressLocation返回,但还有其它候选匹配.例如,如果你键入一条地址"1500Maple",这个常数就会被返回,因为街道文件中既有"MapleDrive"又有"MapleCourt",而1500对于两条街道均是有效房号.然而你无法断定到底哪个候选项被放置在AddressLacttion目标中了.
moMatchSuccessResolredInsertionError表明地址被删去一个多余的字符后被配对.例如,输入的是"318S.MichiiganSt",然而"318S.MichiganSt"才是正确的地址.
moMatchSuccessResolredDeletionError表明地址中插入了一个字符后被配对.例如,"1516Mantcello"被输入,然而正确的地址应该是"1516Manticello".
moMatchSuccessResolredSubstitutionError表明地址中有一个字符被替换后才配对成功.例如,输入的是"1366PaygeLn",然而"1366PaigeLn"才是正确的.
moMatchSuccessResolredTranspositionError表明地址中有两个字字符被交换位置后才配对成功.例如,"1224MiarMante"被输入,然而"1224MiarMante"才是正确的地址.
moMatchSuccessResolredPhoneticError表明地址是在被找到了一个语音替换后才匹配成功的.例如,输入的是"816EastHiStreet",然而正确的地址应该是"816EastHiStreet".
moMatchFailedStreetNotFound表明没有找到指定名字的街道.如果ExactMatches为"假",则表明计算机已试图分析街道名错误拼写的可能原因,但仍然是失败了.
moMatchFailedAddressRangeMismatch表明指定街道名中所有路段的有效范围内都找不到要匹配的房号.例如,输入地址为"428WestFern",然而WestFern中的地址到280号就结束了.
moMatchFailedZipMismatch表明街道表的邮政编码字段中没有地址中指定的邮政编码.
moMatchFailedComparisamFieldMismatch表明相似字段,如街道的后半部分字符,是无效地址.例如,输入"123MainSt",然而街道文件中只有"MainAve"却没有"MainSt".缺省的相似字段有StrsstTypeField,PrefixDiectionField和Suffix-DirectionField.你也可以指定其它字段来作比较.如City-Field,只要你从街道文件中选定一个字段名即可
moMatchFailedVnresolredAmbiguity表明有多个匹配选项.这个代码与moMatchSuccessVnresolredAmbiguity意思一样,只是因为ExactMatches属性设定为"真",所以匹配失败,该常数被返回.
moMatchFailedUnknownReason表明匹配失败,但原因不明.你交发现MatchAddress方法会帮你改正出地址中的大部分拼写错误,但不是全部.这一例外是,MatchAddress不改动街道名的第一个字母,也不会同时显示上面所列MatchCode常数中两个以上的代码.但有一种特殊情况例外,MatchAddress用同音代换改正街道名时也会改动第一个字母,如将"Phern"改成"Fern".

地址目标.
MapObjects可接复你输入任何一个地址(正确的)并返回标准化后的地址.
这表明地址中所见包含的各项,诸如房号,街道首字符,街道名,街道类型,方向字尾等等,都已分类且标准化.例如,街道类型."Arenue"可被输入为"AV","Aer",或"Avenue",而街道类型将被标准化为"AVE".AddressMatcher目标中的一种方法是StandardizeAddress.这种
方法返回的Address目标中的各项均已标准化.
之所以要使地址标准化就是为了便于核实并找出潜在的错误及模棱两可不清楚的地方.另外,你还能利用标准化地址对数据库同类型的数据进行定位和修正.

标准化地址
下面就是StandardizeAddress方法如何处理地址字符串的:
上示图解中并未列出Address目标中的所有字段.其它标准化字段还有HouseCoordinate和HouseSuffix.
在我们讨论交互地址匹配时,你已经看到了一些如何修改街道名中拼写错误
的例子.下面这一小段代码显示出修正后的街道名是如何被返回的.
当地址目标CurAdd由StandardizeAddress方式指定时,它的Street属性中有一值Kearns.
假定当前街道文件中没有KearnsRoad,然而KernsRoad是个有效街道.你也许认为将地址字符串或Addres目标输给MatchAddress方式都可以.但在这里,我们应该将CurAdd这个地址目标输给MatchAddress方式.接下来,地址目标中的Street字段值就将被修正为Kerns.注意,如果你想得到一个正确地址的话,就必须输入一条地址目标而不是地址字符串.
这就是获得修正地址的方式.当--以地址匹配成功后,你可以利用地址目标中的结果更新数据库中的地址数据.

批地址匹配
MatchAddress方式适用于单个地址匹配,而对于一次进行大量地址匹配就不那么得心应手.对于批地址匹配,一般使用Address-Matcher目标下的GeoCodeTable(地理代码表),方法如下:
1建立一个新的DataConnection目标,将其Database属性设置在将有图形文件或SDEDatabase的文件类中.
2建立一个AddressMatcher目标,将其StreetTable属性设置在带有地址信息的GeoDataset中.
3检查Indexed属性以确定街道文件是否已建立索引.如果没有,则用BuildIndex建立一个.
4建立一个Table目标,并将Databose和Name设置到带有你需要匹配的地址的一个ODBC数据源中.
5利用GeoCodeTable方式连同表的名字,该表包括地址以及一个包含需要匹配地址的字段.这种方式将利用你所指定的DataConnection目标列出一张新表,它的名字由你指定.被列为StreetFields(街道字段)的字符串集所指定的字段是你想要从addressTable(地址目录)复制到outputTable(产品目录)中去的字段.
当你用GeoCodeTable进行地址匹配时,你是否需要一个有MapLayers(图层)的Map控制器是任意的.你可以就用OLEAutomation目标(如前文所述)进行地址匹配操作而无需什么可见的图层.
在on-linehelp(行上提示)或MapObjectsProgrammer'sReference(MapObjects操作指南)中查征GeoCodeTable的一个例子VisualBasic代码,看看这此步骤是如何以代码形式实现的.

查找道路交叉点
利用MatchIntersection方式查找两条街道的交叉点.
1建立一个新的DataConnection目标,并将其Database属性设置在一个带有图形文件或SDEDatabase的文件类中.
2建立一个AddressMatcher目标,将其StreetTable属性设置在带有地址信息的GeoDataset中.
3检查Indexed属性以确定街道文件是否有索引.如果没有,则用BuildIndex建立一个.
4利用MatchIntersection进行查找,同时要输入两个你需要确定交叉点的街道名称的字符串.
5返回Paint目标.如果其值为Nathing,则表明未找到交叉点,否则X和Y值就是街道交叉点的位置.
如果查找成功,MatchIntersection方式就会返回一个Paint目标.实际应用时,你可以在Map控制器下利用DrawShape或FlashShape方式在你的图面上将该点画上.

使用地点名称
不用其他地址匹配目标而独立使用PlaceLocater目标也可以返回地点名称所在的位置.你可以单独为PlaceLocater目标建立一个街道文件,但实际上只要是含有地点名称字段的GeoDataset它都能接受.
你可以利用PlaceLocater目标建立的这种工具有时也叫做地名一览表.用一个引导类型或批选一个地名,光标就会自动移到指定的位置.

地点定位目标
下面是如何使用PlaceLocater目标的一览表:
以下是使用Placelocater目标的一般步骤:
1为PlaceLocater目标的PlaceNameTable属性指定个GeoDataset.这个GeoDataset只要包含有地名字段即可.
2利用BuildIndex方式为地名建立索引.查看Indexde属性以确定该索引是否已经建立.
3利用PlaceLocater目标中的一种方式.
利用FindAllPlaceNames返回所有以指定子字符串开头的地名字符串集
利用FindApproximateMatches返回与指定地名相似的地名字符串集.
利用Location返回是有指定地名特征的所有位置的点集.
使用GeoDatasets时,点,线和多边形都可作为PlaceLocater的Place-NameTable的属性.如果GeoDataset采用线的形式,则Locate方式返回的位置都是沿线的起点.如果GeoDataset采用多边形的形式,则Locate方式返回的位置是多边形的自己中心位置.


喜欢0 评分0
终极无间
  • 注册日期
  • 发帖数
  • QQ
  • 铜币
  • 威望
  • 贡献值
  • 银元
1楼#
发布于:2003-08-09 11:38

可不可以把他做成一个系列的
举报 回复(0) 喜欢(0)     评分
alaska
路人甲
路人甲
  • 注册日期2003-08-02
  • 发帖数76
  • QQ
  • 铜币124枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2003-08-09 12:57
定位一个地点是不是需要该地点一定要在数据库里有数据提前存储好?否则数据不存在,系统就无法在地图中定位?
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
3楼#
发布于:2003-08-29 13:35
兄弟们,看文章还得有自己的想法啊,我觉得应该要举一反几啊,匹配和定位在每个行业的应用都是不一样的,是不是都得一个人写出来啊,那是很晕的事情!
举报 回复(0) 喜欢(0)     评分
游客

返回顶部