SASGIS - SAS.Планета
View Issue Details
0001172SAS.Планета[All Projects] Хотелкаpublic14-02-2012 11:2419-11-2013 11:06
Tolik 
vdemidov 
lowfeatureN/A
closedfixed 
110418 
120808120808 
0001172: Добавить поддержку разных EPSG
Многие локальные карты работают в своих локальных проекциях, и их невозможно аккуратно подключить к САС.Планете.

Например, http://maps.by/map/maps
URL тайла:
maps.by:8080/geoserver/gwc/service/wms?LAYERS=gkgc%3Acache_mapsby&STYLES=&FORMAT=image%2Fpng&TILESORIGIN=239373.209%2C5684923.453&TILED=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG%3A32635&BBOX=533261.05030048,5971643.2981712,540429.04642976,5978811.2943005&WIDTH=256&HEIGHT=256

Границы тайла - BBOX - вычисляются, по-видимому, по EPSG:32635

Хотелось бы в zmp указать этот EPSG и использовать для вычисления BBOX просто
ResultURL:=GetURLBase+RoundEx(GetLMetr,8)+','+RoundEx(GetBMetr,8)+','+RoundEx(GetRMetr,8)+','+RoundEx(GetTMetr,8);
Вот ещё пример такой карты: http://sasgis.org/forum/viewtopic.php?p=26181#p26181
локальные карты, проекции
zip lib.proj.-4.4.7.r.zip (2,519,228) 26-04-2012 11:29
https://bugtracker.sasgis.org/file_download.php?file_id=752&type=bug
zip maps.by.epsg.zmp.zip (3,320) 07-05-2012 11:14
https://bugtracker.sasgis.org/file_download.php?file_id=781&type=bug
rar Terraserver-2008-05-07-Hoznikovo.zmp.rar (2,534) 23-05-2012 11:36
https://bugtracker.sasgis.org/file_download.php?file_id=828&type=bug
? epsg (648,497) 23-05-2012 19:34
https://bugtracker.sasgis.org/file_download.php?file_id=830&type=bug
rar UTMZoneConverter.rar (194,098) 23-05-2012 19:55
https://bugtracker.sasgis.org/file_download.php?file_id=831&type=bug
rar karta-dv.zmp.rar (1,220) 31-05-2012 10:53
https://bugtracker.sasgis.org/file_download.php?file_id=836&type=bug
zip proj480.zip (92,913) 31-05-2012 19:39
https://bugtracker.sasgis.org/file_download.php?file_id=837&type=bug
zip navici.zmp.zip (2,803) 19-11-2013 11:06
https://bugtracker.sasgis.org/file_download.php?file_id=1592&type=bug
Issue History
14-02-2012 11:24TolikNew Issue
14-02-2012 11:27TolikDescription Updatedbug_revision_view_page.php?rev_id=2751#r2751
16-02-2012 11:29TolikNote Added: 0005527
16-02-2012 11:56TolikNote Edited: 0005527bug_revision_view_page.php?bugnote_id=5527#r2785
16-02-2012 11:57TolikNote Edited: 0005527bug_revision_view_page.php?bugnote_id=5527#r2786
29-02-2012 11:03gpsMaxTag Attached: локальные карты
29-02-2012 11:06gpsMaxTag Attached: проекции
02-03-2012 08:40vdemidovStatusnew => confirmed
02-03-2012 08:40vdemidovTarget Version => 40xxxx
24-04-2012 19:00vasketsovNote Added: 0006471
24-04-2012 19:10vasketsovNote Edited: 0006471bug_revision_view_page.php?bugnote_id=6471#r3203
24-04-2012 19:57zedNote Added: 0006472
24-04-2012 20:21vasketsovNote Added: 0006473
24-04-2012 20:27vasketsovNote Edited: 0006473bug_revision_view_page.php?bugnote_id=6473#r3205
24-04-2012 21:04zedNote Added: 0006474
24-04-2012 21:23vasketsovNote Added: 0006475
25-04-2012 09:43vasketsovNote Added: 0006476
25-04-2012 09:45vasketsovNote Edited: 0006476bug_revision_view_page.php?bugnote_id=6476#r3207
26-04-2012 11:28vasketsovNote Added: 0006479
26-04-2012 11:29vasketsovFile Added: lib.proj.-4.4.7.r.zip
26-04-2012 11:37vasketsovNote Added: 0006480
26-04-2012 11:37vasketsovAssigned To => vasketsov
26-04-2012 11:37vasketsovStatusconfirmed => assigned
05-05-2012 16:49vasketsovNote Added: 0006780
05-05-2012 17:56TolikNote Added: 0006790
05-05-2012 18:16vasketsovNote Added: 0006797
05-05-2012 18:21TolikNote Added: 0006799
05-05-2012 18:23vasketsovNote Added: 0006800
05-05-2012 18:27vasketsovNote Edited: 0006800bug_revision_view_page.php?bugnote_id=6800#r3325
05-05-2012 18:27TolikNote Added: 0006801
05-05-2012 18:29vasketsovNote Added: 0006802
05-05-2012 18:33vasketsovNote Edited: 0006802bug_revision_view_page.php?bugnote_id=6802#r3327
05-05-2012 18:46vasketsovNote Added: 0006804
05-05-2012 18:50vdemidovNote Added: 0006805
05-05-2012 18:59vasketsovNote Added: 0006807
07-05-2012 11:12TolikNote Added: 0006847
07-05-2012 11:13TolikNote Edited: 0006847bug_revision_view_page.php?bugnote_id=6847#r3346
07-05-2012 11:14TolikFile Added: maps.by.epsg.zmp.zip
07-05-2012 11:16TolikNote Edited: 0006847bug_revision_view_page.php?bugnote_id=6847#r3347
07-05-2012 12:09vasketsovNote Added: 0006853
21-05-2012 18:51vasketsovNote Added: 0007148
22-05-2012 05:32TolikNote Added: 0007152
22-05-2012 05:34TolikNote Edited: 0007152bug_revision_view_page.php?bugnote_id=7152#r3545
22-05-2012 05:42TolikNote Edited: 0007152bug_revision_view_page.php?bugnote_id=7152#r3546
22-05-2012 08:12vasketsovNote Added: 0007155
22-05-2012 11:33vasketsovNote Edited: 0007155bug_revision_view_page.php?bugnote_id=7155#r3548
23-05-2012 09:30vasketsovNote Added: 0007163
23-05-2012 09:38vasketsovNote Added: 0007164
23-05-2012 09:39vasketsovNote Edited: 0007164bug_revision_view_page.php?bugnote_id=7164#r3550
23-05-2012 09:43vasketsovNote Added: 0007165
23-05-2012 09:54vasketsovNote Edited: 0007163bug_revision_view_page.php?bugnote_id=7163#r3552
23-05-2012 09:54vasketsovNote Edited: 0007163bug_revision_view_page.php?bugnote_id=7163#r3553
23-05-2012 10:13TolikNote Added: 0007166
23-05-2012 10:46zedNote Added: 0007167
23-05-2012 11:29vasketsovNote Added: 0007168
23-05-2012 11:35vasketsovNote Edited: 0007168bug_revision_view_page.php?bugnote_id=7168#r3555
23-05-2012 11:35vasketsovNote Edited: 0007168bug_revision_view_page.php?bugnote_id=7168#r3556
23-05-2012 11:36vasketsovFile Added: Terraserver-2008-05-07-Hoznikovo.zmp.rar
23-05-2012 18:57vasketsovNote Added: 0007169
23-05-2012 18:58vasketsovFile Added: karta-dv.zmp.rar
23-05-2012 19:02zedNote Added: 0007170
23-05-2012 19:02vasketsovNote Edited: 0007169bug_revision_view_page.php?bugnote_id=7169#r3558
23-05-2012 19:03vasketsovNote Added: 0007171
23-05-2012 19:10vasketsovNote Edited: 0007169bug_revision_view_page.php?bugnote_id=7169#r3559
23-05-2012 19:23TolikNote Added: 0007172
23-05-2012 19:31vasketsovNote Added: 0007173
23-05-2012 19:33vasketsovNote Edited: 0007173bug_revision_view_page.php?bugnote_id=7173#r3561
23-05-2012 19:34zedNote Added: 0007174
23-05-2012 19:34zedFile Added: epsg
23-05-2012 19:37zedNote Edited: 0007174bug_revision_view_page.php?bugnote_id=7174#r3563
23-05-2012 19:55vasketsovNote Added: 0007175
23-05-2012 19:55vasketsovFile Added: UTMZoneConverter.rar
30-05-2012 23:03vasketsovAssigned Tovasketsov => vdemidov
30-05-2012 23:07vasketsovNote Added: 0007253
31-05-2012 10:47vdemidovNote Added: 0007259
31-05-2012 10:52vdemidovFile Deleted: karta-dv.zmp.rar
31-05-2012 10:53vdemidovFile Added: karta-dv.zmp.rar
31-05-2012 16:12zedNote Added: 0007260
31-05-2012 16:19vdemidovNote Added: 0007261
31-05-2012 16:23zedNote Added: 0007262
31-05-2012 16:26zedNote Added: 0007263
31-05-2012 16:29zedNote Edited: 0007263bug_revision_view_page.php?bugnote_id=7263#r3608
31-05-2012 17:27vdemidovNote Added: 0007264
31-05-2012 17:33TolikNote Added: 0007265
31-05-2012 17:48zedNote Added: 0007266
31-05-2012 18:08vdemidovNote Added: 0007267
31-05-2012 19:39zedFile Added: proj480.zip
31-05-2012 19:45zedNote Added: 0007268
31-05-2012 19:48vdemidovNote Added: 0007269
31-05-2012 19:49zedNote Added: 0007270
31-05-2012 20:01zedNote Added: 0007271
31-05-2012 21:58vasketsovNote Added: 0007272
01-06-2012 06:36vdemidovNote Added: 0007274
01-06-2012 17:33vasketsovNote Added: 0007277
01-06-2012 17:38vasketsovNote Edited: 0007277bug_revision_view_page.php?bugnote_id=7277#r3610
18-06-2012 08:18vdemidovStatusassigned => resolved
18-06-2012 08:18vdemidovFixed in Version => 120808
18-06-2012 08:18vdemidovResolutionopen => fixed
18-06-2012 09:00vdemidovTarget Version40xxxx => 120808
18-06-2012 09:02TolikNote Added: 0007457
18-06-2012 09:14vdemidovNote Added: 0007458
19-06-2012 07:18zedNote Added: 0007512
19-06-2012 07:36vdemidovNote Added: 0007514
19-06-2012 07:47vdemidovNote Edited: 0007514bug_revision_view_page.php?bugnote_id=7514#r3685
10-10-2012 11:46TolikStatusresolved => closed
19-11-2013 11:05TolikNote Added: 0013284
19-11-2013 11:06TolikNote Edited: 0013284bug_revision_view_page.php?bugnote_id=13284#r5844
19-11-2013 11:06TolikFile Added: navici.zmp.zip

Notes
(0005527)
Tolik   
16-02-2012 11:29   
(edited on: 16-02-2012 11:57)
Вот ещё карта:
http: 195.91.135.30/ArcGIS/rest/services/osi_o/MapServer/export?dpi=96&transparent=true&format=png8&bbox=%7B%22xmin%22%3A16581.53312734728%2C%22ymin%22%3A15576.20119252291%2C%22xmax%22%3A17428.201487350667%2C%22ymax%22%3A16105.368917525027%2C%22spatialReference%22%3A%7B%22wkt%22%3A%22PROJCS%5B%5C%22Moscow%20Coordinate%20System%5C%22%2CGEOGCS%5B%5C%22GCS_Krasovsky_1940%5C%22%2CDATUM%5B%5C%22D_Krasovsky_1940%5C%22%2CSPHEROID%5B%5C%22Krasovsky_1940%5C%22%2C6378245.0%2C298.3%5D%5D%2CPRIMEM%5B%5C%22Greenwich%5C%22%2C0.0%5D%2CUNIT%5B%5C%22Degree%5C%22%2C0.0174532925199433%5D%5D%2CPROJECTION%5B%5C%22Gauss_Kruger%5C%22%5D%2CPARAMETER%5B%5C%22False_Easting%5C%22%2C0.0%5D%2CPARAMETER%5B%5C%22False_Northing%5C%22%2C0.0%5D%2CPARAMETER%5B%5C%22Central_Meridian%5C%22%2C37.4998%5D%2CPARAMETER%5B%5C%22Scale_Factor%5C%22%2C1.0%5D%2CPARAMETER%5B%5C%22Latitude_Of_Origin%5C%22%2C55.667%5D%2CUNIT%5B%5C%22Meter%5C%22%2C1.0%5D%5D%22%7D%7D&size=800%2C500&f=image

Типа Московская СК, куча параметров, и Красовский там, и Гаусс-Крюгер, красота!
И BBOX в 16 км от начала координат 37.4998,55.667 (там находится стоянка автосервиса :)

Отзовитесь, можно ли такое реализовать? И вообще, корректна ли постановка вопроса?


Офтопик: кто знает простой инструмент для перевода всех этих %5C в читабельные символы?

P.S. Ответ: http://meyerweb.com/eric/tools/dencoder/

(0006471)
vasketsov   
24-04-2012 19:00   
(edited on: 24-04-2012 19:10)
Terraserver работает в оригинале с проекцией для соответствующей зоны, например, EPSG:32640 соответствует N40, и соответственно для идеальной похожести запросов как-то бы сделать её поддержку (ну и соответственно других аналогичных "зональных" проекций). Хоть бы формулы кто подкинул.

На всякий случай прдублирую тут ссылку на Proj4:
http://trac.osgeo.org/proj/
http://www.triplexware.huckfinn.de/geogfix.html#proj

(0006472)
zed   
24-04-2012 19:57   
>Хоть бы формулы кто подкинул
Как я понимаю, если подключить либу Proj4 то и в формулы вникать не придётся?
А вообще, это мего-хотелка - подключить эту либу и заюзать все доступные проекции одним махом.
(0006473)
vasketsov   
24-04-2012 20:21   
(edited on: 24-04-2012 20:27)
Ну по идее да.
Но вот только дата последнего обновления DLL в сравнении с датой последнего обновления proj4 совсем не радует.

Вот чего откопалось:
http://spatialreference.org/ref/epsg/32640/
Вправо-влево - соседние зоны.
Третья ссылка в табличке - параметры для proj4.
То есть по идее поддержка 326__ должна быть.

ps. Определённо да. В файлике lib.proj.-4.4.7.r.zip есть API + DLL.

(0006474)
zed   
24-04-2012 21:04   
Судя по размеру и наполнению заголовочников proj4, обновить API до текущей версии не проблема.
(0006475)
vasketsov   
24-04-2012 21:23   
Ну я попробую сначала для наших зон 32630-32660 сделать и поиграться.
Всё равно же придётся писать в zmp что-то типа EPSG:32640, а не '+proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs'. А там дальше видно будет что к чему.
(0006476)
vasketsov   
25-04-2012 09:43   
(edited on: 25-04-2012 09:45)
Пришёл к выводу, что даже для обычных проекций надо уметь генерить координаты для запросов с учётом соответствующей зоны. Например projid=32637&xul=370759.308622674&yul=6097520.70703952 для обычного DG (так работает terraserver над globexplore-ром).
Так что всё несколько извращённее.
Либо надо прямо указывать зону в скрипте (типа установить зону, сбросить зону), либо определять её автоматом в скрипте, либо делать настройку для этого в zmp, чтобы все "метрические" функции всегда возвращали координаты в зоне (что мягко говоря не хочется).

(0006479)
vasketsov   
26-04-2012 11:28   
Сделал интерфейс (точнее даже 2 разных) над proj447.dll, которая должна лежать в папке с сасом. Но работает и без неё. В параметрах карт изменений нет.

Сейчас прикручен интерфейс для конвертации координат в паскальскрипте.
Прикручена общая функциональность, возможно по результатам тестирования сформируется перечень обобщённых функций, которые будут использоваться в большинстве случаев. Но пока что тестируем руками и отписываемся.

Описание интерфейса:
  IProj4Conv = interface
    function AvailableConv: Boolean; stdcall;
    function SetProj(const Args, APath: String): Boolean; stdcall;
    function SetEPSG(const AEPSG: Integer): Boolean; stdcall;
    function LonLat2XY(const AProjLP: TDoublePoint): TDoublePoint; stdcall;
    function XY2LonLat(const AProjXY: TDoublePoint): TDoublePoint; stdcall;
  end;

Доступен в скрипте как переменная Proj4Conv типа IProj4Conv.

Пример использования:
var
  BL,M: TDoublePoint;
  TR,N: TDoublePoint;
  VEPSG: Integer;
  VCoords: String;
  VLeft: Double;
begin
  // test proj4
  VLeft := GetLLon;
  VCoords := RoundEx(VLeft,9)+','+RoundEx(GetBLat,9)+','+RoundEx(GetRLon,9)+','+RoundEx(GetTLat,9);
  if (GetAfter('EPSG:4326', GetURLBase) <> '') then begin
    // base EPSG:4326 defined in URL
    ResultURL:=GetURLBase+VCoords;
  end else begin
    // no EPSG:4326 - calc utm zone
    VEPSG := (Round(VLeft) div 6) + 32631;
    Proj4Conv.SetEPSG(VEPSG);
    if Proj4Conv.AvailableConv then begin
      // use current zone
      BL.x := VLeft;
      BL.y := GetBLat;
      TR.x := GetRLon;
      TR.y := GetTLat;
      M := Proj4Conv.LonLat2XY(BL);
      N := Proj4Conv.LonLat2XY(TR);
      ResultURL:=GetURLBase+RoundEx(M.x,9)+','+RoundEx(M.y,9)+','+RoundEx(N.x,9)+','+RoundEx(N.y,9)+'&SRS=EPSG:'+IntToStr(VEPSG);
    end else begin
      // not available - force EPSG:4326
      ResultURL:=GetURLBase+VCoords+'&SRS=EPSG:4326';
    end;
  end;
end.

Смысл примера:
Если в УРЛе есть строка 'EPSG:4326' - то используем её, иначе определяем проекцию и устанавливаем (через фнкцию SetEPSG), но если же проекция по какой-либо причине недоступна - то опять же возвращаемся к использованию EPSG:4326.

Установка проекции выполняется либо указанием номера EPSG (первый способ), либо через функцию SetProj с передачей ей всех параметров (второй способ). Первый способ внутри вызывает второй (пока что только если значение EPSG между 32630 и 32660) как SetProj('+proj=utm +zone='+IntToStr(AEPSG-32600)+' +ellps=WGS84 +datum=WGS84 +units=m +no_defs', '')

Подробности описания параметров в приаттаченном архиве. оттуа же взять DLL и при необходимости папку nad.
(0006480)
vasketsov   
26-04-2012 11:37   
Артефактов при скачке одного и того же участка качаемого мной снимка в EPSG:4326
 и в EPSG:32640 я не заметил, но он далеко от границы зоны.
Кроме того, сейчас пока что есть неоптимальность, что конвертер грохается и создаётся заново, как будет понятно что к чему - будем исправлять эту кривоту, чтобы он мог жить своей жизнью.
(0006780)
vasketsov   
05-05-2012 16:49   
Ну чего, кто-то пользуется? Косяки находили?

А то я вовсю юзаю... ошибку нашёл в примере - надо не
VEPSG := (Round(VLeft) div 6) + 32631;
а
VEPSG := (Trunc(VLeft) div 6) + 32631;

Какие-то номера проекций или диапазоны добавить?

По поводу реализации - оставить как есть (конвертер грохается и создаётся заново), или например сделать его как свойство у IConverter (и тогда он будет доступен везде в коде, и будет создаваться только по требованию)?
(0006790)
Tolik   
05-05-2012 17:56   
vasketsov, вы б как-то подоступнее объяснили, как этим пользоваться. Рабочий пример бы приложили. А то я 2 недели назад прочитал, ничего не понял да и забыл.
(0006797)
vasketsov   
05-05-2012 18:16   
Пример в сообщении от (26-04-2012 12:28) рабочий. Что именно там непонятно?
Взят из zmp для T@rras@rv@r.

В DefaultURL есть 'EPSG:4326'. Наличием или отсутствием этого куска определяется формат запросов (а его можно править из саса).

В примере проверяется наличие EPSG:4326 (можно разными способами, здесь GetAfter, можно смело юзать GetBefore).

Если нет - значит запрос строим через зону utm.
Зона (точнее сразу EPSG) определяется как
VEPSG := (Trunc(VLeft) div 6) + 32631;

Далее пытаемся её установить:
Proj4Conv.SetEPSG(VEPSG);
Это работает только если есть proj447.dll, если нет - вернётся FALSE. Но в примере результат не проверяется. Вместо этого отдельная функция проверяет доступность текущей проекции:
if Proj4Conv.AvailableConv then ...

Соответственно если проекция доступна (и некоторые другие проверки также успешны), то заполняем координаты LonLat и вызываем:
Proj4Conv.LonLat2XY
для конвертации в метры в установленной проекции. Соответственно после этого формируем ResultURL на основании результата выполнения LonLat2XY.

Если надо не простые зоны типа EPSG:32640 - то надо вызывать не Proj4Conv.SetEPSG(VEPSG), а функцию
Proj4Conv.SetProj(const Args, APath: String). Но другие проекции я не проверял.

Это пока что сделано только для формирования запросов.
(0006799)
Tolik   
05-05-2012 18:21   
Ну а весь рабочий zmp можно получить?
(0006800)
vasketsov   
05-05-2012 18:23   
(edited on: 05-05-2012 18:27)
>весь рабочий zmp можно получить?
Очевидно нет )))
Да и не зачем.
В params.txt ничего не меняется.

В скрипте (запрос идёт на локальный проксик, где вся логика скрыта):
var
  TL,M: TDoublePoint;
  BR,N: TDoublePoint;
  BL,K: TDoublePoint;
  TR,L: TDoublePoint;
  CC,C: TDoublePoint;
  VEPSG: Integer;
begin
  TL.x := GetLLon;
  TL.y := GetTLat;
  BR.x := GetRLon;
  BR.y := GetBLat;
  BL.x := GetLLon;
  BL.y := GetBLat;
  TR.x := GetRLon;
  TR.y := GetTLat;
  CC.x := (GetLLon+GetRLon)/2;
  CC.y := (GetTLat+GetBLat)/2;

  // get zone
  VEPSG := (Trunc(TL.x) div 6) + 32631;
  Proj4Conv.SetEPSG(VEPSG);
  if Proj4Conv.AvailableConv then begin
    // convert
    M := Proj4Conv.LonLat2XY(TL);
    N := Proj4Conv.LonLat2XY(BR);
    K := Proj4Conv.LonLat2XY(BL);
    L := Proj4Conv.LonLat2XY(TR);
    C := Proj4Conv.LonLat2XY(CC);
    // make url
    ResultURL := GetURLBase + '&tlx=' + RoundEx(M.x,6) +
                              '&tly=' + RoundEx(M.y,6) +
                              '&brx=' + RoundEx(N.x,6) +
                              '&bry=' + RoundEx(N.y,6) +
                              '&blx=' + RoundEx(K.x,6) +
                              '&bly=' + RoundEx(K.y,6) +
                              '&trx=' + RoundEx(L.x,6) +
                              '&try=' + RoundEx(L.y,6) +
                              '&ccx=' + RoundEx(C.x,6) +
                              '&ccy=' + RoundEx(C.y,6) +
                              '&llt=' + RoundEx(GetTLat,9) +
                              '&llb=' + RoundEx(GetBLat,9) +
                              '&lll=' + RoundEx(GetLLon,9) +
                              '&llr=' + RoundEx(GetRLon,9) +
                              '&sps=' + IntToStr(VEPSG) +
                              '&ver=' + Version;
  end else begin
    // not available
    ResultURL := GetURLBase;
  end;
end.

(0006801)
Tolik   
05-05-2012 18:27   
Тогда сделайте простейший zmp, например, для maps.by
(0006802)
vasketsov   
05-05-2012 18:29   
(edited on: 05-05-2012 18:33)
Вот буквально для построения запроса из заголовка темы ничего больше и не надо.

Он (скрипт) буквально и есть в сообщении от (26-04-2012 12:28):
1. Меняем Round на Trunc в тексте скрипта.
2. УРЛ по умолчанию:
maps.by:8080/geoserver/gwc/service/wms?LAYERS=gkgc%3Acache_mapsby&STYLES=&FORMAT=image%2Fpng&TILESORIGIN=239373.209%2C5684923.453&TILED=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&WIDTH=256&HEIGHT=256&BBOX=
3. Не знаю что за origin.

(0006804)
vasketsov   
05-05-2012 18:46   
Вощем нужен совет от разработчиков: сделать его как свойство у IConverter (и тогда он будет доступен везде в коде и в паскальскрипте, и будет создаваться только по требованию)?
Ну и вообще мысли по теме какие есть.
(0006805)
vdemidov   
05-05-2012 18:50   
Я бы предложил прописать EPSG дополнительного конвертера в параметрах карты, тобишь в params.txt, а в самом скрипте уже использовать готовый, или выдавать ошибку если дополнительный конвертер не задан или не можем создать.
(0006807)
vasketsov   
05-05-2012 18:59   
>прописать EPSG дополнительного конвертера в параметрах карты, тобишь в params.txt
В обсуждаемой формулировке не прокатит.

Карта одна - обычный LonLat - а запросы для скачивания тайлов строятся с разными EPSG в зависимости от зоны (в примере это определяется по левой координате). Даже автоматом это не определить, потому что будет глюк, если между L и R будет граница зоны.

Но это в этом конкретном случае. Вполне может быть что в случае сильно других проекций может быть задана одна настройка на весь мир. Тогда конечно может и надо в params заводить переменную. Но то что только лишь ей не обойтись - это факт.

В итоге я так понимаю надо делать до двух объектов Proj4Conv на карту, один внутренний (для создания по данным из params.txt), а второй настраиваемый из скрипта (по умолчанию равный первому, в том числе NIL, и если отсутствует - создавать по первому требованию).
(0006847)
Tolik   
07-05-2012 11:12   
(edited on: 07-05-2012 11:16)
Попробовал сделать maps.by.epsg.zmp
Не работает :(

Программа формирует такой URL (в районе Минска, z12):
http://maps.by:8080/geoserver/gwc/service/wms?LAYERS=gkgc%3Acache_mapsby&STYLES=&FORMAT=image%2Fpng&TILESORIGIN=239373.209%2C5684923.453&TILED=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&WIDTH=256&HEIGHT=256&BBOX=527751.285126273,5967196.404600956,539217.096580412,5978801.120182994&SRS=EPSG:32635


Сервер выдаёт ошибку:
400: Requested horizontal resolution: 44.78832599273028 , best match: 27.99998488 exceeds 10% threshold. Perhaps the client is configured with an incorrect set of scales (resolutions), or the DPI setting is off compared to the one in GWC ?

Хороший URL:
http://maps.by:8080/geoserver/gwc/service/wms?LAYERS=gkgc%3Acache_mapsby&STYLES=&FORMAT=image%2Fjpeg&TILESORIGIN=239373.209%2C5684923.453&TILED=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG%3A32635&BBOX=526093.0541712,5971643.2981712,544013.0444944,5989563.2884944&WIDTH=256&HEIGHT=256

Но масштаб на maps.by не совпадает с гугловским - может, в этом причина?
URL-то ПОЧТИ правильный, только размер бокса, наверно, не тот.

(0006853)
vasketsov   
07-05-2012 12:09   
На terra$erverе тоже mpp н совпадает с сасовским и фиксирован (из закрытого списка). Это уже не вопрос к проекции, это значит что координаты в BBOX не независимые (и например правая должна считаться через левую исходя из mpp и width). А может быть можно width изменить, чтобы BBOX остался запрошенным.
(0007148)
vasketsov   
21-05-2012 18:51   
Собираюсь добить тему с proj4.
Сейчас есть примеры карт, для которых было бы целесообразным указание EPSG на всю область определения карты?
Для того же terra$erverа EPSG определяется исходя из зоны UTM, то есть одной настройкой на весь мир не обойтись. А есть, для кого обойтись (из существующих сейчас сервисов)?
(0007152)
Tolik   
22-05-2012 05:32   
(edited on: 22-05-2012 05:42)
А вот в первых двух комментах глобус Москвы - можно прикрутить?

Хрестоматийная карта Мальмо: http://sasgis.org/forum/viewtopic.php?p=26181#p26181

Ещё помню делал карту Израиля, намучался, а результат фиговый: http://sasgis.org/forum/viewtopic.php?p=20062#p20062
Правда, с Израилем непонятно, какой там EPSG.

А вот Самара - EPSG 4326: http://sasgis.org/forum/viewtopic.php?p=25557#p25557

(0007155)
vasketsov   
22-05-2012 08:12   
(edited on: 22-05-2012 11:33)
Вообще-то EPSG:4326 и сейчас уже работает, через обычные метрические координаты.

Сейчас накидаю сюда ссылок на параметры proj4, и погляжу чего интересного есть. Ибо сам пока не очень понимаю, какую именно проецию как указать для proj4.

Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 5
http://spatialreference.org/ref/epsg/2399/
+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs


Pulkovo 1995 / Gauss-Kruger CM 57E
http://spatialreference.org/ref/epsg/2469/
+proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs


Pulkovo 1995 / 3-degree Gauss-Kruger zone 15
http://spatialreference.org/ref/epsg/2649/
+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs

Вощем вопрос на миллион - как параметры из
Spatial Reference: PROJCS["Moscow Coordinate System",GEOGCS["GCS_Krasovsky_1940",DATUM["D_Krasovsky_1940",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",37.4998],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",55.667],UNIT["Meter",1.0]]
упаковать в proj4.

Ну и шведская заодно )))
http://spatialreference.org/ref/epsg/3008/
SWEREF99 13 30 EPSG:3008
+proj=tmerc +lat_0=0 +lon_0=13.5 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs

(строка с плюсиками везде - это строка инициализации proj4 для указанной проекции).

(0007163)
vasketsov   
23-05-2012 09:30   
(edited on: 23-05-2012 09:54)
В итоге безотносительно выдумывания настроек роекций для конкретной карты в окончательном виде (не без помарок и возможных недочётов, но общая логика) получилось следующее:

1. В zmp строковые параметры Proj4Args и Proj4Path. Первый - аргументы инициализации proj4, второй - путь до вспомогательных файлов proj4. Эти два параметра необходимы и достаточны (в настоящий момент) для любой настройки proj4. Чаще всего Proj4Path можно не использовать вообще (то есть путь будет пустой строкой).

2. Указание значения параметра Proj4Args является обязательным для инициализации proj4. Пусть даже там будет заведомая ерунда. Если нет Proj4Args - proj4 для конвертера координат инициализироваться не будет. На основании существующих парамеров EPSG, projection, sradiusa и sradiusb инициализация proj4 не производится. Это сделано специально, потому как все те сервисы, на которые я налетел, при запросах используют не одну конкретную EPSG, а их семейство (в зависимости от зоны используется конкретное значение EPSG).

2а. Ровно одно исключение. Если указано значение для Proj4Path и НЕ указано значение для Proj4Args - инициализация proj4 будет проведена на основе значения EPSG и Proj4Path.

3. Значение для Proj4Args может быть двух типов. Простой вариант - указание типа 'Proj4Args=EPSG:32637' (полностью равносильно вызову функции SetEPSG для указанного целого кода EPSG в скрипте). Полный вариант - указание строки типа '+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs' (равносильно вызову функции SetProj в скрипте).

4. Значения, используемые при инициализации proj4, запоминаются внутри, и повторной инициализации не производится. То есть в скрипте можно смело использовать SetEPSG сколько угодно раз, если код EPSG не меняется - до proj4 это даже не дойдёт.

5. Экспорт и прочая аналогичная функциональность использует предварительно созданные конвертеры (собственно как и было раньше), важно только, что предварительные конвертеры создаются без инициализации proj4 и используются в том числе для всех карт, для которых не выполнена инициализация proj4.

6. Пришлось внести косметические изменения в интерфейсы, так что скрипты, которые использовали proj4, придётся поправить. Как именно - в следующем сообщении. Скрипты - везде имеется в виду паскальскрипт.

(0007164)
vasketsov   
23-05-2012 09:38   
(edited on: 23-05-2012 09:39)
Изменения в скриптах вследствие измененйи в интерфейсах следующие (относительно того что было в сообщениях от 05-05-2012 19:23, 26-04-2012 12:28 и других в этой теме):
1. Интерфейс proj4 стал выглядеть так:
  IProj4Converter = interface
    function Available: Boolean; stdcall;
    function SetProj(const AArgs, APath: String): Boolean; stdcall;
    function SetEPSG(const AEPSG: Integer; const APath: String): Boolean; stdcall;
    function LonLat2XY(const AProjLP: TDoublePoint): TDoublePoint; stdcall;
    function XY2LonLat(const AProjXY: TDoublePoint): TDoublePoint; stdcall;
  end;
2. Доступ к нему стал через функцию function GetProj4Converter: IProj4Converter; stdcall; от объекта Converter (интерфейс ICoordConverter в скрипте).
3. Объект Proj4Conv теперь не создаётся - при необходимости его надо определять руками в секции var и присваивать ему значение. Пример ниже.
4. Если есть сомнения, что пихать в SetProj или SetEPSG вторым параметром - пихать туда пустую строку.

Пример (автоопределение зоны UTM и в зависимости от этого установка EPSG):
var
  TL,M: TDoublePoint;
  BR,N: TDoublePoint;
  BL,K: TDoublePoint;
  TR,L: TDoublePoint;
  CC,C: TDoublePoint;
  VEPSG: Integer;
  Proj4Conv: IProj4Converter;
begin
  TL.x := GetLLon;
  TL.y := GetTLat;
  BR.x := GetRLon;
  BR.y := GetBLat;
  BL.x := GetLLon;
  BL.y := GetBLat;
  TR.x := GetRLon;
  TR.y := GetTLat;
  CC.x := (GetLLon+GetRLon)/2;
  CC.y := (GetTLat+GetBLat)/2;

  // get zone
  VEPSG := (Trunc(TL.x) div 6) + 32631;
  Proj4Conv := Converter.GetProj4Converter;
  Proj4Conv.SetEPSG(VEPSG,'');
  if Proj4Conv.Available then begin
    // convert
    M := Proj4Conv.LonLat2XY(TL);
    N := Proj4Conv.LonLat2XY(BR);
    K := Proj4Conv.LonLat2XY(BL);
    L := Proj4Conv.LonLat2XY(TR);
    C := Proj4Conv.LonLat2XY(CC);
    // make url
    ResultURL := GetURLBase + '&tlx=' + RoundEx(M.x,6) +
                              '&tly=' + RoundEx(M.y,6) +
                              '&brx=' + RoundEx(N.x,6) +
                              '&bry=' + RoundEx(N.y,6) +
                              '&blx=' + RoundEx(K.x,6) +
                              '&bly=' + RoundEx(K.y,6) +
                              '&trx=' + RoundEx(L.x,6) +
                              '&try=' + RoundEx(L.y,6) +
                              '&ccx=' + RoundEx(C.x,6) +
                              '&ccy=' + RoundEx(C.y,6) +
                              '&llt=' + RoundEx(GetTLat,9) +
                              '&llb=' + RoundEx(GetBLat,9) +
                              '&lll=' + RoundEx(GetLLon,9) +
                              '&llr=' + RoundEx(GetRLon,9) +
                              '&sps=' + IntToStr(VEPSG) +
                              '&ver=' + Version;
  end else begin
    // not available
    ResultURL := GetURLBase;
  end;
end.

(0007165)
vasketsov   
23-05-2012 09:43   
Из известных потенциальных проблем: поскольку конвертер proj4 один на конвертер координат - в случае параллельной скачки одной карты в разных зонах при автоопределении зоны возможна "война EPSG", так как конвертер EPSG в рамках одного выполнения одного скрипта не блокируется от сторонних изменений.
(0007166)
Tolik   
23-05-2012 10:13   
Ох, очень трудно понять такие длинные слова: интерфейсы, аргументы, инициализации, когда в голове опилки :)
Сделайте, пожалуйста, один любой рабочий ZMP. C одной предустановленной EPSG. Сразу всё будет ясно.

Офф: Почему это вдруг строки в постах перестали переноситься?
(0007167)
zed   
23-05-2012 10:46   
>Почему это вдруг строки в постах перестали переноситься?
vasketsov своими постами порвал все шаблоны и запутал все извилины :)
(0007168)
vasketsov   
23-05-2012 11:29   
(edited on: 23-05-2012 11:35)
>рабочий ZMP
Мне мало интереса возиться с тем, что мне неинтересно, Швеция там или Израиль. Или какие-то криворукие рисунки линиями по Москве.

Я могу мучительно долго сидеть и думать, как конвертнуть Spatial Reference: PROJCS["Moscow Coordinate System",GEOGCS["GCS_Krasovsky_1940",DATUM["D_Krasovsky_1940",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",37.4998],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",55.667],UNIT["Meter",1.0]]
 в параметры для proj4, но только при условии пользы лично для меня, так что извините.

Например я могу выложить старый zmp от терра$erver-а (до того как они закодировали параметры), сейчас он уже не работает, но раньше работал. Надо?

Есть сервис со снимками по РФ в неподдерждиваемой проекции, чтобы его окучить? Тогда давайте готовый zmp, где вроде бы почти всё есть, только проекцию надо вправить нужную.

Впрочем если так уж нужен рабочий zmp целиком - приаттачил для t@rra$@rv@rа (для снимка дороги Лежнево-Хозниково-Шуя). Логика вся скрыта в локальном прокси. Но zmp сам по себе рабочий (с новой версией интерфейсов).

(0007169)
vasketsov   
23-05-2012 18:57   
(edited on: 23-05-2012 19:10)
Сделал карту karta-dv, проверял только Хабаровск, на гибрид НЯК ложится в пределах погрешности рисования, тайлы стыкуются, хотя может чего и не углядел.
http://www.karta-dv.ru/?page=1

Проекция там такая:
http://spatialreference.org/ref/epsg/28483/

Чтобы автоматически работало Proj4Args=EPSG:2513 в zmp - это в завтрешней сборке только будет, только что добавил это.
Имею в виду поддержку проекций семейств Pulkovo 1995 / Gauss-Kruger CM и Pulkovo 1942 / Gauss-Kruger CM (это EPSG:2463-2491 и EPSG:2492-2522).
Кому неохота ждать завтрашнюю - проекцию надо указывать как '+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs' (точное значние смотреть по ссылке на spatialreference.org)

На всякий случай сделал проверку выхода за границы зоны на +1 или -1, думаю хватит.

Как пример для ковыряния - думаю вполне покатит.

(0007170)
zed   
23-05-2012 19:02   
Добавить proj4.dll в ночнушку?
(0007171)
vasketsov   
23-05-2012 19:03   
А зачем? У нас есть в основном репо такие извращённые карты?
(0007172)
Tolik   
23-05-2012 19:23   
Пока нет dll, и карты не появятся в репо :)

В завтрашней сборке проверю Proj4Args=EPSG:2513, я именно этого и хотел, чтоб просто указывать номер.
Спасибо.
(0007173)
vasketsov   
23-05-2012 19:31   
(edited on: 23-05-2012 19:33)
Чтобы просто указывать номер - это надо делать поддержку в коде для этого.

Можно конечно ходить налету и качать по ссылкам типа
http://spatialreference.org/ref/epsg/28483/proj4/
Но если сайт завалится - пиши пропало.

Сейчас можно указывать просто как EPSG:N в zmp для таких N:
53004 (точнее это ESRI:53004, но указывать в zmp надо EPSG:53004);
3785;
3395;
4326;
2463-2491;
2492-2522;
32601-32660;

Прочие значения неизвестны, и надо подставлять полную форму (которую брать по ссылкам типа http://spatialreference.org/ref/epsg/28483/proj4/).

(0007174)
zed   
23-05-2012 19:34   
(edited on: 23-05-2012 19:37)
>Можно конечно ходить налету и качать по ссылкам типа
А можно брать из файлика. Ща приложу.

Его можно распарсить ручками, превратить в юнит и вкомпилить в САС.

(0007175)
vasketsov   
23-05-2012 19:55   
Для целей тестирования хитрых параметров в нестандартных проекциях приаттачил UTMZoneConverter.rar. Там вбиты параметры для EPSG:32640 (с неё у меня всё и начиналось, а пересобирать лениво) - пусть это не пугает, это для любой проекции. Если DLL от proj4 лежит в папке с сасом - эту прогу кидайте туда же.

Пользоваться так:
1. Идём на http://spatialreference.org и ищем нужную (ну или максимально похожую) проекцию.
2. На её страничке жмакаем на proj4 и получаем строку инициализаии proj4 (должна быть строка вида +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs).
3. Эту строку встарвляем в первое поле, второе оставляем пустым.
4. Снизу вводим координаты lon lat (только десятичная форма!) - по кнопке они пересчитываются.
5. Большое текстовое поле внизу можете использовать как попало ))))).
(0007253)
vasketsov   
30-05-2012 23:07   
Раз уж vdemidov все тестовые скрипты переписал - пусть на нём и висит:
1. Надо пример, как в новой версии писать скрипты. Хотя бы на примере приаттаченной карты karta-dv.
2. Надо всё же восстановить работоспособность panoramio, если уж изгадил закачку аттачментов из скрипта и проги, с новой ночнушки оно отвалится. Соответственно сделай плиз новый zmp с примером (в соответствующей теме).
(0007259)
vdemidov   
31-05-2012 10:47   
>1. Надо пример, как в новой версии писать скрипты. Хотя бы на примере приаттаченной карты karta-dv.
Не вопрос. Сейчас приложу, только работать оно будет с завтрашнего билда, ибо там в Pascal Script бага небобьшая была.

>2. Надо всё же восстановить работоспособность panoramio
Увы. В ближайшее время не предвидится. Переделывать полностью некогда, а текущая реализация мне крайне сильно не нравится. Не нравится настолько, что предпочту ее вообще удалить.
(0007260)
zed   
31-05-2012 16:12   
А как насчёт подключить и все остальные проекции из файлика epsg?
(0007261)
vdemidov   
31-05-2012 16:19   
А просто прописать строку инициализации кто мешает?
(0007262)
zed   
31-05-2012 16:23   
Зачем пугать народ этой строкой, если можно обойтись простым кодом epsg? Причём, без особых заморочек.
(0007263)
zed   
31-05-2012 16:26   
(edited on: 31-05-2012 16:29)
Насколько часто может дёргаться функция TProjConverterFactory.GetArgsByEpsg?
Можно ведь и по регэспу парсить тот текстовик (пара секунд на это дело уйдёт, а может и не уйдёт) прямо в рантайме.

(0007264)
vdemidov   
31-05-2012 17:27   
ИМХО нет смысла держать в памяти мегабайт текстовы строк просто так. Но добавить это элементарно.
(0007265)
Tolik   
31-05-2012 17:33   
и я и я хочу просто код
(0007266)
zed   
31-05-2012 17:48   
>мегабайт текстовы строк
200-300kB. Там половина - комменты.
(0007267)
vdemidov   
31-05-2012 18:08   
Та ну ладно. Там половина строк коменты, но они очень короткие. Но как я уже сказал, сделать не сложно.
(0007268)
zed   
31-05-2012 19:45   
Скомпилировал proj480.dll - без тестового zmp сам проверить как она работает не могу :(
(0007269)
vdemidov   
31-05-2012 19:48   
Так прикреплен же сюда тестовый zmp
(0007270)
zed   
31-05-2012 19:49   
Упс, точно, не заметил. Ща попробую.
(0007271)
zed   
31-05-2012 20:01   
Угу, всё работает. Ща обновлю саса.
(0007272)
vasketsov   
31-05-2012 21:58   
>Переделывать полностью некогда
А зачем сломал тогда?

>текущая реализация мне крайне сильно не нравится
Аргументы? Мне может тоже много чего в этой жизни не нравится.

>предпочту ее вообще удалить
Единолично предпочтёшь, без аргументов?
Может повзрослеть пора?
(0007274)
vdemidov   
01-06-2012 06:36   
Никаких делфовских объектах в интерфейсах. Вот основной аргумент.
(0007277)
vasketsov   
01-06-2012 17:33   
(edited on: 01-06-2012 17:38)
>Вот основной аргумент
Этот аргумент я могу понять.
Но я не вижу в DownloadFileToLocal ни одного интерфейса ))).
Как и причин ломать это прямо сейчас.
Если ты решил SimpleDownloader довести до ума (в контексте всего проекта), унифицировать его и вытащить в скрипт - могу только порадоваться, но почему не предусмотреть "переходный период", чтобы (хотя бы одним способом из двух) работало то, что давно уже сделано и многими используется?
Судя по всему есть как минимум ещё один аргумент, более реальный и пока что неозвученный.
зы. В общем ставишь в странное положение. С одной стороны мне прямо сейчас надо работающую функциональность, потому что сваливаю на днях, но с другой стороны обновить проект ради других "косяков" не могу, опять же ни залить ни вылить (хотя сейчас это как раз не критично). Руками патчить код тоже не улыбается. В общем, в очередной раз призываю к внимательности, думать ДО того как делать полезно почти всегда.

(0007457)
Tolik   
18-06-2012 09:02   
vdemidov, а инструкции какие-то будут?
Как пользоваться?
Какой zmp - образец?
(0007458)
vdemidov   
18-06-2012 09:14   
Образец давно здесь приаттачен. Инструкции читаем:
http://sasgis.org/wikisasiya/doku.php/описание_паскаль_скриптов
(0007512)
zed   
19-06-2012 07:18   
Эти новые EPSG работают только в скриптах для пересчёта координат или в params.txt их тоже можно использовать? Или там только те 3 старые дефолтные проекции остались?
(0007514)
vdemidov   
19-06-2012 07:36   
(edited on: 19-06-2012 07:47)
>Или там только те 3 старые дефолтные проекции остались?
Только в скриптах. 3 старые проекции будут еще очень-очень-очень долго.
ЗЫ: Но в юнитах вполне можно пользоваться новыми конвертерами, если для каких-то специфических задач нужна хитрая проекция. Например в геокодерах.

(0013284)
Tolik   
19-11-2013 11:05   
(edited on: 19-11-2013 11:06)
Добавил рабочий zmp:
navici.zmp.zip © Zed отсюда: http://sasgis.org/forum/viewtopic.php?p=35241#p35242