Aktualności:

Forum w trakcie prac modernizacyjnych

Menu główne

zaokrąglanie współrzędnych

Zaczęty przez Justek, Czwartek 18 Maj 2023, 09:35:51

Poprzedni wątek - Następny wątek

0 użytkowników i 2 Gości przegląda ten wątek.

Pan Sowa

Cytat: Lupus w Poniedziałek 22 Maj 2023, 14:42:01Dzisiaj miałem trochę więcej czasu i sobie potestowałem

145.365 => 145.37
145.355 => 145.35




True story:) Z Twoimi modyfikacjami działa lepiej  :smitten:  O0
Huuu huu

Cezary.K

W ewmapie dla elementów na warstwach można tak:

update EW_TABELA set WARTOŚĆ = TRUNC(XMIN,2) where WARTOŚĆ similar to '%._[0,2,4,6,8][5]______' and dodatkowe filtry wyszukiwania;
update EW_TABELA set WARTOŚĆ = ROUND(XMIN,2) where filtry wyszukiwania identyczne jak w linii wyżej

filtr wyszukiwania np. USER_MODIFY=1 and STAN_ZMIANY = 0

Pierwsza linia załatwia zaokrąglania 5 do parzystej, druga załatwia resztę. W tym przypadku zaokrąglanie realizowane jest do 2 miejsc po przecinku. Po odpowiednim przekształceniu da się tym zaokrąglać dowolne zmienne. Nie przyda się do struktur działkowych, ponieważ tam po wgraniu do bazy współrzędne w tabelach mają precyzję zapisu taką, jak deklarowana w konfiguracji.

Poniżej przykład zaokrąglania "geodezyjnego" współrzędnych końców odcinków i elementów tekstowych w bazie:

update EW_POLYLINE set XMIN = TRUNC(XMIN,2) where XMIN  similar to '%._[0,2,4,6,8][5]______' and USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set YMIN = TRUNC(YMIN,2) where YMIN  similar to '%._[0,2,4,6,8][5]______' and USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set XMAX = TRUNC(XMAX,2) where XMAX  similar to '%._[0,2,4,6,8][5]______' and USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set YMAX = TRUNC(YMAX,2) where YMAX  similar to '%._[0,2,4,6,8][5]______' and USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set P0_X = TRUNC(P0_X,2) where P0_X  similar to '%._[0,2,4,6,8][5]______' and USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set P0_Y = TRUNC(P0_Y,2) where P0_Y  similar to '%._[0,2,4,6,8][5]______' and USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set P1_X = TRUNC(P1_X,2) where P1_X  similar to '%._[0,2,4,6,8][5]______' and USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set P1_Y = TRUNC(P1_Y,2) where P1_Y  similar to '%._[0,2,4,6,8][5]______' and USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_TEXT set POS_X = TRUNC(POS_X,2) where POS_X  similar to '%._[0,2,4,6,8][5]______' and USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_TEXT set POS_Y = TRUNC(POS_Y,2) where POS_Y  similar to '%._[0,2,4,6,8][5]______' and USER_MODIFY=1 and STAN_ZMIANY = 0;

update EW_POLYLINE set XMIN = ROUND(XMIN,2)  where USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set YMIN = ROUND(YMIN,2)  where USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set XMAX = ROUND(XMAX,2)  where USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set YMAX = ROUND(YMAX,2)  where USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set P0_X = ROUND(P0_X,2)  where USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set P0_Y = ROUND(P0_Y,2)  where USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set P1_X = ROUND(P1_X,2)  where USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_POLYLINE set P1_Y = ROUND(P1_Y,2)  where USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_TEXT set POS_X = ROUND(POS_X,2) where USER_MODIFY=1 and STAN_ZMIANY = 0;
update EW_TEXT set POS_Y = ROUND(POS_Y,2) where USER_MODIFY=1 and STAN_ZMIANY = 0

Zostaje zasadnicza kwestia. Czy warto??

Lupus

Cytat: Lupus w Czwartek 18 Maj 2023, 20:52:39Słabo znam się na Javie, ale na algorytmach trochę tak. Ten akurat zaokrągli do najbliższej parzystej ZAWSZE, tzn nawet wtedy kiedy bliższa będzie nieparzysta. 1,5 spoko zaorkągli się do 2, ale 1,4 też się zaokrągli do 2.

zresztą tutaj popełniłem błąd, myśląc, że w js jest już funkcja roundToNearestEven(value) i zamiast poczytać co ona faktycznie robi i jak jest skonstruowana to założyłem, że robi to co mi się wydawało że powinna robić.
__________
Pozdrawiam
Lupus

Wszystko da się zrobić, tylko czy jest to uzasadnione ekonomicznie?

Lupus

Cytat: Pan Sowa w Czwartek 18 Maj 2023, 21:25:33Nie no wrzuć to sobie do konsoli i potestuj. Zaokrąglanie odbywa się do 2 miejsc po przecinku. Jak dla mnie uzyskuje poprawne wyniki.

Dzisiaj miałem trochę więcej czasu i sobie potestowałem

145.365 => 145.37
145.355 => 145.35

Problem leży w tym jak komputer "zaokrągla" przy obliczeniach w systemie dwójkowym. Pół po przejściu przez 0/1 i z powrotem staje się 0,4999999999 albo 0,500000000001 a nigdy tak naprawdę 0,5. To dało by się jakoś przewidzieć, ale chyba nie ma sensu, bo jakby miało to by już dawno było policzone i zrobione, a my nie wysyłamy lotów na Marsa.

math.round to zwykłe zaokrąglanie do najbliższej całkowitej, matematyczne, czyli niestosujące się do zasad Bradisa-Kryłowa
nawet jeśli zaokrąglisz wartość pomnożoną przez 100 a wynik tego zaokrąglenia przez 100 podzielisz.

Moim zdaniem tutaj taka funkcja zda egzamin

function roundToNearestEven(value) {
  return 2 * Math.round(value *100/ 2) /100;

a w zasadzie lepiej jeszcze by było zrobić taką funkcję

function roundToNearestEven(value, ilznak) {
  return 2 * Math.round(value *10^ilznak/ 2) /10^ilznak;

wtedy możemy jeszcze regulować ile znaków po przecinku byśmy sobie życzyli.

Niezależnie czy ten algorytm działa czy nie, to jaka to różnica, że obetniesz albo zaokrąglisz do parzystej współrzędną wysokościową?
Stosowanie zasad obliczeń Bradisa-Kryłowa, w tym zaokrąglanie ma sens w geodezji tylko i wyłącznie przy wyrównaniu ścisłym oraz przy obliczaniu powierzchni działek, częściowo też zgadzam się przy obliczaniu i zaokrąglaniu współrzędnych punktów granicznych.
Działki, bo się nie będą poprawnie sumowały do powierzchni obrębu, a w zasadzie powinienem napisać, że się będą sumowały lepiej zamiast poprawnie. Ideału nie będzie i tak, ale statystycznie będzie lepiej.
Punkty graniczne tylko częściowo, bo ten jeden cm nie ma to żadnego praktycznego znaczenia, ważne jest żeby zawsze i wszystkie programy liczyły tak samo. Większe różnice są na stosowaniu poprawki odwzorowawczej, niż wynika to z problemu zaokrąglenia współrzędnej na poziomie mm


__________
Pozdrawiam
Lupus

Wszystko da się zrobić, tylko czy jest to uzasadnione ekonomicznie?

JustekAutor w?tku


Pan Sowa

Tak, najlepiej wstawic np. 0

Tu też pod x,y
function roundToNearestEven(value) {
  return Math.round(value * 100) / 100;
}

// Funkcja przetwarzająca dane
function processTextData(inputData) {
  // Podziel dane na wiersze
  const lines = inputData.split('\n');

  // Przetwarzaj każdy wiersz
  const processedLines = lines.map(line => {
    // Podziel wiersz na kolumny
    const columns = line.split(' ');

    // Sprawdź, czy wiersz ma wystarczającą liczbę kolumn
    if (columns.length >= 4) {
      // Pobierz wartość z czwartej kolumny
      let x = parseFloat(columns[1]);
         let y = parseFloat(columns[2]);
         let value = parseFloat(columns[3]);

      // Zaokrąglij wartość do 2 miejsc po przecinku według zasady najbliższej parzystej
      x = roundToNearestEven(x);
         y = roundToNearestEven(y);
         value = roundToNearestEven(value);

      // Zaaktualizuj wartość w czwartej kolumnie
      columns[1] = x.toFixed(2);
         columns[2] = y.toFixed(2);
         columns[3] = value.toFixed(2);
    }

    // Połącz kolumny z powrotem w wiersz
    return columns.join(' ');
  });

  // Zwróć przetworzone dane
  return processedLines.join('\n');
}

// TWOJE DANE WEJŚCIOWE
const inputData = `
1 5434353.455 6435345.34 3.456
2 5434353.456 6435345.34 7.891
3 5434353.457 6435345.34 8.555
4 5434353.458 6435345.34 8.665
5 5434353.4 6435345.34 8.775
`;

const processedData = processTextData(inputData);
console.log(processedData);
Huuu huu

JustekAutor w?tku

Cytat: Pan Sowa w Czwartek 18 Maj 2023, 20:41:00Ja bym wykorzystał JS (np konsole w przeglądarce F12). Zmieniasz tylko sekcje "// TWOJE DANE WEJŚCIOWE" i gotowe. Zaokrąglana jest zawsze 4 kolumna. Wynik tylko skopiować z konsoli do pliku i ready

bardzo dziękuję za pomoc, a jak zmodyfikować ten skrypt żeby modyfikował jeszcze x i y? Niestety tego nie potrafię, a bez wiedzy z JS kombinowanie nic nie daje. Mam odbiornik, który eksportuje dane do 3 miejsc... I jeszcze co zrobić, gdy czasem nie ma czwartej kolumny bo pikieta jest bez rzędnej- wstawic na chwilę np. 0.000?

Lupus

Cytat: Cezary.K w Piątek 19 Maj 2023, 08:40:40Ten aspekt uznałem za mało istotny ;)

I ja też jestem tego zdania, dopóki mówimy o rzędnych terenu.
__________
Pozdrawiam
Lupus

Wszystko da się zrobić, tylko czy jest to uzasadnione ekonomicznie?

Cezary.K

Cytat: Justek w Czwartek 18 Maj 2023, 09:35:51... Czy jeśli mam plik xyh z rzędną do 2 miejsc i zaimportuję je do bdotu opcją import pikiet naturalnych, to w atrybutach się obetnie końcówka?

Obetnie. Możesz wgrywać rzędne z pliku, gdzie jest dowolna liczba miejsc po przecinku dla h, ewmapa utnie do decymetra dla rzędnych naturalnych i centymetra dla sztucznych. Czy zaokrągla matematycznie, czy geodezyjnie - nie wiem, bo nie sprawdzałem. Ten aspekt uznałem za mało istotny ;)

Lupus

OK

pewnie mógłbym sobie potestować do jakiej wartości zaokrągli się 145.365, a do jakiej 145.355 pewnie z obu wyjdzie 145.36

a jakie będzie zaokrąglenie tym algorytmem wartości 145.367?
__________
Pozdrawiam
Lupus

Wszystko da się zrobić, tylko czy jest to uzasadnione ekonomicznie?

Pan Sowa

Cytat: Lupus w Czwartek 18 Maj 2023, 20:52:39Słabo znam się na Javie, ale na algorytmach trochę tak. Ten akurat zaokrągli do najbliższej parzystej ZAWSZE, tzn nawet wtedy kiedy bliższa będzie nieparzysta. 1,5 spoko zaorkągli się do 2, ale 1,4 też się zaokrągli do 2.

Nie no wrzuć to sobie do konsoli i potestuj. Zaokrąglanie odbywa się do 2 miejsc po przecinku. Jak dla mnie uzyskuje poprawne wyniki.
Z Twoich przykładów
1,5 będzie miało postac 1,50 (nie 2)
1,4 będzie miało postać 1,40 (też nie 2)
Huuu huu

Lupus

Cytat: Pan Sowa w Czwartek 18 Maj 2023, 20:41:00// Zaokrąglij wartość do 2 miejsc po przecinku według zasady najbliższej parzystej
      value = roundToNearestEven(value);

Słabo znam się na Javie, ale na algorytmach trochę tak. Ten akurat zaokrągli do najbliższej parzystej ZAWSZE, tzn nawet wtedy kiedy bliższa będzie nieparzysta. 1,5 spoko zaorkągli się do 2, ale 1,4 też się zaokrągli do 2.
__________
Pozdrawiam
Lupus

Wszystko da się zrobić, tylko czy jest to uzasadnione ekonomicznie?

Pan Sowa

Ja bym wykorzystał JS (np konsole w przeglądarce F12). Zmieniasz tylko sekcje "// TWOJE DANE WEJŚCIOWE" i gotowe. Zaokrąglana jest zawsze 4 kolumna. Wynik tylko skopiować z konsoli do pliku i ready

function roundToNearestEven(value) {
  return Math.round(value * 100) / 100;
}

// Funkcja przetwarzająca dane
function processTextData(inputData) {
  // Podziel dane na wiersze
  const lines = inputData.split('\n');

  // Przetwarzaj każdy wiersz
  const processedLines = lines.map(line => {
    // Podziel wiersz na kolumny
    const columns = line.split(' ');

    // Sprawdź, czy wiersz ma wystarczającą liczbę kolumn
    if (columns.length >= 4) {
      // Pobierz wartość z czwartej kolumny
      let value = parseFloat(columns[3]);

      // Zaokrąglij wartość do 2 miejsc po przecinku według zasady najbliższej parzystej
      value = roundToNearestEven(value);

      // Zaaktualizuj wartość w czwartej kolumnie
      columns[3] = value.toFixed(2);
    }

    // Połącz kolumny z powrotem w wiersz
    return columns.join(' ');
  });

  // Zwróć przetworzone dane
  return processedLines.join('\n');
}

// TWOJE DANE WEJŚCIOWE
const inputData = `
1 5434353.45 6435345.34 3.456
2 5434353.45 6435345.34 7.891
3 5434353.45 6435345.34 8.555
4 5434353.45 6435345.34 8.665
5 5434353.45 6435345.34 8.775
`;

const processedData = processTextData(inputData);
console.log(processedData);
Huuu huu

mlodygeodeta

(ewentualnie wrzuć sobie to do excela, ale w taki sposób żeby każda komórka miała coś swojego)
w takim sensie że np komórka A1 -> nr pikiety 1; komórka A2 -> współrzędna x itd.
jeśli chodzi o zaokrąglenie to pewnie zaokrągli matematycznie, ale da się zrobić żeby zaokrąglało w inny sposób (nie zagłębiałem się w tym temacie).
Ale mimo wszystko najprościej i najszybciej chyba w winkalk

mlodygeodeta

Polecam w winkalku, zmieniasz sobie tylko tutaj z 3 na 2 i eksportujesz do pliku tekstowego.
screenshot

Ja od kiedy mam u siebie w regionie obiektowanie bdot, to po prostu sobie porządkuje pikiety w folderze (robię dwa pliki tekstowe, do jednego wrzucam rzędne naturalne, a do drugiego sztuczne, wcześniej weryfikując które pikiety stawiałem na np. jezdni, a które na np. ziemi), no i potem przy imporcie rzędnych jak zaznaczysz sobie naturalne to ci nawet te rzędne które pomierzyłeś do 3 miejsc po przecinku, ewmapa przekształci do jednego miejsca ;)