Rijks driehoek coordinaten omzetten naar map nummer

Status
Niet open voor verdere reacties.

chrisje181

Gebruiker
Lid geworden
23 okt 2008
Berichten
106
Goedendag allemaal,

Ik heb een vraagje:

Ik gebruik visual basic 2010. En wil graag het volgende:

Nederland is in verschillende kaartdelen opgedeeld. Ieder kaartdeel heeft zijn eigen nummer en een eigen begin en eind coördinaat.
In een formulier wil ik dat de gebruiker zijn coördinaat kan invoeren en vervolgens de map nummer krijgt en eigenlijk dat het bestand word geopend.

Hieronder enkele kaart delen met hun begin en eind coördinaat:

Kaart Begin Eind

1H 169.600 | 195.612.500
2G 195.600 | 220.616
3A 220.612.500 | 238.625
3C 220.600 | 230.612.500
3D 230.600 | 240.612.500
3G 240.600 | 259.612.500
4F 118.580 | 140.592.500
5A 139.595 | 168.608
5F 164.587.500 | 180.600
5G 151.575 | 170.587.500
5H 170.575 | 180.587.500


Hoe kan ik dit het beste in visual basic voor elkaar krijgen

Even voor de duidelijkheid: ik bouw hetin mijn form momenteel zo op:

Xfirst (Textbox)
Xlast (textbox)
Yfirst (Textbox)
Ylast (Textbox)

Xfirst: 235
Xlast: 27

Yfirst: 605
Ylast: 67

Ditkomt dan uit in Kaart 3D
 
Laatst bewerkt:
Wat lukt er niet? en hoe verhouden zich de nummers in je input boxen met de tabel? (houd er rekening mee dat 99,9% van de mensen die dit lezen de achtergrondmaterie niet begrijpen).
 
ikkrijg de hele code niet werkend.

Ik gebruik nu een select op de Xinput maar hoe controleer ik vervolgens die daarna met de Yinput zodat ik het kan vergelijken

Ik gebruiik nu

Code:
X1 = xFirst.Text
        X2 = xLast.Text
        Y1 = yFirst.Text
        Y2 = yLast.Text

        Select Case X1
            Case "169" To "195"

        End Select
 
Kun je niet beter die getallen benaderen als "169600" etc? Als de tabel al volledig beschikbaar is zou ik de tabel zoekbaar maken en niet met "CASE" statements gaan werken. hoeveel kaarten zijn er?
 
Dan zou ik de coordinaten in een 2 dimensionale array zetten. (als het tenminste vierkanten zijn) en die doorlopen. Dan houd je de data tenminste op 1 plaats en eventueel makkelijk inzetbaar op andere plaatsen. Case statements zijn vervelend om te onderhouden en te debuggen.
 
en hoe zou je het doen dan. Het zijn losse .jpg bestanden. Het zijn idd wel vierkanten.
 
De x en Y coordinaat van 1 hoek plaatsen en een array en dan met het doorlopen van de ingevulde waarde de kaart kiezen.

De kaarten zien er ruwweg zo uit (met heel veel fantasie is dit nederland :P):

Code:
1    @
2   @@
3  @@@
4  @@@
5 @   @
  12345

Deze kun je in een tweedimensionale of jagged array zetten. Je kijkt eerst naar de hoogte, en uit de array van die hoogte kijk je van links naar rechts.

In het geval van een vaste 2 dimensionale array duidt je delen waarvoor geen kaart is met een speciale code aan en kun je die toch vullen.

Een en ander is natuurlijk afhankelijk van hoeveel kennis je al hebt van VN en arrays.
 
Laatst bewerkt:
Ik snap totaal niet wat je bedoelt. vandaar dat ik dus in eerste instantie naar een select ging.
 
ik kom er niet uit: heb het volgende nu in mijn code:

In mijn form1.load wordt de arraygevuld met de kaartmap namen.
Code:
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        mapArray(0, 0) = ""
        mapArray(0, 1) = ""
        mapArray(0, 2) = ""
        mapArray(0, 3) = ""
        mapArray(0, 4) = ""
        mapArray(0, 5) = ""
        mapArray(0, 6) = ""
        mapArray(0, 7) = "3A"
        mapArray(0, 8) = "3A"
        mapArray(0, 9) = ""
        mapArray(0, 10) = ""
        mapArray(0, 11) = ""
        mapArray(1, 0) = ""
        mapArray(1, 1) = ""
        mapArray(1, 2) = ""
        mapArray(1, 3) = ""
        mapArray(1, 4) = "2G"
        mapArray(1, 5) = "2G"
        mapArray(1, 6) = "2G"
        mapArray(1, 7) = "3A"
        mapArray(1, 8) = "3A"
        mapArray(1, 9) = ""
        mapArray(1, 10) = ""
        mapArray(1, 11) = ""
        mapArray(2, 0) = ""
        mapArray(2, 1) = ""
        mapArray(2, 2) = "1H"
        mapArray(2, 3) = "1H"
        mapArray(2, 4) = "2G"
        mapArray(2, 5) = "2G"
        mapArray(2, 6) = "2G"
        mapArray(2, 7) = "3C"
        mapArray(2, 8) = "3D"
        mapArray(2, 9) = "3G"
        mapArray(2, 10) = "3G"
        mapArray(2, 11) = ""
        mapArray(3, 0) = ""
        mapArray(3, 1) = "5A"
        mapArray(3, 2) = "1H"
        mapArray(3, 3) = "1H"
        mapArray(3, 4) = "2G"
        mapArray(3, 5) = "2G"
        mapArray(3, 6) = "2G"
        mapArray(3, 7) = "3C"
        mapArray(3, 8) = "3D"
        mapArray(3, 9) = "3G"
        mapArray(3, 10) = "3G"
        mapArray(3, 11) = ""
        mapArray(4, 0) = "5A"
        mapArray(4, 1) = "5A"
        mapArray(4, 2) = "5F"
        mapArray(4, 3) = "6A"
        mapArray(4, 4) = "6B"
        mapArray(4, 5) = "6E"
        mapArray(4, 6) = "6F"
        mapArray(4, 7) = "7A"
        mapArray(4, 8) = "7B"
        mapArray(4, 9) = "7E"
        mapArray(4, 10) = "7F"
        mapArray(4, 11) = "8C"
        mapArray(5, 0) = "5G"
        mapArray(5, 1) = "5G"
        mapArray(5, 2) = "5H"
        mapArray(5, 3) = "6C"
        mapArray(5, 4) = "6D"
        mapArray(5, 5) = "6G"
        mapArray(5, 6) = "6H"
        mapArray(5, 7) = "7C"
        mapArray(5, 8) = "7D"
        mapArray(5, 9) = "7G"
        mapArray(5, 10) = "7H"
        mapArray(5, 11) = "8C"
        mapArray(6, 0) = "10B"
        mapArray(6, 1) = "10E"
        mapArray(6, 2) = "10F"
        mapArray(6, 3) = "11A"
        mapArray(6, 4) = "11B"
        mapArray(6, 5) = "11E"
        mapArray(6, 6) = "11F"
        mapArray(6, 7) = "12A"
        mapArray(6, 8) = "12B"
        mapArray(6, 9) = "12E"
        mapArray(6, 10) = "12F"
        mapArray(6, 11) = "13A"
        mapArray(7, 0) = "10G"
        mapArray(7, 1) = "10G"
        mapArray(7, 2) = "10H"
        mapArray(7, 3) = "11C"
        mapArray(7, 4) = "11D"
        mapArray(7, 5) = "11G"
        mapArray(7, 6) = "11H"
        mapArray(7, 7) = "12C"
        mapArray(7, 8) = "12D"
        mapArray(7, 9) = "12G"
        mapArray(7, 10) = "12H"
        mapArray(7, 11) = "13C"

als ik op de knop (get map) druk dan heb ik het volgende in mijn code staan:

Code:
Private Sub getMapBtn_Click(sender As System.Object, e As System.EventArgs) Handles getMapBtn.Click
        X1 = xFirst.Text
        X2 = xLast.Text
        Y1 = yFirst.Text
        Y2 = yLast.Text
        Xcombined = X1 + X2
        Ycombined = Y1 + Y2
        coordinateTotal = X1 + "." + Y1
        coordinateCombined = X1 + X2 + "." + Y1 + Y2

        Xtotal.Text = Xcombined
        Ytotal.Text = Ycombined
        Label3.Text = coordinateTotal

        Select Case coordinateTotal
            Case "170.600" To "195.611"
                MsgBox("The coördinate " + coordinateCombined + " is on map: 1H")

        End Select


    End Sub

Maar dat gaat niet goed.

Hij moet namelijk de X1 vergelijken tussen een range van 170 to 195 en Y1 vergelijken tussen een range van 600 to 611. Als beide true zijn dan moet ie in een msgbox aangeven dat hij op kaart 1H staat.(dat laatste wil ik daarna combineren dat hij uit de array ophaalt welk bestand erbij hoort zodat hij die opent in een photo gallery van de eigen windows laptop.) Misschien dat iemand mij alvast kan helpen met dat laatste (bestand openen in een programma op de laptop van de gebruiker)

MAar hoe los ik het eerste probleempje op:

Code:
Hij moet namelijk de X1 vergelijken tussen een range van 170 to 195 en Y1 vergelijken tussen een range van 600 to 611. Als beide true zijn dan moet ie in een msgbox aangeven dat hij op kaart 1H staat.
 
Helaas heb ik vandaag geen tijd, maar je kunt die informatie allemaal in de array opslaan.

dus x,y,mapname kun je in een enkel object opslaan en dat object in een array zetten. Hopelijk kan ik morgen ergens tijd vinden om een voorbeeldje te maken.
 
Graagwacht ik op een voorbeeldje, wat ik nu heb is via 2 if's vaststellen of het in een map zit. maar x en y, zijn 2 waardes per keer (dus x1 en x2 en y1 en y2 voor de map) Anders weet je niet wat het bereik is van de map. De user voert maar 1 x en 1 y coördinaat in. En die moet vergeleken worden tussen de X1 en X2 (Xuser) en Y1 en Y2 (Yuser)

En van dat bestanden openen heb ik het volgende gevonden:
Code:
Dim path As String = "C:\Users\Gebruiker\Documents\belangrijk materiaal programma.txt"
        System.Diagnostics.Process.Start(path)
 
In principe is dat niet helemaal waar. Indien je vierkanten hebt is het beginpunt van map 2 hetzelfde als het eindpunt van map 1. Zelfs als dat niet helemaal waar is kun je in principe zoveel informatie opslaan in een object als je wilt. Zelfs de hele kaart, indien nodig ;)
 
nee, zeoverlappen steeds, dus wil ik wel een begin Xen een eind X opslaan. Zelfde geld voor de Y
 
Hierbij een voorbeeld. Het is in 3 stukken. Een class deel dat je ergens onder je form class kunt steken in je code. Het andere deel is hoe je de class gebruikt. en een enkele lijn declaratie

class code:
Code:
Public Class coords
    Dim x1 As ULong
    Dim x2 As ULong
    Dim y1 As ULong
    Dim y2 As ULong
    Dim mapname As String
    Sub New(ByVal xi1 As ULong, ByVal xi2 As ULong, ByVal yi1 As ULong, ByVal yi2 As ULong, ByVal mapn As String)
        Me.x1 = xi1
        Me.x2 = xi2
        Me.y1 = yi1
        Me.y2 = yi2
        Me.mapname = mapn
    End Sub

    Public Function isin(ByVal xi As ULong, ByVal yi As ULong) As String
        If (xi >= Me.x1 And xi < Me.x2 And yi >= Me.y1 And yi < Me.y2) Then
            Return Me.mapname
        Else
            Return ""
        End If
    End Function

End Class

Dit is de gebruikscode. Normaal gesproken deel je dit op in 2 delen, initialisatie en zoekdeel, maar het werkt ook in een enkele routine:

Code:
'initialisatie deel, dit kan bijvoorbeeld in form load, oid
'hier vul je de opslag array met bruikbare data
'declaratie van opslag gebeurd ergens anders
        opslag(0) = New coords(0, 10, 0, 10, "henk")
        opslag(1) = New coords(10, 20, 0, 10, "jan")
        opslag(2) = New coords(20, 30, 0, 10, "piet")
        opslag(3) = New coords(0, 10, 10, 20, "klaas")
        opslag(4) = New coords(0, 10, 20, 30, "peter")
        opslag(5) = New coords(10, 20, 10, 20, "paul")
        opslag(6) = New coords(10, 20, 20, 30, "hendrik")
        opslag(7) = New coords(20, 30, 10, 20, "jaap")
        opslag(8) = New coords(20, 30, 20, 30, "janus")

'array doorzoeken, simpel voorbeeld.
        Dim xi As ULong
        Dim yi As ULong

        xi = TextBox1.Text 'simpele textbox om even te testen
        yi = TextBox2.Text 'simpele textbox om even te testen

        For Each zoeken In opslag
            If zoeken.isin(xi, yi) <> "" Then
                MessageBox.Show(zoeken.isin(xi, yi))
            End If
        Next

Het laatste deel is de declaratie van "opslag" zodat het gebruikt kan worden in bovenstaande code. deze code plaats je DIRECT onder je form class (standaard eerste regel in nieuwe code: Public Class Form1 ; Deze code moet dus dan op regel 2)

Code:
    Public opslag(8) As coords
 
Dit werkt! onwijs bedankt. Op deze manier kan ik tenminste weer verder.

Alleen dan nu hetvolgende:

Hoe kan ik met een input box voor adres (adres, nummer, postcode, plaats, land) een google maps afbeelding intern laden zodatje kan zien waar het is.
Het liefst natuurlijk werkend dat ik ook eventueel een RD of een WGS84 (GPS) coördinaat kan invoeren.
 
VB heeft standaard een browser optie die je kunt benutten. Dat is echter niet mijn specialiteit.

Google maps ondersteund standaard al GPS. Er is een formule om RD in GPS om te zetten. Dus in principe kun je via het browser component dit redelijk eenvoudig oproepen met die informatie.
 
heb namelijk deze code gevonden, heb een google maps api key nodig (alleen weet niet welke), maar daarop loopt de code waarschijnlijk stuk:

Code:
Imports System.IO
Imports System.Net
Imports System.Web
Imports System.Collections.Generic
Imports System.ComponentModel
Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    End Sub
    ''' <summary>
    ''' Call the GetLatLon method to geocode a physical address
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub btnGeocode_Click(sender As System.Object, e As System.EventArgs) Handles btnGeocode.Click
        Try
            Dim ll As New LatLon()
            ll = GetLatLon(txtAddress.Text)
            txtLatLon.Text = ll.Latitude.ToString() & ", " & ll.Longitude.ToString()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "An error has occurred")
        End Try
    End Sub
    ''' <summary>
    ''' This function makes a call using the Google Maps API to geocode a physical
    ''' address and report the
    ''' latitude and longitude of the address
    '''
    ''' You will need to obtain a Google Maps API key and plug it into the url string the
    ''' space indicated in order for this
    ''' code to execute properly
    '''
    ''' The code could be useful to you if you need to geocode some addresses in order to
    ''' display them on a map, for example if
    ''' your site had a store locator, this code could be used to find the lat/lon of
    ''' each store.  I would recommend obtaining the
    ''' addresses and keeping them in a database table rather than querying Google maps
    ''' for the lat/lon of the address each time it
    ''' is needed.  Google does have limitations upon the number of free queries it will
    ''' support, at that, it might be useful to just
    ''' write an application to loop through all of the addresses, geocode each address,
    ''' and then write those captured lat/lon values
    ''' into your table.
    '''
    ''' Whilst useful, there is nothing particulary interesting about this code; I think
    ''' it is pretty well covered in the Google Maps API documentation
    ''' </summary>
    ''' <param name="addr"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetLatLon(ByVal addr As String) As LatLon
        Dim url As String = "http://maps.google.com/maps/geo?output=csv&key=AIzaSyBLEGG_r8ifWR67sJ1f5H5reHttUaXKTdE&q=" & addr
        Dim request As System.Net.WebRequest = WebRequest.Create(url)
        Dim response As HttpWebResponse = request.GetResponse()
        If response.StatusCode = HttpStatusCode.OK Then
            Dim ms As New System.IO.MemoryStream()
            Dim responseStream As System.IO.Stream = response.GetResponseStream()
            Dim buffer(2048) As Byte
            Dim count As Integer = responseStream.Read(buffer, 0, buffer.Length)
            While count > 0
                ms.Write(buffer, 0, count)
                count = responseStream.Read(buffer, 0, buffer.Length)
            End While
            responseStream.Close()
            ms.Close()
            Dim responseBytes() As Byte = ms.ToArray()
            Dim encoding As New System.Text.ASCIIEncoding()
            Dim coords As String = encoding.GetString(responseBytes)
            Dim parts() As String = coords.Split(",")
            Return New LatLon(Convert.ToDouble(parts(2)), Convert.ToDouble(parts(3)))
        End If
        Return Nothing
    End Function
End Class



Public Class LatLon
    Public Property Latitude As Double
    Public Property Longitude As Double
    Public Sub New()
    End Sub
    Public Sub New(ByVal lat As Double, ByVal lon As Double)
        Me.Latitude = lat
        Me.Longitude = lon
    End Sub
End Class

misschien weet jij welke ik nodig heb,of wat er fout gaat?
 
maar hoe kan ik dat openen in vb.net,dus als intern iets. Ik wil niet dat hij een los internet browser opent, als dat kan. Zo niet: hoe open ik dan die link...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan