Progam do odczytywania rzędnej wysokościowej punktu ?


Recommended Posts

Witam

Jest taka strona internetowa : Głównego Urzędu Geodezji i Kartografii : http://services.gugik.gov.pl/nmt/

na niej jest możliwość uzyskania punktu rzędnej wysokościowej znając współrzędną x i y

wystarczy wkleić jako link strony dla współrzędnej x=486617 i y=637928 np:
https://services.gugik.gov.pl/nmt/?request=GetHByXY&x=486617&y=637928
gdzie x, y - współrzędne w układzie PUWG92

pojawi się wysokość punktu z=110.5

Teraz chodzi o to aby napisać program w LISP, który :

- tworzy punkt w ZWCAD, odczytuje jego współrzędne x i y

- tworzy adres strony odpowiednio ze współrzędną x i y

- łączy się ze stroną internetową i kopiuje podany punkt wysokości z do programu (głównie chodzi o tą część)

- przesuwa wcześniej wstawiony punkt na odpowiednią wysokość współrzędnej z

Pytanie czy ma ktoś jakiś pomysł i czy jest możliwe by taki program działał w LISP(ZWCAD) ?

tutaj mała podpowiedź, gdzieś w internecie znalazłem ale nie wiem jak ten fragment kodu wykorzystać ? (nie jestem aż tak biegły w LISP)

(defun c:geturltext ( url / obj rtn )
    (if (setq obj (vlax-create-object "winhttp.winhttprequest.5.1"))
        (progn
            (setq rtn
                (vl-catch-all-apply
                   '(lambda nil
                        (vlax-invoke-method obj 'open "GET" url :vlax-false)
                        (vlax-invoke-method obj 'send)
                        (vlax-get-property  obj 'responsebody)
                    )
                )
            )
            (vlax-release-object obj)
            (if (vl-catch-all-error-p rtn)
                (prompt (vl-catch-all-error-message rtn))
                (vl-list->string
                    (mapcar '(lambda ( x ) (lsh (lsh x 24) -24))
                        (vlax-safearray->list (vlax-variant-value rtn))
                    )
                )
            )
        )
    )
)

z góry dziękuje za każdą podpowiedź

Pozdrawiam

Adam

 

Link to post
Share on other sites

Takie coś na razie mnię wyszło. Komenda zwraca do linii poleceń komunikat z odczytaną rzędną wysokosciową na podstawie odpowiedzi z portalu. 

Jak ma wstawiać metkę albo blok to trzeba jeszcze pokodzić. Jest również metoda ConvertPoint3dToCoordinate na razie pusta, gdyby zaszła potrzeba wprowadzenia konwersji układów współrzędnych.

using System.Net.Http;
using ZwSoft.ZwCAD.ApplicationServices;
using ZwSoft.ZwCAD.EditorInput;
using ZwSoft.ZwCAD.Geometry;
using ZwSoft.ZwCAD.Runtime;

namespace GetHeightByCoordinates
{
    public static class Commands
    {
        [CommandMethod("CK_GetHbyXY")]
        public static void GetHeightByCoordinateXY()
        {
            var (X, Y) = ConvertPoint3dToCoordinate(GetPoint());
            var height = GetHeight(X, Y);
            Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"\n{height}");
        }

        public static string GetHeight(double coordinateX, double coordinateY)
        {
            string url = $"https://services.gugik.gov.pl/nmt/?request=GetHByXY&x={coordinateX}&y={coordinateY}";

            return new HttpClient().GetAsync(url).Result.Content.ReadAsStringAsync().Result;
        }

        private static Point3d GetPoint()
        {
            PromptPointOptions pPtOpts = new PromptPointOptions("\nWskaz punkt na mapie: ");
            PromptPointResult pPtRes = Application.DocumentManager.MdiActiveDocument.Editor.GetPoint(pPtOpts);
            
            return  pPtRes.Value;
        }

        private static (double X, double Y) ConvertPoint3dToCoordinate(Point3d point)
        {
            // convert pick point to coordinates
            
            return ( point.X, point.Y );
        }
    }
}

cały projekt do ściągnięcia z Github'a

https://github.com/TomekTkaczyk/GetHeightByCoordinates

Edited by perlon
Link to post
Share on other sites
21 godzin temu, dmatusz3 napisał:

Ciekawy temat, dziękuję za informacje.

Postaramy się przenalizować jak to zrobić. Czy w grę wchodzi tylko LISP, czy również inne języki np. C#?

Witam

Najlepiej w LISP. Program ma działać z programu ZWCAD, automatycznie.

Wpisuje komendę lub klikam przycisk polecenia w ZWCAD i działa, tak by było najlepiej.

perlon - a ten ".NET" można powiązać z przyciskiem polecenia lub poprzez jakieś polecenie wpisywane w ZWCAD ?

ja tylko wiem o obsłudze LISP i Visual Basic przez ZWCAD.

pozdrawiam

Link to post
Share on other sites

Zaktualizowałem repozytorium o opis działania. Repo jest tak zrobione, że po uruchomieniu Debug w VStudio powinien sie odpalić ZwCAD2020 automatycznie załadować dll i uruchomić komendę. W przypadku posiadania innej wersji należy zaktualizować property projektu.

Ładowanie skompilowanej dll'ki z lispa:

(vl-load-com)
(vl-cmdf "netload" "GetHeightByCoordinates.dll")

Ewentualnie trzeba dodać z przodu .dll ścieżkę dostępu. Wywołanie z linii komend 

CK_GetHbyXY

lub z lispa

(command "CK_GETHBYXY")

Powyższe można wywołać we własnych lispach (na razie komunikat jest wysyłany tylko na konsolę) lub podpiąć pod menu lub przycisk na toolbarsie.

W załączeniu skompilowana dll'ka.

Na chwilę obecną komenda zwraca jedynie komunikat o uzyskanej rzędnej wysokościowej. Tak dla sprawdzenia możliwości. Dalsza obróbka pozyskanej iniformacji wedle wymagań. Jak sprecyzujesz co chcesz konkretnie uzyskać to mogę to dopisać. W kodzie użyłem krotek, dlatego wymagany jest dostęp do System.ValueTuple.dll który również załączam.

GetHeightByCoordinates.dll System.ValueTuple.dll

Edited by perlon
Link to post
Share on other sites
W dniu 9.06.2021 o 09:40, Adam_x napisał:

Pytanie czy ma ktoś jakiś pomysł i czy jest możliwe by taki program działał w LISP(ZWCAD) ?

W ZWCAD program działa , dorobiłem tylko odwołanie do funkcji.
Całość wygląda tak:


(defun URL:Get ( url / 
	*error* )	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\nURL:Get:*error*: " ) (princ msg ) (princ "\n")	) )
	)
	(if (setq obj (vlax-create-object "winhttp.winhttprequest.5.1"))
        (progn
            (setq rtn
                (vl-catch-all-apply
                   '(lambda nil
                        (vlax-invoke-method obj 'open "GET" url :vlax-false)
                        (vlax-invoke-method obj 'send)
                        (vlax-get-property  obj 'responsebody)
                    )
                )
            )
            (vlax-release-object obj)
            (if (vl-catch-all-error-p rtn)
                (prompt (vl-catch-all-error-message rtn))
                (vl-list->string
                    (mapcar '(lambda ( x ) (lsh (lsh x 24) -24))
                        (vlax-safearray->list (vlax-variant-value rtn))
                    )
                )
            )
        )
    )
)


(defun GUKiK:H ( coords / ; (setq coords (list 486617 637928 ) )
	*error* )	(defun *error* ( msg / ) 
		(if (not (null msg ) )	(progn (princ "\nPoint:GetHByGUKiK:*error*: " ) (princ msg ) (princ "\n")	) )
	)
	
	(setq url (strcat "https://services.gugik.gov.pl/nmt/?request=GetHByXY&x=" (rtos (car coords) ) "&y=" (rtos (cadr coords)) "" ) )
	(setq H (URL:Get url) )
	(atof h)
)

A uruchomić można tak

(GUKiK:H (list 486617 637928 ) )

albo nawet tak: wskazując punkt w przestrzeni

(GUKiK:H (getpoint "\nWskaż punkt: " ) )

Wystarczy plik z załącznika wczytać do ZWCADa poleceniem appload.

 

GUKiK.lsp

Link to post
Share on other sites

Witam

W dniu 10.06.2021 o 13:58, dmatusz3 napisał:

Jeszcze chciałem zapytać, do czego i w jaki sposób można wykorzystać taką funkcję?

Do tworzenia map cyfrowych terenu? @Adam_x może masz jakieś przykłady?

Wtedy moglibyśmy zastanowić się nad opracowaniem dalszych etapów.

np: do stworzenia profilu ścieżki podejścia lądowania samolotów czy helikopterów

czy też sprawdzenia na jakiej głębokości umieścić studnię kablową itd.

architektom, konstruktorom też by się przydało :)

oczywiście dla dokładnych pomiarów trzeba wynająć geodetę, ale do wstępnych wyliczeń może się taka funkcja przydać.

jak miałbym każdy punkt teraz wpisywać do strony internetowej czy w jakimś innym programie robić i importować do ZWCADA to bym się chyba powiesił :)

ps. perlon, kruszynski, dmateusz3 dziękuje za pomoc.

pozdrawiam

 

 

Link to post
Share on other sites
Guest
This topic is now closed to further replies.