地理编码API主要由PL/SQL程序包SDO_GCDR中的一些相关函数构成。该包的定义如下:
这些函数的输入参数都是一个地址,其返回值为地理坐标信息。它们之间的不同在于返回信息的量和输入地址的格式。下面对这些函数进行一一说明。
1.GEOCODE_AS_GEOMETRY
该函数将输入的地址转换成一个SDO_GEOMETRY对象返回。
username是包含特定国家地理编码表的Oracle模式(Schema)名称(一般与用户名相同)。这是一个必须输入的参数。如果地理编码表所在的模式与调用函数所在的模式相同,也可以使用SQL内置的USER。如果地理编码表所在的模式与调用函数所在的模式不同,则需要具有对地理编码表的查询权限。
addr_lines是一个SDO_KEYWORDARRAY类型的输入参数,是一个简单的字符串数组,用来向地理编码函数传递地址。每行的地址必须根据GC_PARSER_PROFILEAFS的结构,按照合适的顺序和格式书写。一般而言,街道放一行,城市放一行,州或省和邮编放一行。这里需要注意的是,街道与门牌号一般只能单独成行,城市、州或省、邮编可以放在一行,也可以分别单独成行。例如,下面三种格式都是有效的。
这里“1250Clay Street”是街道和名牌号码,“San Francisco”是城市,“CA”是一个国家的州或省名,“94108”是邮编。
country是一个国家的ISO编码。例如,美国为US,中国为CN。
该地理编码函数总是尽量返回一个地理位置信息。如果门牌号码不存在,则会返回街道上的某个门牌号对应的几何体。如果街道不存在,则会返回邮政区域的中心或城市中心。下面的例子演示了如何在程序中使用该函数:
返回的结果为:
MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE(-122.413561836735,37.793287755102,null),null,null)
也可以采用下列代码调用该函数:
2.GEOCODE
GEOCODE是一个主要的地理编码函数。与GEOCODE_AS_GEOMETRY不同之处在于这个函数返回的是一个完全格式化的地址和编码,根据返回的值可以准确地知道地址的匹配度。(www.xing528.com)
username是包含特定国家地理编码表的Oracle模式名称(一般与用户名相同)。这是一个必须输入的参数。如果地理编码表所在的模式与调用函数所在的模式相同,也可以使用SQL内置的USER。如果地理编码表所在的模式与调用函数所在的模式不同,则需要具有对地理编码表的查询权限。
addr_lines是一个与GEOCODE_AS_GEOMETRY函数的addr_lines输入参数含义相同的SDO_KEYWORDARRAY类型的输入参数。
country是一个国家的ISO编码。例如,美国为US,中国为CN。
match_mode主要用于决定输入地址与地理编码目录中数据的匹配程度,如果没有指定这个参数,则将采取默认模式。如表4-1所示。
表4-1 匹配模式参数表
续表4-1
函数执行后返回一个SDO_GEO_ADDR类型的对象,包含了地理编码操作的详细结果。SDO_GEO_ADDR在MDSYS方案中的定义如下:
从上面可以看出,这个结构体含有非常全面的地理编码信息。其中几个主要信息条目包括经纬度坐标、定居点、城市名称、地区名称、邮政编码、街道名称、名牌号等。GEOCODE函数很强大,但是也有局限性——它仅返回一个匹配结果。当输入的地址有多个匹配结果的时候,则只会返回它们中的第一个。而后面要介绍的GEOCODE_ALL则能返回所有的匹配结果。
3.GEOCODE_ALL
有些地址比较模糊,则可能会导致多个匹配结果。GEOCODE_ALL函数与GEOCODE函数类似。它们接受的参数完全相同,只不过GEOCODE_ALL返回的是一个数组对象。
4.其他常见函数
除了上面几个函数外,地理编码还有一些其他的函数,如用于结构化的地理编码的函数GEOCODE_ADDR、GEOCODE_ADDR_ALL;还有用于反地理编码的一些函数,如REVERSE_GEOCODE等。REVERSE_GEOCODE是最常用的反地理编码函数,下列代码展示了如何使用该函数:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。