第5章數(shù)據(jù)查詢(xún)與功能實(shí)現(xiàn)chapter_第1頁(yè)
第5章數(shù)據(jù)查詢(xún)與功能實(shí)現(xiàn)chapter_第2頁(yè)
第5章數(shù)據(jù)查詢(xún)與功能實(shí)現(xiàn)chapter_第3頁(yè)
第5章數(shù)據(jù)查詢(xún)與功能實(shí)現(xiàn)chapter_第4頁(yè)
第5章數(shù)據(jù)查詢(xún)與功能實(shí)現(xiàn)chapter_第5頁(yè)
已閱讀5頁(yè),還剩60頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)據(jù)連接對(duì)象表示到地理數(shù)據(jù)源的連接。MapObjectsShapeCADSDEARC/INFOVPF(矢量產(chǎn)品格式:是國(guó)防部地理數(shù)據(jù)標(biāo)準(zhǔn),由由防衛(wèi)制圖局DMA提供)數(shù)據(jù)源.,的(地址指針),表示一系列可從數(shù)據(jù)源獲得的地理數(shù)據(jù).你可使用方法FindGeoDataset獲取DeleteGeoDataset從一個(gè)數(shù)據(jù)連接對(duì)象中刪除一個(gè)地理數(shù)據(jù)集,你可以通過(guò)將一個(gè)地理數(shù)據(jù)集賦值給一個(gè)Maye對(duì)象的GeoDatset屬性來(lái)使用FindArcInfoCoordinateSystemFindCoordinateSystem你可ConnectDatabase所指定的數(shù)據(jù)源,如果連接成功庫(kù),ConnectionSDEAPI,你可以使用這個(gè)屬性。如果你聯(lián)接到一個(gè)具有版本管理功能的ArcSDE8(或更高版本)數(shù)據(jù)源,你可以使用ReturnVersions方法與Version屬性以選擇數(shù)據(jù)庫(kù)中一個(gè)特別的版本。數(shù)據(jù)連接對(duì)象也支持錯(cuò)誤捕獲.當(dāng)試圖連接到一個(gè)數(shù)據(jù)庫(kù)時(shí)引起錯(cuò)誤,ConnectError屬性ExtendedErrorString返回關(guān)于這個(gè)錯(cuò)誤的一個(gè)值和錯(cuò)誤描述信息。FindGeoDataset 坐標(biāo)系投影元數(shù)據(jù)文件(.prj),位于數(shù)據(jù)連接對(duì)象DonnectionConnect:集合SDEVPFGeoDataset的默認(rèn)屬性是Name。將屬性設(shè)置為AllowSharing真,實(shí)現(xiàn)與其它應(yīng)用程序執(zhí)行對(duì)GeoDataset的共享讀寫(xiě)操作(當(dāng)你沒(méi)有在編輯時(shí))HasZHasMeasure屬性來(lái)判斷地理數(shù)據(jù)集是否支持Z值Measures.HasMeasure:measures的能力HasZ:Z值Fields返回記錄的所有字段的一個(gè)集合.MoveNext可將當(dāng)前記錄的位置指向下一條記錄,MovePreviousMoveFirst使當(dāng)前記錄位置指向第一條記,通過(guò)使用這些缺省屬性,你可以簡(jiǎn)化你的代碼.比如,下面的代碼都將返回同一個(gè)結(jié)果,即當(dāng)前x=myRecordSet("人口"),如果記錄集是可更新的(Updatable為真)Edit方法允許對(duì)當(dāng)前記錄的更新。EditModeDelete方法可從記錄集中刪除一條記錄.,使用AddNew方法可在記錄集中創(chuàng)建一條新記錄Update你想要在更新一條記錄前取消對(duì)它的修改,你可使用CancelUpdate方法以取消任何未提交的修改。在完成編輯后,調(diào)用StopEditing方法來(lái)重新將記錄集相關(guān)的數(shù)據(jù)表以只方法打開(kāi)。如果充分使用它以作為建立新記錄集的模板.設(shè)置AutoFlush屬性的值為假False以避免每一個(gè)修改操作自動(dòng)對(duì)數(shù)據(jù)文件的寫(xiě)入操作.這樣在寫(xiě)入shape文件時(shí)將會(huì)大大增強(qiáng)執(zhí)行效率。如果記錄集支持事務(wù)處理,那么你可以以類(lèi)似的方法使用Edit方法對(duì)一個(gè)外部的數(shù)據(jù)表來(lái)StartTransaction方法,然后執(zhí)行編輯。當(dāng)你完成你的編輯后,如果你想要保存你對(duì)數(shù)據(jù)的修改,你可調(diào)用CommitTransaction方法,或者調(diào)用RollbackTransaction方法使數(shù)據(jù)保持事務(wù)開(kāi)始編輯之前的狀態(tài)。DimMyRecordsetasCount:屬性Count返回值為-1:比如:SDE圖層在這類(lèi)情況下,為了正確地獲取記錄集的屬性Count值,首先由記錄集創(chuàng)建一個(gè)Statistics對(duì)象,然后可以從Statistics對(duì)象的Count屬性獲取記錄的數(shù)目.DimrecsAsNewMapObjects2.RecordsetDimstatsAsMapObjects2.StatisticsSetrecs=oCount=stats.CountMsgBoxEditMode:012Fields:(abeDesc (默認(rèn)).對(duì)記錄的修改自動(dòng)的引起對(duì)數(shù)據(jù)文件寫(xiě)入操作.False對(duì)記錄的修改保存在緩沖區(qū)中,不會(huì)自動(dòng)對(duì)數(shù)據(jù)文件的寫(xiě)入操作這個(gè)屬性?xún)H僅適用Shape文件的矢量圖層的記錄集.設(shè)置AutoFlush屬性為假,可以提高shape文件時(shí)。為了可靠地保存對(duì)記錄的每次修改,應(yīng)該AutoFlush屬性設(shè)置為真True.設(shè)置AutoFlush為真將刷新文件,StopEditing或釋放記錄集Recordset對(duì)象.EOF:當(dāng)你已完成對(duì)記錄集的編輯后,你可以調(diào)用StopEditing以確保與記錄集相關(guān)的地理數(shù)UpdateDimmyRecsetAsPrivateSubDimdc1AsNewMapObjects2.D DimmylyrAsNewMapObjects2.Mayerdc1.Database=App.PathMap1.Layers.AddmylyrMap1.Layers.Item(0).Symbol.Color=moGrayEndDimoSymAsNewIfmyRecsetIsNothingThenExitSubWithoSym.Style=EndWithSetmyRecset=NothingEndDimmyPolyAsMapObjects2.PolygonOnErrorGoToerrs1SetmyPoly=IfErr.Number<>0ThenMsgBoxEndtStart=NowDimoTableAsMapObjects2.TableDescDimoDatasetAsMapObjects2.GeoDatasetDimoConnectionAsNewMapObjects2.D DimoLayerAsNewMapObjects2.MayerDimoFieldAs'Checkoutthepathofyourcurrentdirectory-youmaywishtochange'thispathtoamoresuitablelocation.IfoConnection.ConnectThenSetoTable=IfoDatasetIsNothingThenExitSubEndMap1.Layers.AddoLayeroTempRecs.AutoFlush=False'optimizebynotflushingchangesautomaticallyDimsFldAsMapObjects2.FieldDoWhileNotoRecset.EOFWithoTempRecsSetsFld=oRecset.Fields("Shape")ForEachoFieldInmyRecset.FieldsIfoField.Name="AREA"ThenEndIfEndEndtEnd=DimdurAsdur=Format(tEnd-tStart,MsgBox"Shape文件寫(xiě)入到:&App.PathvbInformation"Shape&durMap1.Layers.Remove1'FirstAddedMap1.Layers("shptemp").Visible=TrueMap1.Extent=Map1.Layers("shptemp").ExtentEnd值值0無(wú)3578點(diǎn)線(xiàn)對(duì)于字段對(duì)象來(lái)說(shuō)這是缺省所屬。Type屬性返回一個(gè)值,表示字段所含數(shù)據(jù)的類(lèi)型:字符型(string點(diǎn)型(point),線(xiàn)型(line),或多邊形類(lèi)型(polygon。Value屬性你可以以變量的形式返回一條指定記錄的字段內(nèi)容或者不用考慮它原來(lái)的類(lèi)型使用ValueAsString屬性以字符的形式返回字段的值。為了將MapObjects的字段對(duì)象與VisualBasic字段對(duì)象相區(qū)別,在變量時(shí)應(yīng)以類(lèi)的全名來(lái)DimfldasDimfldasADODB.FieldDimfldasDimfldas字段集合(Fields

Count:字段集合對(duì)象包含記錄集中對(duì)象中每個(gè)字段的一個(gè)集合。使用缺省的屬性Item可集合中一aString=或aString=.dimfldasset為了將MapObjects的字段集合對(duì)象與VisualBasic字段集合對(duì)象相區(qū)別,在變量時(shí)應(yīng)以類(lèi)DimfldsasDimfldsasDAO.FieldsTableDesc定的相關(guān)屬性,這些屬性包括FieldLength、FieldName、FieldPrecision、theFieldScale、及FieldCount屬性賦值,你可以設(shè)置你想要定義的字段數(shù)目。一但你已經(jīng)完成將根與記錄集關(guān)聯(lián)的字段的定義,以新創(chuàng)建的數(shù)據(jù)描述對(duì)象(TableDesc)作參數(shù)調(diào)用數(shù)據(jù)連接(Donnection)對(duì)象的AddGeoDataset方法,你就可以將一個(gè)地理數(shù)據(jù)集增加數(shù)據(jù)連接對(duì)onction對(duì)于的應(yīng)用程序,你可以使用CodePage屬性給一個(gè)TableDesc對(duì)象設(shè)置合適的代值0通過(guò)相關(guān)dBASE文件的文件頭來(lái)決定TableDesc對(duì)象123

DimdescasNewCodePage:FieldLength(idx:Integer):FieldName(idx:Integer):FieldScale(idx:Integer):數(shù)據(jù)表對(duì)象可以從許多的數(shù)據(jù)源中存取數(shù)據(jù):ActiveXDataObjects(ADO), databases(可以存取Access數(shù)據(jù)),IndexedSequentialAccessMethod(ISAM)數(shù)據(jù)庫(kù),INFO,SDE和ODBC。MapObjects使用數(shù)據(jù)存取對(duì)象(DAO3.5)驅(qū)動(dòng)存取Jet與ISAM數(shù)據(jù)庫(kù)。ISAM數(shù)據(jù)庫(kù)格式包括dBase、FoxPro及Paradox。另外,DAO驅(qū)動(dòng)也可以文本文件數(shù)據(jù)庫(kù)和Excel或Lotus1-2-3工作表。在一個(gè)數(shù)據(jù)表中的記錄可以通過(guò)記錄集對(duì)象的屬性Records存取。數(shù)據(jù)表對(duì)象的、數(shù)據(jù)表對(duì)象可以用在Mayer對(duì)象的AddRelate方法中,也可用于EventRenderer對(duì)象的EventTable屬性ceLocator對(duì)象的ceNameTable屬性,及作為Geocoder對(duì)象的Batatch、在VisualBasic中編程時(shí),為了將MapObjects的數(shù)據(jù)表對(duì)象與VisualBasic數(shù)據(jù)表對(duì)象相區(qū)別,ActiveDataObjectsADO)MapObjects使用它以連接到被提供程序增加MapObjects數(shù)據(jù)表。比如,你可從一個(gè)Access2000數(shù)據(jù)庫(kù)文件中創(chuàng)建一個(gè)MapObjects數(shù)據(jù)表對(duì)象(使用Jet4.0OLEDB提供程序)然后用Mayer的AddRelate方法建立這個(gè)數(shù)據(jù)表到shape文件的一個(gè)關(guān)聯(lián)(通過(guò)一個(gè)關(guān)鍵字段)云南大學(xué)

-spatial MapObjects使用ADOTable20.DLL動(dòng)態(tài)庫(kù)與 DataAccessComponents(MDAC)2.5來(lái)連接到OLEDB數(shù)據(jù)源。你可能在安裝其它應(yīng)用軟件時(shí)已經(jīng)安裝了MDAC2.5(比如ArcInfo8)組件。在VB中,你可以通過(guò)菜單“工程”-“”操作,在出現(xiàn)的框中查找同OLEDB提供者要求不同的聯(lián)接字符串參數(shù)。通過(guò)使用數(shù)據(jù)連接向?qū)憧梢圆榭醋址?。更詳?xì)的信息可以參考MSDN或OLEDB驅(qū)動(dòng)同時(shí)安裝的幫助文檔通過(guò)創(chuàng)建并使用數(shù)據(jù)文件(*.udl)你可以知道你的計(jì)算機(jī)支持哪一種OLEDB數(shù)據(jù)源。首先在一個(gè)合適的位置上點(diǎn)擊右鍵,在出現(xiàn)的右鍵菜單中選擇新建一個(gè)文本文件,將它改成合適的名稱(chēng)并將文件的擴(kuò)展屬性改為.udl。然后雙擊這個(gè)文件,將顯示數(shù)據(jù)向?qū)Э颍ㄒ部梢訨etEngine Jet4.0OLEDBAccesspTable.Database="Provider= ExcepTable.Database="Provider= Source=C:\MyExcel.xls;ExtendedProperties=Excel8.0;HDR=Yes;"pTable.Database="Provider= Source=c:\folder;ExtendedProperties=dBASEIV;UserSQLServer: OLEDBProviderforSQLServerTrustedConnection:SQLOLEDBProviderCatalog=pubs;IntegratedSecurity=SSPI;" OLEDBProviderforODBCDriverspTable.Databse="[Provider=MSDASQL;]{DSN=name|FileDSN=filename};[DATABASE=database;]UID=user;PWD=password"

Server:User:

表達(dá)式可以這樣構(gòu)建:=POP2000>=POP1990*1.1(POP2000POP1990DimrecsMOAsMapObjects2.RecordsetPrivateSubcmdMO_Click()DimtblMOAsNewMapObjects2.TableDimtdescMOAsMapObjects2.TableDescDimiAs'ConnecttoexternaldBASEfile'MODAO方式'MOADO方式'tblMO.Database="Provider= .Jet.OLEDB.4.0;DataSource="&App.Path&";ExtendedProperties=dBASEIV;PersistSecurityInfo=True"tblMO.Name云南州界'CreateaRecordsetobjectfromthesourcetableSetrecsMO=tblMO.Records'GettheRecordset'stabledescriptiontogetthefieldnamesSettdescMO=recsMO.TableDesc'PopulatetheCombo2boxwiththefieldnamesFori=0TotdescMO.FieldCount-1EndSubPrivateSubDimcnnAsNewADODB.Connection cnn.ConnectionString="Provider=.Jet.OLEDB.4.0;DataSource="&App.Path&";ExtendedProperties=dBASEIV;PersistSecurityInfo=True"mandTextSelect*from云南州界"Setcmd1.ActiveConnection=cnnSetrecsADO=cmd1.ExecuteForEachrstInrecsADO.FieldsNextrstEndPrivateSubCombo1_Click()DimiAsInteger'DoUntilrecsDAO.EOFDoUntilrecsADO.EOFList1.AddItemrecsADO.Fields(Combo1.Text).ValueEndPrivateSubDoUntilEndSub一但你創(chuàng)建了一個(gè)統(tǒng)計(jì)Statistics對(duì)象,你可以返回以下這些統(tǒng)計(jì)屬性Max極大值Min極小值),Mean(平均值),StdDev(均方差),Sum(總和),Count(記錄集中記錄的個(gè)數(shù)).Max:Min:Mean:Sum:MapObjects如何查詢(xún)各類(lèi)幾何對(duì)象(點(diǎn),線(xiàn)段,多邊形)所代表對(duì)象Mayer方法:SearchShape(shape, searethodexpression要達(dá)式,則使用一個(gè)空字符串(""),這個(gè)方法返回由符合空間查詢(xún)條件的要素組成的記錄集 CAD文件)(SDE圖層導(dǎo)出的記錄集對(duì)象賦ExpressionSQL'where'MapObjects遵遁ANSISQL標(biāo)準(zhǔn),而不是JetDatabaseEngineSQL標(biāo)準(zhǔn).moPointInPolygon:使用此參數(shù)要求Objmayer是一個(gè)多邊形圖層,shape是一個(gè)點(diǎn)對(duì)象;對(duì)象Mayer方法:SearchByDistance(shape,tolerance,expressionSQL語(yǔ)法的字符串。如果你要省略表達(dá)式,(""),這個(gè)theTolMap1.ToMapDistance(SEARCHTOLPIXELS*Screen.TwipsPerPixelX)(將地圖控件上3個(gè)像素所表示的距離轉(zhuǎn)換成地圖單位表示的距離,以此確定容錯(cuò)距離)Screen.TwipsPerPixelX返回水平度量對(duì)象(TwipsPerPixelX)的每一像素中的緹數(shù)。(緹是上的一致性。1Twip=1/20Point=1/1440Inch=1/567cm(打印時(shí)的一英寸或一厘米所對(duì)應(yīng)的屏ExpressionSQL'where'MapObjects遵遁ANSISQL標(biāo)準(zhǔn),而不是JetDatabaseEngineSQL標(biāo)準(zhǔn).象,你可以指定一個(gè)記錄集對(duì)象來(lái)表示shape文件(ARC/INFOVPF文件或CAD文件)(SDE圖層導(dǎo)出的記錄集對(duì)象賦形圖層。按F5運(yùn)行例子,看看有什么樣的效果!IfButton=vbLeftButtonSetMyCircle=Map1.TrackCircleEndIfEndPrivateSubMap1_AfterLayerDraw(ByValindexAsInteger,ByValcanceledAsBoolean,ByValhDCAsstdole.OLE_HANDLE)IfNotMyCircleIsNothingradius=MyCircle.Width*DimsymAsNewMapObjects2.Symbolsym.SymbolType=moFillSymbolsym.Style=moSolidFillsym.color=IfNotrecset.EOFThenMap1.DrawShaperecset,symEndsym.color=moRedsym.Style=moLightGrayFillMap1.DrawShapeMyCircle,symEndIfEnd5.32From2Form2中顯示查詢(xún)結(jié)果的相關(guān)于屬性。并DimsymAsNewMapObjects2.SymbolPrivateConstSEARCHTOLPIXELS=6DimbufClickAsMapObjects2.PolygonPublicrecsAsMapObjects2.RecordsetPrivateSubCommand1_Click()'AddLayertothemapDimdcAsNewDonnectionDimgsAsGeoDatasetDimnameAsCommonDialog1.Filter=" Shapefiles(*.shp)|*.shp"IfLen(CommonDialog1.FileName)=0ThenExitdc.Database=IfNotdc.ConnectThenExitname=Left(CommonDialog1.FileTitle,Len(CommonDialog1.FileTitle)-4)Setgs=dc.FindGeoDataset(name)IfgsIsNothingThenExitSetlayer=NewMayerlayer.GeoDataset=gsEndPrivateSubForm_Load()Command1.Caption加載圖層"Check1.Caption="選擇要素"Option1.Caption="moPointInPolygon"Option2.Caption="moAreaIntersect"Label2.CaptionSearchByDistance"Option3.Caption="SearchBydistance"CommonDialog1.InitDirApp.Path&YNprj"EndUnloadEndIfNotfoundShapeIsNothingAndMap1.Layers.Count>0ThenSelectCaseMap1.Layers(0).shapeTypeCasesym.SymbolType=moPointSymbolCasemoLinesym.Style=moSolidLinesym.Color=moYellowCasesym.SymbolType=moFillSymbolsym.Style=moSolidFillsym.Color=moYellowEndEndIfIfNotbufClickIsNothingDimsymbfAsNewMapObjects2.Symbolsymbf.SymbolType=moFillSymbolsymbf.Style=moGrayFillsymbf.Color=moBlueEndSetfoundShape=NothingSetbufClick=NothingEndIfMap1.Layers.Count=0ThenExitIfOption1.ValueTrueAndMap1.Layers(0).shapeTypemoPolygonThenMsgBox"非多邊形要素圖層,不支持此查詢(xún)"EndIfIfCheck1.Value=1ThenFindFeaturex,yIfShift=0IfButton=vbLeftButtonSetMap1.Extent=Map1.TrackRectangleEndIfIfButton=vbLeftButtonDimrectAsNewMapObjects2.RectangleSetrect=Map1.Extentrect.ScaleRectangle(1.2)SetMap1.Extent=rectSetMap1.Extent=Map1.FullExtentEndIfEndIfEndDimmapPtAsDimshpAsObjectSetmapPt=Map1.ToMapPoint(x,Setrecs=Map1.Layers(0).SearchShape(Map1.Extent,moEdgeTouchOrAreaIntersect,"")minDist=mapPt.DistanceTo(recs.Fields("shape").Value)DoWhileNotthisDist=shp.DistanceTo(mapPt)'Map1.FlashShapeshp,IfthisDist<minDistThenminDist=thisDistSetfoundShape=shpEndIfEndDimshpAsSetrecs=Map1.Layers(0).SearchShape(pt,moPointInPolygon,"")Ifrecs.Count=0ThenExitSubSetfoundShape=shpEndDimshpAsDimptAsNewMapObjects2.PointDimtheTolAsDoubletheTol=Map1.ToMapDistance(SEARCHTOLPIXELS*Screen.TwipsPerPixelX)Label3.Caption="tolerence:"&theTol&vbCrLf&"TPPX:"&Screen.TwipsPerPixelXSetpt=Map1.ToMapPoint(x,y)Ifrecs.Count=0ThenExitSubSetfoundShape=shpSetbufClick=pt.Buffer(theTol,Map1.Extent)'EndDimptAsNewMapObjects2.PointSetpt=Map1.ToMapPoint(x,y)FindPolygonptCallFindClosest(x,y)CallFindLineOrPoint(x,y)EndEnd ial 云南大學(xué) 使用MayerSearchShape(p,moPointInPolygon,"")方法查詢(xún)多邊形要素的屬性對(duì)象:Mayer方法:AddRelatecheckFields:(可選參數(shù))AddRelate方法在關(guān)聯(lián)數(shù)據(jù)表之間是AddRelate在一個(gè)Mayer和一個(gè)數(shù)據(jù)表間建立關(guān)聯(lián)。其結(jié)果是包含來(lái)自Mayer中的所有記錄及來(lái)自外部數(shù)據(jù)表新的屬性字段的一個(gè)記錄集。如果在外部數(shù)據(jù)表中找到與fromField與toField字段的值對(duì)應(yīng)的記錄,則新的屬性字段就有相應(yīng)的匹配值。你應(yīng)確保由sourceTable指定的外部數(shù)據(jù)表中的字段名稱(chēng)與Mayer對(duì)象中的字段名稱(chēng)不如果是,如果以上都滿(mǎn)足,指定的字段類(lèi)型是不是以下這些,中的任何一個(gè)不是被支持的類(lèi)型那么AddRelate將返回假False,關(guān)聯(lián)也不會(huì)成功。checkFieldsTrue。當(dāng)參數(shù)checkFieldsTrue時(shí)AddRelate方法對(duì)外部數(shù)據(jù)表中的關(guān)鍵字段fromField執(zhí)行進(jìn)一步的檢查。以下以被執(zhí)行的檢查:如果不是,fromField(MapObjectsfromField的索引,fromField字段上是否存在索引,這樣有助于可以從要關(guān)聯(lián)的數(shù)據(jù)源中更快如果不是,fromField字段上創(chuàng)建索引并檢查是否成功如果以上的任一個(gè)條件為真,AddRelatecheckFieldsfalse,則不作上面進(jìn)行步的檢查。且如果第一步的檢查成功的話(huà),AddRelate將成功執(zhí)行。根據(jù)包含外部數(shù)據(jù)表的那個(gè)數(shù)據(jù)庫(kù)的不同情況,MapObjects有時(shí)不能不執(zhí)行以上第二步的一系列檢查。如果使用某一個(gè)ODBC驅(qū)動(dòng)程序不支持一些必須的功能的話(huà)將導(dǎo)致這種情況的發(fā)生。在這種情況checkFields設(shè)為假;Oracle視圖的關(guān)聯(lián)時(shí)。這個(gè)操作應(yīng)的執(zhí)行,特別是面對(duì)巨型的數(shù)據(jù)時(shí),與一個(gè)沒(méi)有索引的數(shù)據(jù)表進(jìn)當(dāng)要進(jìn)行關(guān)聯(lián)的數(shù)據(jù)表不是當(dāng)前用戶(hù)所獨(dú)占時(shí),也可使用checkFields參數(shù)。如果在數(shù)據(jù)表對(duì)象的User屬性中所指定的那個(gè)用戶(hù)對(duì)要進(jìn)行關(guān)聯(lián)的數(shù)據(jù)表沒(méi)有足夠的權(quán)限,MapObjects就不能執(zhí)行必須的創(chuàng)建索引的操作。在這種情況下,checkFields參數(shù)應(yīng)該設(shè)為假False.如果是在SDE中執(zhí)行關(guān)聯(lián)操作,你可能想使用FilterTables和FilterExpression屬性來(lái)建立關(guān)聯(lián).對(duì)基于SDE的一個(gè)Mayer,你只能將它與在同一個(gè)SDE數(shù)據(jù)庫(kù)中的其它數(shù)據(jù)表進(jìn)行關(guān)聯(lián)。在SDE中執(zhí)行關(guān)聯(lián)操作的更詳細(xì)的信息將在第7章中介紹。5.4'ADO2.5對(duì)象OptionDimpTableAsNewMapObjects2.Table'要關(guān)聯(lián)的外部數(shù)據(jù)表 PrivateSubcmdGetData_Click()'將圖層與數(shù)據(jù)表關(guān)聯(lián)'ADOcommandconnectionpDimconnStrAsStringconnStr="Provider=.Jet.OLEDB.4.0;DataSource="&App.Path&"\云南省行政區(qū)代SQLStrSelect*from市級(jí)行政區(qū)代碼DimlyrFldNameAsStringDimtblFldNameAsStringlyrFldNameGBCODE"tblFldName國(guó)家代碼'ADO連接到數(shù)據(jù)表(SQL語(yǔ)句MsgBox"返回的記錄數(shù):"&pLyr.Records.CalculateStatistics("FeatureID").CountpLyr.Records.ExportApp.Path&"\results.shp"'EndIfEndIfEndFunctionConnectToTable(connStrAsString,SQLStrAsString)AsBoolean'使用OLEDB驅(qū)動(dòng)及ADO建立到外部數(shù)據(jù)表的聯(lián)接DimpConnAsNewADODB.Connection pConn.ConnectionString=connStrpConn.Mode=adModeRead'只讀方式 pCommand.ActiveConnection=mandText=SQLStr'設(shè)置數(shù)據(jù)表對(duì)象的Command屬性SetpTable=NewMapObjects2.Table mand=pCommandDimrecsAsMapObjects2.RecordsetSetrecs=pTable.RecordsIfrecsIsNothingThenEndIfEnd'加載圖層DimdcAsNewMapObjects2.DonnectionDimgdsAsMapObjects2.GeoDatasetSetpLyr=NewMapObjects2.Mayerdc.Database=databaseStrSetgds=dc.FindGeoDataset(lyrName)SetpLyr.GeoDataset=gdsEnd'將外部數(shù)據(jù)表與圖層關(guān)聯(lián)DoAddRelate=pLyr.AddRelate(lyrFldName,pTable,tblFldName)EndFunctionPrivateSubCommand1_Click()IfNotpLyr.BuildIndex(TrueThenMsgBox"不能創(chuàng)建索引"EndIfEndPrivateSubDimrecsAsNewMapObjects2.RecordsetSetrecs=Map1.Layers(0).RecordsMap1.Layers.Item(0).Symbol.ColormoGrayCallResetListBoxEndPublicSubDimrecsAsMapObjects2.Recordset'ResettheRecordsetvariableSetrecs=pLyr.Records'Clearthefieldlist'RebuildthefieldDimtdescAsMapObjects2.TableDescSettdesc=recs.TableDescDimiAsFori=0Totdesc.FieldCount-Iftdesc.FieldName(i)<>"Shape"Andtdesc.FieldName(i)<>"FeatureId"ThenlstFields.AddItemtdesc.FieldName(i)NextiEndPrivateSubDimrecsAsNewMapObjects2.RecordsetSetrecs=Map1.Layers(0).RecordsDimstrsAsNewMapObjects2.StringsDimstrAsStringstr=DimDoUntilrecs.EOFFori=0Tostrs.Count-1NextLabel1.Caption共有&i&個(gè)值EndPrivateSubselFld=Map1.Layers(0).FilterExpression=selFld&"='"&List1.List(List1.ListIndex)&Map1.Layers(0).FilterExpression=selFld&"="&EndIfMsgBoxpLyr.FilterExpressionMap1.Layers(0).FilterExpression=""EndpLyr.FilterExpression=""End實(shí)例5.5查詢(xún)多屬Form1OptionDimrecsAsMapObjects2.RecordsetDimsymAsNewMapObjects2.SymbolPrivateSub'MakeaDimlrAsNewMapObjects2.LabelRendererlr.Field=" DimdcAsNewMapObjects2.DonnectionDimmlyrAsNewMapObjects2.Mayerdc.Database=App.PathSetmlyr.Renderer=lrMap1.Layers.Addmlyr'Buildpolygonsymbolsym.Style=moGrayFillsym.Color=moLightYellowEndEnd'ifapolyisselected,drawitinred.IfNotrecsIsNothingThenEndIfEndDimptClickAsMapObjects2.PointDimstrPicLocAsString'Findthepolythattheuserclickedon.SetptClick=Map1.ToMapPoint(x,'Ifnothingclickedon,thenbailout.Ifrecs.Count=0ThenExitSubEndIf'Gettheimagenameoutofthelayer'srecordsetstrPicLoc=recs.Fields("pic_name").Value'LoadtheimageForm2.Picture1.Picture=LoadPicture(App.Path&"\img\"&'OpenthepictureEndSubForm2PrivateSubMe.Top=Me.Left=Form1.Left+EndSetPicture1.Picture=EndGIS應(yīng)用的另一個(gè)問(wèn)題是:滿(mǎn)足條件的地理要素在哪里?( 應(yīng)當(dāng)注意MapObjects遵ANSISQL標(biāo)準(zhǔn),JetDatabaseEngineSQL"SELECT*FROMCITIESWHEREPOP2000>SQL的最初目的,檢SQL決不僅僅是一個(gè)查詢(xún)工具。SQLDBMSSQL數(shù)據(jù)語(yǔ)言SQLStructuredQueryLanguage)SQL語(yǔ)言還包括更新、插入與SELECT–UPDATEDELETE––SQL數(shù)據(jù)定義語(yǔ)言SQL(DDL)(鍵指定表之間的,及在數(shù)據(jù)表之間強(qiáng)制約束SQLDDL語(yǔ)句是CREATETABLE創(chuàng)建新的數(shù)據(jù)庫(kù)表ALTERTABLE–修改數(shù)據(jù)庫(kù)表DROPTABLE–刪除數(shù)據(jù)庫(kù)表CREATEINDEX–(檢索鍵)DROPINDEX–刪除索引SQL數(shù)據(jù)控制語(yǔ)言(DCL) SearchExpression時(shí),expressionMapObjects直接解析和執(zhí)行,也可接符(-)比如象LAYER-ID。這個(gè)連接符可能會(huì)被SearchExpression錯(cuò)誤地解析。為了避免注意括號(hào)中的部分將被解析為“STATE-況請(qǐng)參考MapObjects的聯(lián)機(jī)文檔。如果表達(dá)式expression長(zhǎng)度為零(也就是表達(dá)式expression是一空字符串""),SearchExpression將返回包含Mayer或數(shù)據(jù)表Table中所有記錄的記錄集。如果表達(dá)式expression無(wú)效,記錄集的屬性Records.EOF就為真。當(dāng)基于一個(gè)字符串字段進(jìn)行查詢(xún)時(shí),你可以用一個(gè)通配符來(lái)表示不確定的字符。使用百分號(hào)(%)來(lái)表示多個(gè)字符,(_)表示單個(gè)字符,比如要在一個(gè)圖層中查詢(xún)GBCODE字段內(nèi)容GBCODElike 以上這些通配符只對(duì)MapObjects能夠使用內(nèi)建的檢索方式進(jìn)行查詢(xún)的那些數(shù)據(jù)源類(lèi)型管ADOSDE矢量圖層,expressionSQLWHERE從句被直接傳遞到數(shù)據(jù)源,因而表達(dá)式應(yīng)該符從數(shù)據(jù)源所使用的準(zhǔn)則。注意,在查詢(xún)ArcSDEforCoverages數(shù)據(jù)源的一個(gè)圖層時(shí),應(yīng)該使用INFO的語(yǔ)法。根據(jù)Mayer或數(shù)據(jù)表的數(shù)據(jù)源類(lèi)型不同,表達(dá)式expression可能對(duì)英文字母大小寫(xiě)敏感的。疑問(wèn),應(yīng)確保字段名稱(chēng)的大小寫(xiě)規(guī)則與原始的數(shù)據(jù)源中的大小寫(xiě)規(guī)則是一樣的。SearchExpression不支持INFO表。在被關(guān)聯(lián)的一個(gè)SDE數(shù)據(jù)表中在一個(gè)字段上執(zhí)行SearchExpression操作可能是非常耗時(shí)的。因而要限制表達(dá)式expression只使用基本的SQL語(yǔ)coverageSDE不支持,SDE圖層不適用。POP1990>100000ORDERBY如果要查詢(xún)特別大的數(shù)據(jù)集(大于10萬(wàn)條記錄),應(yīng)該考慮將數(shù)據(jù)在SDE里而不Shape文件.SDE中,FilterExpressionSearchExpression在執(zhí)行查詢(xún)時(shí)不會(huì)使用在獨(dú)立文件里的索引信息,比如dBase索引文件(*.mdx),ArcView(*.ain,*.aih),MapObjects會(huì)使用空間5.6OptionDimg_symSelectionAsMapObjects2.SymbolDimrecSelectionAsMapObjects2.RecordsetPrivateSubMap1_AfterLayerDraw(ByValindexAsInteger,ByValcanceledAsBoolean,ByValhDCAsstdole.OLE_HANDLE)Ifindex>0ThenExitIfrecSelectionIsNothingThenExitSubIfNotrecSelection.EOFThenMap1.DrawShaperecSelection,g_symSelectionEndIfSetrecSelection=EndPrivateSubDimstrExpAs"EndIfMap1.Layers(0).Records.Fields(Combo1.List(Combo1.ListIndex)).Type=moStringThenstrExp=Combo1.List(Combo1.ListIndex)&""&Combo2.List(Combo2.ListIndex)&"'"&Combo3.Text&strExp=Combo1.List(Combo1.ListIndex)&""&Combo2.List(Combo2.ListIndex)&""&EndSetrecSelection=EndPrivateSubLabel1.MoveMap1.Left,Map1.Top+Map1.Height+180,Map1.Width/2,400Combo1.MoveLabel1.Left,Label1.Top+Label1.Height+60,Map1.Width*0.4Combo2.MoveCombo1.Left+Combo1.Width+60,Combo1.Top,(Map1.Width*0.2)-60Combo3.MoveCombo2.Left+Combo2.Width+60,Combo1.Top,Map1.Width*0.4Command1.MoveMap1.Width*3/8,Combo1.Top+Combo1.Height+60,Map1.Width/4,Combo1.Height*EndPrivateSubDimdc1AsNewMapObjects2.D DimlyrAsNewMapObjects2.MayerDimgdsAsMapObjects2.GeoDatasetdc1.Database=App.PathIfgdsIsNothingThenSetlyr.GeoDataset=gdsEndIfWithMap1IfNot.Layers.Count=1Then.Layers(0).Symbol.Color=moDarkGreenEndWithLabel1.Caption選擇符合以下條件的要素:"Command1.Caption="查詢(xún)"DimfldLyrAsForEachfldLyrIn 'EndIfNextEndWith''Listoperatorsinsecondcombobox..AddItem.AddItemEndWithCall'SetupsymbolfordrawingSetg_symSelection=NewMapObjects2.SymbolWithg_symSelectionEndWithEndPrivateSubCallEndPrivateSubIfLen(Combo1.List(Combo1.ListIndex))>0Then'I tethroughrecordsetofMayer.DimrecLyrAsMapObjects2.RecordsetSetrecLyr=Map1.Layers(0).RecordsDimstrNameAsStringDoWhileNotEndIfEnd這是地理信息分析處理中常要問(wèn)題,也是在地理信息系統(tǒng)中實(shí)現(xiàn)圖形—屬性對(duì)位檢索的前GIS信息分析方法中對(duì)已有矢量數(shù)據(jù)的 在使用矢量圖層對(duì)象(Mayer)的SearchShape方法時(shí),MapObjects定義了如下的常數(shù):在描述部分,術(shù)語(yǔ)“要查找的幾何對(duì)象”SearchShapeshape參數(shù)所定義的對(duì)象。Mo值012345完全或部分地處在要查找的幾何對(duì)象中;完全或部分地包含了要查6何對(duì)象不是多邊形的話(huà),圖層就必須是多邊形要素圖層,這個(gè)方法此方法與moContainedBy所定義的查找方法類(lèi)似,不同之處是:此7moAreaIntersect相同,8對(duì)象必須處要素形成的軌跡上。如果是一個(gè)點(diǎn)要素圖層,那么9 含 返回圖層中完全被要查找的幾何對(duì)象包含的那些要素,不包括幾何如果參數(shù)ShapeLinePolygon,Points,則shape所有部分被視為一個(gè)整體。比如,在以moContainedBy方式查詢(xún)一個(gè)“多部件”多邊形時(shí),Polygon將只返回能夠完整地包含這個(gè)多邊形所有部份的要素。對(duì)表達(dá)式進(jìn)行限定,使之符合相關(guān)數(shù)據(jù)庫(kù)的SQL語(yǔ)法中WHERE從句的要求。如果矢量圖層Mayer是具有Z值的要素組成,就可使用三維的矩形作為參數(shù)進(jìn)行查詢(xún)操那么它們才是滿(mǎn)足條件的記錄,才會(huì)將它們放到查詢(xún)結(jié)果記錄集中。注意moExtentOverlap是唯MapGeometryEnvironment屬性必須正確地設(shè)置。當(dāng)對(duì)一個(gè)來(lái)自SDE數(shù)據(jù)源的矢量圖層Mayer對(duì)象使用SearchShape方法時(shí),要查找的幾ExtentSearchShape方法之前,為了保證要查找的幾何對(duì)象有效,可使用Intersects方式來(lái)測(cè)試要查找的幾何對(duì)象邊界是否位于Intersect方法來(lái)剪切要查找的幾何對(duì)象使之處于Mayer的邊界之內(nèi)。DimmapPtAsNewDimtsymAsNewPrivateSubIfCheck1.Value=1EndEndPrivateSubCommand1_Click()'LoadthetwoDimdcAsNewMapObjects2.DonnectionDimgdsAsMapObjects2.GeoDatasetDimmlyrAsNewMapObjects2.Mayerdc.Database=App.PathSetmlyr.GeoDataset=gdsmlyr.Symbol.Color=moLightGrayMap1.Layers.AddmlyrSetgds=NothingSetmlyr=NothingSetmlyr.GeoDataset=gdsmlyr.Symbol.Color=moBlueMap1.Layers.AddmlyrEndPrivateSub'Thissubhereiswheretheworkisbeingdone,'sofarascityvaluesbeingwrittenoverinto'thestreetlayer'sattributerecordset.DimroadsLayerAsMapObjects2.MayerDimroadRecsAsMapObjects2.RecordsetDimcityRecsAsMapObjects2.RecordsetDoWhileNotcityRecs.EOFSetroadRecs=roadsLayer.SearchShape(cityRecs.Fields("shape").Value,DoWhileNotroadRecs.EOFEndPrivateSubDimrecsAsrecs.AutoFlush=FalseDoWhileNotrecs.EOFrecs.Fields("所屬州").ValueEndPrivateSub="DimfntAsNewStdFontfnt.Name="Arial"fnt.Size=10mapPt.x=0mapPt.y=EndIfmapPt.x<>0EndEndIfMap1.Layers.Count<1ThenExitIfCheck1.Value=0ThenIfShift=0ThenIfButton=1EndIfIfButton=1DimrectAsNewMapObjects2.RectangleSetrect=Map1.Extentrect.ScaleRectangle(1.2)SetMap1.Extent=rectSetMap1.Extent=Map1.FullExtentEndIfDimselrecsAsMapObjects2.RecordsetDimtolAsDoubleSetmapPt=Map1.ToMapPoint(x,y),Ifselrecs.Count>0citynameselrecs.Fields("所屬州").ValueIfcityname=""Thencityname沒(méi)有數(shù)據(jù)"EndIfEndIfEndEnd實(shí)例 OptionConstselPixel=DimrecAsDimevtBufferAsNewMapObjects2.PolygonDimselRecsAsMapObjects2.RecordsetPrivateSubDimrecsAsNew'DimthePartsAsMapObjects2.Points'Dim'ifalineisfound,extracttheshapeandstoreitingLinevariable,setmeasuresand'populatelistboxeswithmeasuresandoffsetmeasuresWhileNotrecs.EOFDimgLineAsIfNotgLine.IsFullyMeasuredThenEndListVgLine,0EndSubPrivateSubMap1.Extent=EndPrivateSubDimdc1AsNewMapObjects2.DonnectionDimlyrAsNewMapObjects2.Mayerdc1.Database=App.Path&"\YNPrj"Map1.Layers.AddlyrMap1.Layers.Addlyr1Setr=Map1.FullExtentr.ScaleRectangle(1.2)SetMap1.FullExtent=SetMap1.Extent=EndPrivateSubMap1_AfterLayerDraw(ByValindexAsInteger,ByValcanceledAsBoolean,ByValhDCAsstdole.OLE_HANDLE)IfrecIsNothingThenExitDimsymAsNewMapObjects2.Symbolsym.SymbolType=moLineSymbolsym.Color=moRedIfNotrec.EOFEndIfevtBufferIsNothingThenExitSubsym.Color=moYellowMap1.DrawShapeevtBuffer,symEndIfselRecsIsNothingThenExitSubDimstrAsStringstr=IfselRecs.Count>0ThenWhileNotselRecs.EOFstr=str&vbNewLine&selRecs("CITY_NAME").ValueAsStringSetselRecs=NothingEndIfEndDimLineEventAsMapObjects2.LineDimaLineAsMapObjects2.LineDimptAsNewMapObjects2.PointSetpt=Map1.ToMapPoint(X,Y)DimdstAs,Ifrec.Count<1ThenExitSubSetaLine=rec("shape").ValueCallListV(aLine)SetLineEvent=aLine.ReturnLineEvent(0,100000)IfNotLineEventIsNothingThenIfCheck1.ValueThenIfCheck2.ValueThenEndIfEndEndIfEndIfEndPrivateSubListV(gLineAsMapObjects2.Line,OptionalboolClsAsInteger=DimiAsDimthePartsAsMapObjects2.PointsIfboolCls=1ThenList1.ClearForEachthePartsIngLine.PartsFori=0TotheParts.Count-1 IftheParts(i).Measure=0Then 'EndIfNextiEndSetlnBuffer=ln.Buffer(dst,IfNotlnBufferIsNothingThen EndEnd=End5.9OptionPrivatedcAsMapObjects2.DonnectionPrivatemlyrAsMapObjects2.MayerPrivaterecsSelAsMapObjects2.RecordsetPrivaterecsAdjAsMapObjects2.RecordsetPrivatesymSelAsMapObjects2.SymbolPrivatesymAdjAsMapObjects2.SymbolPrivatestrOBfldAsString’PrivateSub'ClearandresetallSetrecsSel=NothingSetrecsAdj=SetMap1.Extent=EndPrivateSubstrOBfld='LoadshapefileasnewSetdc=NewMapObjects2.DonnectionSetmlyr=NewMapObjects2.Mayerdc.Database=App.Pathmlyr.Symbol.Color=moLightGray'ZoomoutaDimrectAsMapObjects2.RectangleSetrect=Map1.FullExtentrect.ScaleRectangle1.1SetMap1.FullExtent=rectSetMap1.Extent=rect'SelectSetsymSel=NewMapObjects2.SymbolWithsymSel.Style=.Color=.OutlineColor=moRedEndWithSetsymAdj=NewMapObjects2.SymbolWithsymAdj.Style=EndWithEnd'Ifselectedrecordsexist,drawthemIfHasRecords(recsAdj)ThenMap1.DrawShaperecsAdj,symAdjEndIfIfHasRecords(recsSel)ThenEndEndDimptClickedAsMapObjects2.PointDimpolySelAsMapObjects2.PolygonDimrectNewExtentAsDimpolyThisAsDimrectPolyThitentAs'Getthemouse'Makethemouseclickselection,orSetrecsSel=mlyr.SearchShape(ptClicked,moPointInPolygon,"")IfNotHasRecords(recsSel)ThenSetrecsSel=NothingSetrecsAdj=NothingExitSubEndIf'GetthepolygonclickedSetpolySel='Selecttheadjacent'SetrecsAdj=mlyr.SearchShape(polySel,moEdgeTouchOrAreaIntersect,"Objectid>0ORDERBY"&strOBfld&"desc")'BuildanewCallLoadList(recsAdj)SetrectNewExtent=polySel.ExtentEndIf'Zoomtothenewextent,outalittlerectNewExtent.ScaleRectangle1.1SetMap1.Extent=rectNewExtentEnd'ReturnTRUEonlyiftheRecordsetex

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論