Daha çox

PostGIS xəttinin başlanğıcı və sonu üçün Z dəyəri təyin edin


PostGIS verilənlər bazamda bir sətir cədvəli və hər sətrin başlanğıcı və sonu üçün tərs səviyyə olan bir cədvəl var.

Məqsədim tərs məlumatlarımdan cədvəlimdə 3B sətirlər yaratmaqdır. Başlanğıcda və sonunda bir 3D nöqtəsi ilə xətti yenidən yaratmaq üçün st_makeline istifadə edə biləcəyimi bilirəm, ancaq başlanğıc və bitiş üçün yalnız Z dəyərində bir yeniləmə çalışdıra biləcəyimi ümid edirdim.

Bu edilə bilər və ya yalnız xətti yenidən yaratmaq daha asandır.


-Bir nöqtəni ST_SetPoint (həndəsə linestring, tam zerobasedposition, həndəsə nöqtəsi) və ST_Translate () ilə yeniləyə bilərsiniz.
-İlk və son nöqtəni almaq üçün st_endpoint () və st_startpoint () istifadə edin.
-Son nöqtənin "indeksini" almaq üçün ST_NumPoints (the_geom) -1 istifadə edin.
-İlk nöqtə "indeks" 0-dur.

İlk nöqtə üçün belə bir şey var:

CƏDVƏLİ YENİLƏN the_geom = st_setpoint (the_geom, 0, st_translate (st_firstpoint (the_geom), 0,0, Z)) FROM…

İstilik xəritəsindəki xam məlumatlara rəng miqyasınızı necə təyin etmək olar.

Bu məlumatda (və faktiki olaraq) heç bir mənfi dəyər olmadığına və müsbət dəyərlərin 100-ə qədər ola biləcəyinə diqqət yetirin.

İstədiyim şey istilik xəritəsini təyin olunmuş rəng şkalası və sxemi ilə qurmaqdır:

  1. Qiymət 0 olduqda onu ağa çevirin.
  2. Qiymət == 1 olduqda onu qara rəngə qoyun.
  3. Qiymət> 1 olduqda onu qırmızı rənglərin kölgəsinə salın.
  4. Qiymət & lt 1 və> 0 olduqda, onu göyərti kölgəsinə çevirin.

ayrıca hər hansı bir məlumat miqyaslandırmadan və ya z-skor çevrilməsindən istifadə etmədən. Buna necə nail ola bilərəm?

Varsayılan z-hesab satır miqyaslandırmadan istifadə etdiyi aşağıdakı süjet istehsal olunur.


Standart sed ilə edəcəksiniz heç vaxt bir fayldan oxunan mətndə yeni bir sətirə baxın. Bunun səbəbi sedin sətir-sətir oxumasıdır və buna görə də cədvəlin məkanında mövcud sətrin mətninin sonunda yeni sətir yoxdur. Başqa sözlə, sed yeni satırla ayrılmış məlumatları oxuyur və ayırıcılar sed kodunun gördüyü hissə deyil.

Adi ifadələr ola bilər lövbər sətrin sonunda $ istifadə edərək (və ya əvvəlində ^ istifadə edərək). Bir xəttin başlanğıcında / sonunda bir ifadənin bağlanması onu xəttin hər yerində deyil, tam olaraq orada uyğunlaşdırmağa məcbur edir.

Sətrin sonunda [A-Za-z] * naxışına uyğun gələn hər hansı bir şeyi bir şeylə əvəz etmək istəyirsinizsə, naxışı bu şəkildə bağlayın:

. onu satırın sonunda və başqa yerdə uyğunlaşdırmağa məcbur edəcəkdir.

Lakin, [A-Za-z] * $ da uyğun olduğundan heç nə (məsələn, sonunda olan boş simli hər line), ilə uyğunluğu məcbur etməlisiniz bir şeyməsələn dəqiqləşdirərək

Beləliklə, sizin sed komanda xətti belə olacaq

Lazım olmadığı üçün -E düyməsini burada istifadə etmədim. Bununla, yaza bilərdin


İndi bu yolla xx [[1]], yy [[2]] həll yollarına daxil ola bilərsiniz.

Array-da həllər toplamağı seçsəniz, başqa bir yol var:

indi X s [[Hamısı, 1, 2]] -ə bərabərdir, Y-dən s [[Bütün, 2, 2]], məsələn. :

X və Y massivlərini istifadə etmək, hətta müəyyənləşdirmək məcburiyyətində deyilsiniz, məsələn.

Durumdan istifadə etdik, yəni / x uzunluğuna görə müəyyən edilmiş müvafiq aralığında x [i], y [i] təriflərini təmin etmək üçün, yəni həll sayı.

Ümumiyyətlə x və y-ə həqiqətən dəyərlər təyin etmək istəmirsiniz və əvəzinə əvəzləmə qaydalarından istifadə edərdiniz:

və ya ikinci həll üçün:

Əgər sən həqiqətən x və y-ə qlobal olaraq dəyərlər təyin etmək istəyirsinizsə, istifadə edə bilərsiniz:

Amma sən olmalıdır başqa bir dəsti istifadə etməzdən əvvəl x və y silin:

Blok içərisində x və y-yə dəyərlər təyin etmək istəyirsinizsə, belə bir şey edə bilərsiniz:

Bu, dəyərləri vaxtından əvvəl qiymətləndirmədən düzgün sintaksisdəki Block-a daxil etmək üçün injektor modelini axtardığımdan istifadə edir.

Yeniləmə: Versiya 10 daxili funksiya Dəyərlər ixtiyari uzunluqlar və dərinliklər siyahısında görünən qaydalar üçün əlverişli bir dəyər çıxarır:

Orijinal yazı:

Dəyişənlərə həllər təyin etmək istəyirsinizsə, belə bir şey edə bilərsiniz:

Çıxdı [5] =

Subscript [x, 1] = (- 11181-Sqrt [2242057]) / 74498
Subscript [x, 2] = (- 11181 + Sqrt [2242057]) / 74498
Subscript [y, 1] = 1/386 (13-Sqrt [2242057])
Subscript [y, 2] = 1/386 (13 + Sqrt [2242057])

Sonra nümayiş məqsədləri üçün həllərdən istifadə edə bilərsiniz:

Budur ağrısız bir həll yolu:

Yuxarıdakı s nəticələrinin dörd nəticəsini ardıcıl olaraq hər birini dəyişənə təyin edin

Ah, nəhayət bunu 10-cu versiyada tətbiq etdilər! Budur, 5-ci versiyadan bəri istifadə etdiyim bir prosedur, Dəyər tətbiq olunmazdan əvvəl versiyalarda oxşar xüsusiyyətləri təmin edə bilər. (Əmin deyiləm, amma bəlkə də MathGroup-da yerləşdirmişəm. Bu xəbər deyilsə, məni bağışla)

Mən buna "Dəyərlər" dedim. Buna iki seçim verdim:

Kömək mesajı inşallah özünü izah edir:

ToValues-un qaydalar siyahısına tətbiqi dəyərlər siyahısını yaradır

Əlbəttə tapşırıq dərhal, burada

Varsayılan olaraq, ToValues, iç içə siyahını basaraq mümkün olan ən sadə dəyərlər siyahısını qaytarır. Orijinal yuvanı qorumaq istəyirsinizsə, Düzləşdirmə seçimi budur:

Qaytarılmış dəyərlərə tətbiq ediləcək bir funksiya təyin edə bilərik.

Qaydaların sağ tərəflərindən istifadə edən funksiyanı da istifadə edə bilərik. Parametrləşdirilmiş bir baş ilə onları funksiyalar olaraq təyin edin və ToValues-dən istifadə etməsini əmr etmək üçün IndexedFunction-> True seçin. Bu vəziyyətdə siyahıları formada qaytarmaq istəyirik :

Həqiqi dünya tətbiqləri

ToValues ​​normal olaraq Solve, NSolve, DSolve və s. Tərəfindən qaytarılmış siyahılardan həll çıxarmaq üçün istifadə olunur. Varsayılan formada bu şəkildə tətbiq oluna bilər:

Bu, kompleks həllərin siyahısını verir

Bu, hər bir həllin həqiqi və xəyali hissəsini hesablamaq üçün isteğe bağlı funksiyadan istifadə edir

Və bu, ToValues ​​içərisindəki bu dəyərlərə əsaslanan qrafik obyektləri (Nöqtələr) yaratmaq funksiyasını itələyir:


Kabuk sintaksisinə gəldikdə, (xüsusi bir xarakterdir (& gt, & amp və s. Kimi), qaçmadan və ya sitat gətirilmədən təyin olunmuş bir dəyərin bir hissəsi kimi görünə bilməz, məsələn alt qabıqları başlamaq üçün istifadə olunur, ancaq fərq etdiyiniz kimi , əksər hallarda bu, sadəcə bir sintaksis səhvinə səbəb olur. (Fərqli olaraq, & amp; səssizcə əmri sonlandıracaq.)

Bununla birlikdə, mötərizə sizin yeganə probleminiz deyil, yolda boşluq da var. Bu sintaksis xətası deyil, əmrin mənasını dəyişdirir. export PATH = / mnt / c / Program Files / Somepath, PATH-ə / mnt / c / Program təyin etmək və Files / Somepath adlı dəyişəni ixrac etmək deməkdir ki, bu da əyri dəyişkən adda düzgün olmadığına görə xətaya səbəb olur.

Program Files (x86 ) -dakı kimi bütün mötərizədən və boşluqlardan qaçmalı və ya sadəcə bütün sətirdən sitat gətirməlisiniz:

və ya sadəcə hissələrini oxumaq daha çətin olsa da:

(Hər ikisini də bir-birinizin içində edə bilməyəcəyinizi unutmayın, PATH = '/ mnt / c / Program Files (x86 ) /.' 'Hərfi ters eğikləri olan bir sətir təyin edəcək.)


Sonundan başqasından əvvəl qurtarın. Tərtibçi birincinin bitəcəyi yerlə qarışıqdır.

  • always_comb kənar proseslərin sol tərəfdəki dəyişənləri yazmasına icazə vermir (hər zaman @ * ilə müqayisədə)
  • asılı olmayaraq, eyni tel tipində birdən çox sürücüyə icazə verilmir. Always_comb z üçün bir tapşırığa qayıdır, buna görə onu yenidən xaricdə təyin etməyə çalışmaq çox sürücü səhvinə səbəb olur.

Nəhayət, niyyətiniz z-in bəzi standart dəyərlərə sahib olmasıdırsa, diqqətli kodlaşdırma stili onu if-else ifadəsinin gövdəsinə başqa son olaraq daxil edəcəkdir. Kodunuzu oxuyan başqası üçün daha aydın (və ya özünüz, daha sonra).

Kombinasiya blokunun içərisində belə bir bəyanat yaza bilərsiniz:

İf ifadəsindən əvvəl bu ifadə, if ifadəsindəki ifadələrin heç biri doğru deyilsə icra olunur. Bunu yazmağın alternativ bir metodudur:

Əgər cümlələri həm else blokunda, həm də if şərt ifadəsindən əvvəl yazsanız, onda başqa blokda təyin olunmuş dəyər əks olunacaq və digər dəyər nəzərə alınmayacaqdır.

Qeyd: Kombinasiya məntiqi üçün if ifadəsində bütün mümkün şərtlərin təmin olunduğundan əmin olun!

Bir mandalı həqiqətən ehtiyacınız varsa, həmişə_comb deyil, always_latch istifadə edin!

Simulyasiyada X-lərdən qaçınma məsələsinə gəldikdə, ən yaxşı seçim məntiq əvəzinə məlumat tipini bit elan etməkdir. Bunu etmək, bit 2 vəziyyətli olduğundan 0-a başlayacaq.

Qeyd: 2 vəziyyətli simulyasiya daha sürətli olsa da, başlanğıcda aparatı işə salmağın uğursuzluğunu örtə biləcəyi üçün tövsiyə edilmir.


İstədiyinizi düşünsək əvvəlcə iki eyni blokdan:

/ Hüceyrə uyğunlaşması / sıra nəticə olaraq əldə etmək istədiyiniz sətir üçündür.

Sed ifadələri əvvəlcə bütün sətirləri silir yox bu aralıqda və sonra çıxır bir sətrin əvvəlində bir> tapılan kimi. Q əmri, cari satırı çıxdıqdan sonra sed-in sona çatmasına səbəb olacaq, buna görə son> yazdırılacaq.

D təlimatının icrası dərhal növbəti giriş sətrinə atlanır və yenidən redaktə ssenarisinin başlanğıcına qayıdır, beləliklə q təlimatının yerinə yetirilməsinə səbəb olmayan aralığda olmadığı təqdirdə icra üsulu yoxdur.

Awk ilə, yuxarıdakı sed kodunu xatırladan kodla eyni təsiri əldə etmək:


2 Cavablar 2

Düzəliş: Beləliklə, mənim həll yolum tamamilə dəqiq deyil, çünki dediyiniz kimi böyük kabel və borular fişin eyni nöqtəsində birləşmir.

* Kabel ucunda boşluq yaradın, boş yeri seçin, keçid kabelini seçin, içəri girin Redaktə edin rejimi, 3 zirvəni seçin, Ctrl P düyməsini basın:

Fişi boş yerə əlavə edin:

Kabeli verin a Əyri dəyişdirici, kabeli əyri boyunca hərəkət etdirin:

Məqsəd sualın 1-ci şəklində olduğu kimi bir animasiya əldə etməkdir.

Əsas kabeli @moonboots həllini istifadə edərək konnektora qoşa bilərik. Ancaq əvvəlcə əsas kabelin konnektora daxil olan hissəsini kəsməliyik. Sonra həmin parçanı bağlayıcı-obyektlə birləşdiririk (solda gördüyünüz kimi). Buradan @moonboots cavabını izləyin və əsas kabel ilə işiniz bitəcək.

Boruların konnektordakı yuvalarla səhv düzəldilməsində bir problem var idi. Buradakı həll yolu istifadə etməkdir Çəngəl dəyişdirici əlavə olaraq Döngə dəyişdirici lakin hər modu vertex qrupları ilə məhdudlaşdırmaq.

Əvvəlcə çəngəllə məşğul olaq. Get Redaktə etmə rejimi və boruların alt təpələrini seçin və mərkəzə bir 3d kursor qoyun (pulsuz bir addon & quotMACHIN3tools & quot istifadə edirəm).

Sonra gedin Obyekt rejimi və yenisini əlavə edin Boş obyekt. Sonra boş, bir bağlayıcı seçin, bir bağlayıcıya boşaltmaq üçün Ctrl + P düymələrini basın.

Sonra gedin Düzəliş rejimi, X-ray rejimini aktivləşdirmək üçün Alt + Z düymələrini basın və boruların sonunda bir neçə sıra zirvələri seçin. Sonra & quotNesne məlumat xassələri & quot nişanına gedin və yeni bir zirvə qrupu yaradın (buna & quotHook & quot adını verdim) və seçilmiş təpələri ona təyin edin.

İndi seçimi tərs çevirmək üçün Ctrl + I düymələrini basın və daha bir zirvə qrupu yaradın (buna & quotCurve deform & quot dedim).

Boruları ana kabelə bağlayın (bu obyektlərin mənşə nöqtələrinin eyni nöqtədə olduğunu yoxlayın) və əlavə edin. əyri dəyişdirici borulara (əsas kabel ilə eyni parametrlərlə). Sonra məhdudlaşdırın Əyri mod daha əvvəl yaratdığımız vertex qrupu ilə.

Sonra bir əlavə edək Çəngəl dəyişdirici. Üçün Obyekt borular sonunda yaratdığınız Boşluğu seçin və üçün Vertex qrupu & quotÇəng & quot qrupunu seçin.

Dördüncü hissə: gizli sous

İndi gəlin bunların necə davrandığını görək. Görünüşünü göstərəcəyəm əyri mod və onu transformasiya oxu boyunca sürün (mənim vəziyyətimdə Z). Və 2 təpə qrupunun birləşdiyi nöqtədə dəli olacağını görə bilərik.

İndi borulara hamısını düzəldən başqa bir mod əlavə edək. Buna & quot; Düzəldici & quot; deyilir. Parametrlər dəyişə bilər, mənim üçün işləyən dəyərləri aşağıdakı şəkildə görə bilərsiniz.


Ümumiyyətlə hər hansı bir funksiyaya zəng etmək sizə kiçik (kiçik) bir performans vuruşu verəcəkdir. Rekursiv funksiyalar (AFAIK) cizgilənə bilməz, beləliklə optimallaşdırıla bilməz. LINQ, digər funksiyaları axtarmağın ətrafında dönər, belə ki yaxşı performans göstərən bir kod yazmaq istəsən ən pis seçimdir. Daha əvvəl dedim, LINQ sürətli kod yazmaq üçün deyil, qısa kod yazmaq üçündür. Bu, bununla əlaqələndirilməsinə ehtiyac olmayan sadə bir alqoritmdir.

* LINQ-dan düzgün istifadə etməməyiniz kömək etmir, kodunuzda bir çox no-no var.

İstəsəniz ən sürətli yanaşma (yaddaşdakı bütün mümkün dəyərləri göstərməyə müraciət etmədən), bunlardan uzaq duracaq və daha birbaşa bir dönüşüm edərdiniz. Tamamilə ən sürətli olmaq üçün aşağı səviyyəyə enməli və təhlükəli (idarə olunmayan) koddan istifadə etməlisən. Mən ora getməyəcəm. Digər tərəfdən, ən sürətli idarə olunan kod istəyirsinizsə, bunu iterativ şəkildə etmək istərdiniz. Hər halda, təklifim ən sürətli tətbiq olmaq iddiası deyil, ola bilməz, amma bilmirəm, öyrənmək üçün onu profilə çəkməlisən.

Baza-10 rəqəmlərindən baza-26 "rəqəmlərinə" əsas konvertasiya edirik. Bunu etmək üçün daha sürətli bir alqoritm olub olmadığını bilmirəm, amma bir StringBuilder'ı bufer olaraq istifadə edərək düz bir dönüşüm var.

Digər tərəfdən, girişləriniz 50'iş qədər məhdud olduğundan, axtarışlar üçün yalnız bir sıra istifadə edə bilərsiniz (və IEnumerable & lt & gt deyil).


  1. 2 döngə yolu yaradın, bir kamera və bir hədəf obyekti yaradın və hər birini bir döngəyə əlavə edin (CTRL-P, sonra Yolu İzləyin).
  2. Hədəf olaraq təyin olunmuş hədəf obyekti ilə Kameraya məhdudlaşdırmaq üçün bir track əlavə edin
  3. Kameranı hədəfə yönəltmək üçün Məhdudlaşdırmaq üçün İzdə müvafiq oxu seçin. İşə gətirmək üçün kameraya və / və ya hədəf obyektinə miqyas və fırlanma tətbiq etməlisiniz.
  4. Kameranın fırlanması hədəf obyektinə uyğun olacaq. Kamera Z oxunu yuxarıya yönəltmək üçün hədəf obyekti döndərməyiniz lazım ola bilər. İlə başlayır -Z üçün AxınaY üçün Eksen yuxarı sizi çox vaxt olmaq istədiyiniz yerə aparacaq.

Obyekt üçün a əlavə edin Yol məhdudiyyətini izləyin və obyektin hədəf olaraq izləməsini istədiyiniz döngəni seçin. İzləmə əyrisini aktivləşdirin və canlı yolu aktivləşdirin.

Hədəfiniz bu yolu izləyəcək:

Kameranızı ikinci döngənizin eyni başlanğıc nöqtəsinə (səyahət yolu kimi istifadə etmək istədiyiniz) eyni yerə qoyun və hədəf olaraq əyri ilə bir İzləmə yolu məhdudiyyəti əlavə edin və yolu aktivləşdirin:

Kameranız o yolda gedəcək.

Kamerada a İzləyin Hədəf, -Z və Y qədər Y kimi obyekt ilə məhdudlaşdırma.

Əlavə boş obyektlərdən istifadə edərək həll etdim.

  1. Bir yol yaradın
  2. Boş bir kub yaradın
  3. Küpü Kamera üçün əsas obyekt kimi qurun: Kamera və Küpü seçin və sonra Ctrl-P "Nesne"
  4. "Yolu izləyin" sağ yan çubuğundan Küp üçün obyekt məhdudiyyəti əlavə edin

  1. Boş sahəni əlavə et
  2. Sfera üçün obyekt məhdudluğu sağ yan çubuqdan "Yolu İzləyin" əlavə edin (Könüllü)
  3. Kamera "İzləmək" üçün obyekt məhdudluğu əlavə edin və Sahəni seçin (buna "Kamera hədəfi" dedim). Ayrıca, Hədəf Z istifadə etməlisiniz

Nəticə: Y ilə Cube X və Z-ni Cube istifadə edərək kameranın fırlanmasını animasiya edə bilərsiniz

Görünüşünün bir nümunəsidir:

Çözüm tapdım, kameranı götür və əyri yolun sonuna qoy, sonra Shift düyməsini istifadə edərək həm kamera, həm də yol seçdim.

Seçildikdən sonra Ctrl + P düymələrini basın və izlə yolu seçin. Enter düyməsini basdığınızda kamera yolu izləyəcək. Məsələ onun yolu izləməməsidir, buna görə əvvəllər etdiyimizə bənzər bir şey edirsən, ancaq boş bir boşluq əlavə edirsən, yalnız bu dəfə yolun içərisinə qoyursan.

Bu vəziyyətdə kamera yolun sonunda, boş yer isə cığırın içərisinə, ancaq kameraya yaxın olduğu yerdədir. Beləliklə, boş və yolu seçin və Ctrl + P düymələrini basın, sonra yolu izləyin. Bunu etməzdən əvvəl zaman çizelgesinin Sıfırda olduğundan əmin olun ki, bu da Kameranı orijinal vəziyyətinə gətirir və animasiyanın sıfırdan başlamasını təmin edir.

Bir dəfə kameraya vurun və obyekt məhdudluğu çağırıldı İzləyin sonra hədəfi boşa qoyun, kimi dəyərləri təyin edin Yuxarı üçün Y və üçün, üçün -Z


Videoya baxın: 33 Years Of GRASS GIS As An Innovation Platform (Oktyabr 2021).