Truy xuất địa chỉ từ file cad (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

tôi có 2 câu hỏi.
1. Biên giới mỗi thôn được tạo từ một loạt các Polyline? Nói cách khác nó được tạo từ đường gấp khúc khép kín qua một loạt điểm? Có thể đọc được tọa độ của những điểm đó? Chắc chắn phải đọc được.
2. Tọa độ của điểm thuộc mỗi thôn và các điểm ở phần 1 được tính trong cùng hệ tọa độ? Tức nếu trong các điểm ở phần 1 có điểm P với toạ độ (100, 200) và ta có điểm cần xét với tọa độ (100, 200) (không nhất thiết là điểm thuộc thôn) thì có nghĩa là ta đang xét điểm P? Nói cho cùng thì chúng có thể được tính trong 2 hệ tọa độ khác nhau nhưng ta biết được gốc tọa độ O' có tọa độ bao nhiêu trong hệ Oxy.
Nếu câu trả lời cho 2 câu hỏi trên là TRUE thì tôi nghĩ có thể dùng hàm API CreatePolygonRgn để tạo region rồi dùng hàm PtInRegion để xét xem điểm cho trước có thuộc region hay không.
Trước hết rất vui khi bạn tham gia và khẳng định làm được, về lý thuyết câu trả lời cho 2 câu hỏi trên là đúng, thực tế bản đồ địa chính không ngon lành như vậy, có khi không khép kín, các line chồng đè nhau, hơn nữa không thể phân biệt được line nào thuộc về ranh giới vùng (thôn) nào, để cung cấp các tham số cho hàm CreatePolygonRgn gặp nhiều khó khăn, nếu giải quyết từng thôn một thì OK. Cho nên ta phải lợi dụng công cụ của autocad tút lại dữ liệu đầu vào một chút, sau đó giải quyết bài "điểm có nằm trong đa giac?" bằng cách sử dụng GDI cũng rất OK.
Chúc bạn có ngày cuối tuần vui vẽ!
 
Cảm ơn!
Em gửi cái File tổng thể (nhưng chưa chuyển qua CAD). Trong này toàn bộ thửa đất đo đã nằm trong khu đo toàn xã. Nhờ bác nghiên cứu có thể trút từ CAD ra cái Excel có cả địa danh "Địa chỉ tọa lạc của thửa đất" đc kg đỡ đc một công đoạn.
http://www.mediafire.com/myfiles.php#
Tôi thật sự không có nhiều thời gian, nhưng tôi sẽ làm khi có thể, bạn thấy đó tôi vào diễn đàn từ rất lâu, nhưng chỉ mới tham gia có 2 chủ đề, tôi thường vào xem lúc rỗi, hầu hết các chủ đề đều có nhiều người tham gia học hỏi, truyền đạt, góp ý... Còn vấn đề của bạn sao mà ít người quan tâm thế, cho nên tôi mới mạo muội viết vài dòng.
Chúc bạn cuối tuần vui vẽ!
 
Lần chỉnh sửa cuối:
Còn vấn đề của bạn sao mà ít người quan tâm thế, cho nên tôi mới mạo muội viết vài dòng.
Chúc bạn cuối tuần vui vẽ!
Em tham gia diễn đàn này lâu, nhưng toàn nhận chứ chưa cho ai thứ gì. Vì kg có kiến thức thì có gì mà cho hả bác, lắm lúc cũng thấy áy náy, và có lần góp ý với diễn đàn làm cách nào đó để khi những người như em hay ai đó có nhu cầu về tài nguyên trên diễn đàn ủng hộ bằng cách "Nhắn tin" để diễn đàn có kinh phí hoạt động vả lại tạo sự công bằng giữa "cho" và "nhận", nhưng chưa được diễn đàn cho phép.
Tôi thật sự không có nhiều thời gian, nhưng tôi sẽ làm khi có thể, ..
Thi thoảng bác vào góp tý tài nguyên cho bọn em xài ké nhé.
Sợ Bác bận nên em hơi tham lam vụ này: Bác sửa cho em cái "tên Thôn" đúng với tài liệu ban đầu trong File Cad. Nếu có thể bác tặng em cái Code và chỉ cho cách làm luôn với. (Bác gửi cho em vào đây với E-Mail là : olan.bmt@gmail.com).
 
Lần chỉnh sửa cuối:
Trước hết rất vui khi bạn tham gia và khẳng định làm được

Tôi chỉ dám nghĩ là nếu 2 câu trả lời đều đúng thì có thể dùng ... Tôi chưa dám khẳng định chắc chắn.

về lý thuyết câu trả lời cho 2 câu hỏi trên là đúng

Theo như những gì bạn viết ở dưới thì câu trả lời cho câu 1 là không đúng.

thực tế bản đồ địa chính không ngon lành như vậy, có khi không khép kín, các line chồng đè nhau, hơn nữa không thể phân biệt được line nào thuộc về ranh giới vùng (thôn) nào

Câu hỏi 1: "Nói cách khác nó được tạo từ đường gấp khúc khép kín qua một loạt điểm?"
Tôi hiểu là "bản đồ địa chính không ngon lành như vậy, có khi không khép kín", như vậy câu trả lời cho câu hỏi 1 là KHÔNG ĐÚNG chứ.
Tôi chỉ nghĩ rằng khi 2 câu trả lời đều đúng thì mới dùng CreatePolygonRgn và PtInRegion. Ý tưởng thế thôi còn đúng là dùng được hay không thì phải nghiên cứu cụ thể.

Cho nên ta phải lợi dụng công cụ của autocad tút lại dữ liệu đầu vào một chút

... và sau khi tút rồi thì mỗi thôn được "gói" gọn trong 1 polyline khép kín. Lúc này thì câu trả lời cho câu 1 là đúng. Vậy có thể dùng CreatePolygonRgn và PtInRegion. Việc đọc các Coordinate thì dễ rồi. Tôi đã thử đọc các điểm của 1 polyline (từ hình vẽ đã tút của bạn) rồi vẽ nó ra (hàm API Polygon) thì thấy rất đẹp. Vấn đề còn lại là cái "tút" kia. Tôi nhìn hình vẽ bạn đã tút lại thì thấy hết các polyline.
Bạn đã tút như thế nào? Chả lẽ tút "tay", tức chọn một số polyline "rời" rồi gộp chúng thành 1 polyline khép kín? Tôi hỏi vì tôi cũng không rành mấy thao tác này.
Tôi nghĩ bạn đã đưa lên diễn đàn thì nên đưa code. Bạn đưa EXE thì chỉ giải quyết bài cho người hỏi, người khác không học được gì. Bạn đưa con cá cho người hỏi thì cũng tốt nhưng nếu bạn dậy cách câu thì nhiều người sẽ học hỏi được ở bạn, công lao của bạn có ích hơn. Tóm lại, bạn nên đưa code. (kể cả cái tút kia)

Chúc bạn cuối tuần vui vẽ!

Tôi cũng chúc bạn mỗi ngày một niềm vui. Và nhiều thời gian rỗi cho mình và cho những người thân của mình.
 
Lần chỉnh sửa cuối:
Em cũng chúc các bác Sức khỏe dồi dào, thường vào đây thăm nom tụi em.
 
Lần chỉnh sửa cuối:
Theo như những gì bạn viết ở dưới thì câu trả lời cho câu 1 là không đúng.
Tôi đã nói "theo lý thuyết..." tức là quy định trong địa chính là thế, vì vậy có những bản đồ phường xã rất tốt, cho nên nhiều người nghĩ nó là đúng, với những người thường thao tác trên BĐĐC mới thấy nó rối rắm như thế nào, nếu sủ dụng từng tờ, xã phường thì cũng chưa thấy gì, nhưng nếu ghép cả thành phố thì ...có khi "gian nan bắt đầu nản".
Tôi chuẩn bị BĐ và viết code đúng như những gì đã nói ở trang 1, kể cả việc đưa code tối nay(máy đang sd không có chứa code). Thật ra việc "tút" này nhằm giải quyết vấn đề thôi chứ nó sai quy định của BDDC(chồng đè polyline).
Tôi hiểu siwtom đang nói đến "Win32 GDI API", các bạn khác đừng nhằm với " AutoCAD API"

 
Lần chỉnh sửa cuối:
Tôi đã nói "theo lý thuyết..." tức là quy định trong địa chính là thế, vì vậy có những bản đồ phường xã rất tốt, cho nên nhiều người nghĩ nó là đúng, với những người thường thao tác trên BĐĐC mới thấy nó rối rắm như thế nào, nếu sủ dụng từng tờ, xã phường thì cũng chưa thấy gì, nhưng nếu ghép cả thành phố thì ...có khi "gian nan bắt đầu nản".
Tôi chuẩn bị BĐ và viết code đúng như những gì đã nói ở trang 1, kể cả việc đưa code tối nay(máy đang sd không có chứa code). Thật ra việc "tút" này nhằm giải quyết vấn đề thôi chứ nó sai quy định của BDDC(chồng đè polyline).

Tôi hiểu siwtom đang nói đến "Win32 GDI API", các bạn khác đừng nhằm với " AutoCAD API"


Ý tôi hỏi về bài cụ thể này mà.
Tất nhiên mọi thao tác, thêm thắt để giải quyết vấn đề là làm trên bản sao thôi.
Chính xác, ý tôi nói API là Windows API - WinAPI, vì còn nhiều cái có API lắm.
 
Cảm ơn các bác!
Em nhờ các bác chế biến (dữ liệu được mang sang) để cho Excel truy xuất ngay trong WB.
 
Cảm ơn các bác!
Em nhờ các bác chế biến (dữ liệu được mang sang) để cho Excel truy xuất ngay trong WB.
Với ý sử dụng WinAPI của siwtom thì giải quyết ngon vân đề nay đấy, đầu tiên trich tọa độ ranh thôn sang excel lưu trữ, sau đó tìm địa danh bằng cách chạy pointInPolygon (sd WinAPI) mà không cần autocad nữa.
 
Đây là 2 hàm chính, các bạn có thể download prj chế biến tùy ý.
Mã:
Public Sub Main()  
   On Error Resume Next
   Set oAutocad = New clsAutocad
   Set AutoCAD = oAutocad.ACADApp
   Set Thisdrawing = oAutocad.Document
   Dim lngCol As Long, lngRow As Long
   Dim txt As AcadText
   Dim pt(2) As Double
   Dim s As String
   Dim soThua As String
   Dim oLayer As AcadLayer
   On Error Resume Next
   Set oLayer = Thisdrawing.Layers.Add("SoThua")
   GetExcel
   pt(2) = 0
   For lngRow = 1 To exRang.Rows.Count
      soThua = exRang(lngRow, 1)
      pt(0) = Val(exRang(lngRow, 2))
      pt(1) = Val(exRang(lngRow, 3))
      Set txt = Thisdrawing.ModelSpace.AddText(soThua, pt, 1)
      txt.Layer = "SoThua"
       'Thisdrawing.Regen acActiveViewport
      exRang(lngRow, 4) = timDiaDanh
      txt.Delete
   Next lngRow
   
thoat:
Set txt = Nothing
Set oLayer = Nothing
freeApp
End Sub


Private Function timDiaDanh() As String
   Dim tenDiaDanh As String
   Dim ssPoly As AcadSelectionSet
   Dim ssSoThua As AcadSelectionSet
   Dim ssTenDiaDanh As AcadSelectionSet
   Dim fType(2) As Integer, fData(2)
   Dim fT(2) As Integer, fD(2)
   
   tenDiaDanh = ""
   On Error Resume Next
   Set ssPoly = Thisdrawing.SelectionSets("ssPoly")
   If Err Then Set ssPoly = Thisdrawing.SelectionSets.Add("ssPoly")
   ssPoly.Clear
   fType(0) = 0: fData(0) = "POLYLINE,LWPolyline" '"TEXT"
   fType(1) = 8: fData(1) = "polygon"
   fType(2) = 67: fData(2) = 0
   ssPoly.Select acSelectionSetAll, , , fType, fData
   
   fType(0) = 0: fData(0) = "TEXT"
   fType(1) = 8: fData(1) = "TenDiaDanh"
   
   fT(0) = 0: fD(0) = "TEXT"
   fT(1) = 8: fD(1) = "SoThua"
   fT(2) = 67: fD(2) = 0
   
   On Error Resume Next
   Set ssTenDiaDanh = Thisdrawing.SelectionSets("ssTenDiaDanh")
   If Err Then Set ssTenDiaDanh = Thisdrawing.SelectionSets.Add("ssTenDiaDanh")
   ssTenDiaDanh.Clear
   
   On Error Resume Next
   Set ssSoThua = Thisdrawing.SelectionSets("ssSoThua")
   If Err Then Set ssSoThua = Thisdrawing.SelectionSets.Add("ssSoThua")
   ssSoThua.Clear
   Dim ent As AcadText
   Dim poly As AcadEntity
   Dim dblCurCords() As Double
   Dim dblNewCords() As Double
   Dim iMaxCurArr, iMaxNewArr As Integer
   Dim iCurArrIdx, iNewArrIdx, iCnt As Integer
   
   For Each poly In ssPoly
      If poly.ObjectName = "AcDbPolyline" Then
         dblCurCords = poly.Coordinates
         iMaxCurArr = UBound(dblCurCords)
         iMaxNewArr = ((iMaxCurArr + 1) * 1.5) - 1
         ReDim dblNewCords(iMaxNewArr) As Double
         iCurArrIdx = 0: iCnt = 1
         For iNewArrIdx = 0 To iMaxNewArr
            If iCnt = 3 Then
               dblNewCords(iNewArrIdx) = 0
               iCnt = 1
            Else
               dblNewCords(iNewArrIdx) = dblCurCords(iCurArrIdx)
               iCurArrIdx = iCurArrIdx + 1
               iCnt = iCnt + 1
            End If
         Next
         ssSoThua.Clear
         ssSoThua.SelectByPolygon acSelectionSetWindowPolygon, dblNewCords, fT, fD
         If ssSoThua.Count > 0 Then
            ssTenDiaDanh.Clear
            ssTenDiaDanh.SelectByPolygon acSelectionSetWindowPolygon, dblNewCords, fType, fData
            Set ent = ssTenDiaDanh(0)
            tenDiaDanh = ent.TextString
            ssSoThua.Delete
            Exit For
         End If
      End If
   Next poly
   Set ssPoly = Nothing
   Set ssSoThua = Nothing
   Set ssTenDiaDanh = Nothing
   Set ent = Nothing
   Set poly = Nothing
   
   timDiaDanh = tenDiaDanh
   
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Bác sửa cho em cái "tên Thôn" đúng với tài liệu ban đầu trong File Cad. Nếu có thể bác tặng em cái Code và chỉ cho cách làm luôn với. (Bác gửi cho em vào đây với E-Mail là : olan.bmt@gmail.com).
- Sửa tên thôn rất dễ, chỉ việc doubleclick vào text rồi đánh lại thôi (tôi sd bảng mã VNI bởi vì nhằm cad2007 chỉ support unicode cho mtext, thật sự tôi không thích viết cho mọi cad mặc dù có thể)
- sủ dụng lệnh BOUNDARY trong cad để tạo polyline đóng kín (chú ý zoom cái thôn lên cho vừa màn hình, đừng vượt khổi màn hình, lấy màn hình lớn lớn tý ít bị lỗi hơn)
2 việc trên là rất đơn giản với các anh em đo đạc
Tôi nghĩ bạn làm được
Chúc sức khỏe!
 
Lần chỉnh sửa cuối:
Xin lỗi các bạn, tôi nhằm, cad 2007 đã support unicode tốt (nhằm với 2004). cho nên ta có thể đánh tên thôn với bảng mã unicode cũng ok .
 
Với ý sử dụng WinAPI của siwtom thì giải quyết ngon vân đề nay đấy, đầu tiên trich tọa độ ranh thôn sang excel lưu trữ, sau đó tìm địa danh bằng cách chạy pointInPolygon (sd WinAPI) mà không cần autocad nữa.
Vụ này bác siwtom giúp tay với!

Sửa tên thôn rất dễ, chỉ việc doubleclick vào text rồi đánh lại thôi ...
Anh em làm được rồi bác à!
Còn mấy vụ kia các bác bày giúp.
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom