SASGIS

Веб-картография и навигация


View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0001172SAS.Планета[All Projects] Хотелкаpublic14-02-2012 11:2419-11-2013 11:06
ReporterTolik 
Assigned Tovdemidov 
PrioritylowSeverityfeatureReproducibilityN/A
StatusclosedResolutionfixed 
PlatformOSOS Version
Product Version110418 
Target Version120808Fixed in Version120808 
Summary0001172: Добавить поддержку разных EPSG
DescriptionМногие локальные карты работают в своих локальных проекциях, и их невозможно аккуратно подключить к САС.Планете.

Например, 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);
Additional InformationВот ещё пример такой карты: http://sasgis.org/forum/viewtopic.php?p=26181#p26181
Tagsлокальные карты, проекции
Attached Fileszip file icon lib.proj.-4.4.7.r.zip [^] (2,519,228 bytes) 26-04-2012 11:29
zip file icon maps.by.epsg.zmp.zip [^] (3,320 bytes) 07-05-2012 11:14
rar file icon Terraserver-2008-05-07-Hoznikovo.zmp.rar [^] (2,534 bytes) 23-05-2012 11:36
? file icon epsg [^] (648,497 bytes) 23-05-2012 19:34
rar file icon UTMZoneConverter.rar [^] (194,098 bytes) 23-05-2012 19:55
rar file icon karta-dv.zmp.rar [^] (1,220 bytes) 31-05-2012 10:53
zip file icon proj480.zip [^] (92,913 bytes) 31-05-2012 19:39
zip file icon navici.zmp.zip [^] (2,803 bytes) 19-11-2013 11:06

- Relationships

-  Notes
(0005527)
Tolik (manager)
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 (manager)
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 (manager)
24-04-2012 19:57

>Хоть бы формулы кто подкинул
Как я понимаю, если подключить либу Proj4 то и в формулы вникать не придётся?
А вообще, это мего-хотелка - подключить эту либу и заюзать все доступные проекции одним махом.
(0006473)
vasketsov (manager)
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 (manager)
24-04-2012 21:04

Судя по размеру и наполнению заголовочников proj4, обновить API до текущей версии не проблема.
(0006475)
vasketsov (manager)
24-04-2012 21:23

Ну я попробую сначала для наших зон 32630-32660 сделать и поиграться.
Всё равно же придётся писать в zmp что-то типа EPSG:32640, а не '+proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs'. А там дальше видно будет что к чему.
(0006476)
vasketsov (manager)
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 (manager)
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 (manager)
26-04-2012 11:37

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

Ну чего, кто-то пользуется? Косяки находили?

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

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

По поводу реализации - оставить как есть (конвертер грохается и создаётся заново), или например сделать его как свойство у IConverter (и тогда он будет доступен везде в коде, и будет создаваться только по требованию)?
(0006790)
Tolik (manager)
05-05-2012 17:56

vasketsov, вы б как-то подоступнее объяснили, как этим пользоваться. Рабочий пример бы приложили. А то я 2 недели назад прочитал, ничего не понял да и забыл.
(0006797)
vasketsov (manager)
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 (manager)
05-05-2012 18:21

Ну а весь рабочий zmp можно получить?
(0006800)
vasketsov (manager)
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 (manager)
05-05-2012 18:27

Тогда сделайте простейший zmp, например, для maps.by
(0006802)
vasketsov (manager)
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 (manager)
05-05-2012 18:46

Вощем нужен совет от разработчиков: сделать его как свойство у IConverter (и тогда он будет доступен везде в коде и в паскальскрипте, и будет создаваться только по требованию)?
Ну и вообще мысли по теме какие есть.
(0006805)
vdemidov (manager)
05-05-2012 18:50

Я бы предложил прописать EPSG дополнительного конвертера в параметрах карты, тобишь в params.txt, а в самом скрипте уже использовать готовый, или выдавать ошибку если дополнительный конвертер не задан или не можем создать.
(0006807)
vasketsov (manager)
05-05-2012 18:59

>прописать EPSG дополнительного конвертера в параметрах карты, тобишь в params.txt
В обсуждаемой формулировке не прокатит.

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

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

В итоге я так понимаю надо делать до двух объектов Proj4Conv на карту, один внутренний (для создания по данным из params.txt), а второй настраиваемый из скрипта (по умолчанию равный первому, в том числе NIL, и если отсутствует - создавать по первому требованию).
(0006847)
Tolik (manager)
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 (manager)
07-05-2012 12:09

На terra$erverе тоже mpp н совпадает с сасовским и фиксирован (из закрытого списка). Это уже не вопрос к проекции, это значит что координаты в BBOX не независимые (и например правая должна считаться через левую исходя из mpp и width). А может быть можно width изменить, чтобы BBOX остался запрошенным.
(0007148)
vasketsov (manager)
21-05-2012 18:51

Собираюсь добить тему с proj4.
Сейчас есть примеры карт, для которых было бы целесообразным указание EPSG на всю область определения карты?
Для того же terra$erverа EPSG определяется исходя из зоны UTM, то есть одной настройкой на весь мир не обойтись. А есть, для кого обойтись (из существующих сейчас сервисов)?
(0007152)
Tolik (manager)
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 (manager)
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 (manager)
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 (manager)
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 (manager)
23-05-2012 09:43

Из известных потенциальных проблем: поскольку конвертер proj4 один на конвертер координат - в случае параллельной скачки одной карты в разных зонах при автоопределении зоны возможна "война EPSG", так как конвертер EPSG в рамках одного выполнения одного скрипта не блокируется от сторонних изменений.
(0007166)
Tolik (manager)
23-05-2012 10:13

Ох, очень трудно понять такие длинные слова: интерфейсы, аргументы, инициализации, когда в голове опилки :)
Сделайте, пожалуйста, один любой рабочий ZMP. C одной предустановленной EPSG. Сразу всё будет ясно.

Офф: Почему это вдруг строки в постах перестали переноситься?
(0007167)
zed (manager)
23-05-2012 10:46

>Почему это вдруг строки в постах перестали переноситься?
vasketsov своими постами порвал все шаблоны и запутал все извилины :)
(0007168)
vasketsov (manager)
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 (manager)
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 (manager)
23-05-2012 19:02

Добавить proj4.dll в ночнушку?
(0007171)
vasketsov (manager)
23-05-2012 19:03

А зачем? У нас есть в основном репо такие извращённые карты?
(0007172)
Tolik (manager)
23-05-2012 19:23

Пока нет dll, и карты не появятся в репо :)

В завтрашней сборке проверю Proj4Args=EPSG:2513, я именно этого и хотел, чтоб просто указывать номер.
Спасибо.
(0007173)
vasketsov (manager)
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 (manager)
23-05-2012 19:34
edited on: 23-05-2012 19:37

>Можно конечно ходить налету и качать по ссылкам типа
А можно брать из файлика. Ща приложу.

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

(0007175)
vasketsov (manager)
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 (manager)
30-05-2012 23:07

Раз уж vdemidov все тестовые скрипты переписал - пусть на нём и висит:
1. Надо пример, как в новой версии писать скрипты. Хотя бы на примере приаттаченной карты karta-dv.
2. Надо всё же восстановить работоспособность panoramio, если уж изгадил закачку аттачментов из скрипта и проги, с новой ночнушки оно отвалится. Соответственно сделай плиз новый zmp с примером (в соответствующей теме).
(0007259)
vdemidov (manager)
31-05-2012 10:47

>1. Надо пример, как в новой версии писать скрипты. Хотя бы на примере приаттаченной карты karta-dv.
Не вопрос. Сейчас приложу, только работать оно будет с завтрашнего билда, ибо там в Pascal Script бага небобьшая была.

>2. Надо всё же восстановить работоспособность panoramio
Увы. В ближайшее время не предвидится. Переделывать полностью некогда, а текущая реализация мне крайне сильно не нравится. Не нравится настолько, что предпочту ее вообще удалить.
(0007260)
zed (manager)
31-05-2012 16:12

А как насчёт подключить и все остальные проекции из файлика epsg?
(0007261)
vdemidov (manager)
31-05-2012 16:19

А просто прописать строку инициализации кто мешает?
(0007262)
zed (manager)
31-05-2012 16:23

Зачем пугать народ этой строкой, если можно обойтись простым кодом epsg? Причём, без особых заморочек.
(0007263)
zed (manager)
31-05-2012 16:26
edited on: 31-05-2012 16:29

Насколько часто может дёргаться функция TProjConverterFactory.GetArgsByEpsg?
Можно ведь и по регэспу парсить тот текстовик (пара секунд на это дело уйдёт, а может и не уйдёт) прямо в рантайме.

(0007264)
vdemidov (manager)
31-05-2012 17:27

ИМХО нет смысла держать в памяти мегабайт текстовы строк просто так. Но добавить это элементарно.
(0007265)
Tolik (manager)
31-05-2012 17:33

и я и я хочу просто код
(0007266)
zed (manager)
31-05-2012 17:48

>мегабайт текстовы строк
200-300kB. Там половина - комменты.
(0007267)
vdemidov (manager)
31-05-2012 18:08

Та ну ладно. Там половина строк коменты, но они очень короткие. Но как я уже сказал, сделать не сложно.
(0007268)
zed (manager)
31-05-2012 19:45

Скомпилировал proj480.dll - без тестового zmp сам проверить как она работает не могу :(
(0007269)
vdemidov (manager)
31-05-2012 19:48

Так прикреплен же сюда тестовый zmp
(0007270)
zed (manager)
31-05-2012 19:49

Упс, точно, не заметил. Ща попробую.
(0007271)
zed (manager)
31-05-2012 20:01

Угу, всё работает. Ща обновлю саса.
(0007272)
vasketsov (manager)
31-05-2012 21:58

>Переделывать полностью некогда
А зачем сломал тогда?

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

>предпочту ее вообще удалить
Единолично предпочтёшь, без аргументов?
Может повзрослеть пора?
(0007274)
vdemidov (manager)
01-06-2012 06:36

Никаких делфовских объектах в интерфейсах. Вот основной аргумент.
(0007277)
vasketsov (manager)
01-06-2012 17:33
edited on: 01-06-2012 17:38

>Вот основной аргумент
Этот аргумент я могу понять.
Но я не вижу в DownloadFileToLocal ни одного интерфейса ))).
Как и причин ломать это прямо сейчас.
Если ты решил SimpleDownloader довести до ума (в контексте всего проекта), унифицировать его и вытащить в скрипт - могу только порадоваться, но почему не предусмотреть "переходный период", чтобы (хотя бы одним способом из двух) работало то, что давно уже сделано и многими используется?
Судя по всему есть как минимум ещё один аргумент, более реальный и пока что неозвученный.
зы. В общем ставишь в странное положение. С одной стороны мне прямо сейчас надо работающую функциональность, потому что сваливаю на днях, но с другой стороны обновить проект ради других "косяков" не могу, опять же ни залить ни вылить (хотя сейчас это как раз не критично). Руками патчить код тоже не улыбается. В общем, в очередной раз призываю к внимательности, думать ДО того как делать полезно почти всегда.

(0007457)
Tolik (manager)
18-06-2012 09:02

vdemidov, а инструкции какие-то будут?
Как пользоваться?
Какой zmp - образец?
(0007458)
vdemidov (manager)
18-06-2012 09:14

Образец давно здесь приаттачен. Инструкции читаем:
http://sasgis.org/wikisasiya/doku.php/описание_паскаль_скриптов
(0007512)
zed (manager)
19-06-2012 07:18

Эти новые EPSG работают только в скриптах для пересчёта координат или в params.txt их тоже можно использовать? Или там только те 3 старые дефолтные проекции остались?
(0007514)
vdemidov (manager)
19-06-2012 07:36
edited on: 19-06-2012 07:47

>Или там только те 3 старые дефолтные проекции остались?
Только в скриптах. 3 старые проекции будут еще очень-очень-очень долго.
ЗЫ: Но в юнитах вполне можно пользоваться новыми конвертерами, если для каких-то специфических задач нужна хитрая проекция. Например в геокодерах.

(0013284)
Tolik (manager)
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


- Users who viewed this issue
User List Anonymous (7525x), zed (2x), ingener (4x), OfK (1x), rass (4x), Alezy80 (1x), Garl (18x), ygorigor (3x), Tolik (1x)
Total Views 7559
Last View 23-11-2024 08:17

- Issue History
Date Modified Username Field Change
14-02-2012 11:24 Tolik New Issue
14-02-2012 11:27 Tolik Description Updated View Revisions
16-02-2012 11:29 Tolik Note Added: 0005527
16-02-2012 11:56 Tolik Note Edited: 0005527 View Revisions
16-02-2012 11:57 Tolik Note Edited: 0005527 View Revisions
29-02-2012 11:03 gpsMax Tag Attached: локальные карты
29-02-2012 11:06 gpsMax Tag Attached: проекции
02-03-2012 08:40 vdemidov Status new => confirmed
02-03-2012 08:40 vdemidov Target Version => 40xxxx
24-04-2012 19:00 vasketsov Note Added: 0006471
24-04-2012 19:10 vasketsov Note Edited: 0006471 View Revisions
24-04-2012 19:57 zed Note Added: 0006472
24-04-2012 20:21 vasketsov Note Added: 0006473
24-04-2012 20:27 vasketsov Note Edited: 0006473 View Revisions
24-04-2012 21:04 zed Note Added: 0006474
24-04-2012 21:23 vasketsov Note Added: 0006475
25-04-2012 09:43 vasketsov Note Added: 0006476
25-04-2012 09:45 vasketsov Note Edited: 0006476 View Revisions
26-04-2012 11:28 vasketsov Note Added: 0006479
26-04-2012 11:29 vasketsov File Added: lib.proj.-4.4.7.r.zip
26-04-2012 11:37 vasketsov Note Added: 0006480
26-04-2012 11:37 vasketsov Assigned To => vasketsov
26-04-2012 11:37 vasketsov Status confirmed => assigned
05-05-2012 16:49 vasketsov Note Added: 0006780
05-05-2012 17:56 Tolik Note Added: 0006790
05-05-2012 18:16 vasketsov Note Added: 0006797
05-05-2012 18:21 Tolik Note Added: 0006799
05-05-2012 18:23 vasketsov Note Added: 0006800
05-05-2012 18:27 vasketsov Note Edited: 0006800 View Revisions
05-05-2012 18:27 Tolik Note Added: 0006801
05-05-2012 18:29 vasketsov Note Added: 0006802
05-05-2012 18:33 vasketsov Note Edited: 0006802 View Revisions
05-05-2012 18:46 vasketsov Note Added: 0006804
05-05-2012 18:50 vdemidov Note Added: 0006805
05-05-2012 18:59 vasketsov Note Added: 0006807
07-05-2012 11:12 Tolik Note Added: 0006847
07-05-2012 11:13 Tolik Note Edited: 0006847 View Revisions
07-05-2012 11:14 Tolik File Added: maps.by.epsg.zmp.zip
07-05-2012 11:16 Tolik Note Edited: 0006847 View Revisions
07-05-2012 12:09 vasketsov Note Added: 0006853
21-05-2012 18:51 vasketsov Note Added: 0007148
22-05-2012 05:32 Tolik Note Added: 0007152
22-05-2012 05:34 Tolik Note Edited: 0007152 View Revisions
22-05-2012 05:42 Tolik Note Edited: 0007152 View Revisions
22-05-2012 08:12 vasketsov Note Added: 0007155
22-05-2012 11:33 vasketsov Note Edited: 0007155 View Revisions
23-05-2012 09:30 vasketsov Note Added: 0007163
23-05-2012 09:38 vasketsov Note Added: 0007164
23-05-2012 09:39 vasketsov Note Edited: 0007164 View Revisions
23-05-2012 09:43 vasketsov Note Added: 0007165
23-05-2012 09:54 vasketsov Note Edited: 0007163 View Revisions
23-05-2012 09:54 vasketsov Note Edited: 0007163 View Revisions
23-05-2012 10:13 Tolik Note Added: 0007166
23-05-2012 10:46 zed Note Added: 0007167
23-05-2012 11:29 vasketsov Note Added: 0007168
23-05-2012 11:35 vasketsov Note Edited: 0007168 View Revisions
23-05-2012 11:35 vasketsov Note Edited: 0007168 View Revisions
23-05-2012 11:36 vasketsov File Added: Terraserver-2008-05-07-Hoznikovo.zmp.rar
23-05-2012 18:57 vasketsov Note Added: 0007169
23-05-2012 18:58 vasketsov File Added: karta-dv.zmp.rar
23-05-2012 19:02 zed Note Added: 0007170
23-05-2012 19:02 vasketsov Note Edited: 0007169 View Revisions
23-05-2012 19:03 vasketsov Note Added: 0007171
23-05-2012 19:10 vasketsov Note Edited: 0007169 View Revisions
23-05-2012 19:23 Tolik Note Added: 0007172
23-05-2012 19:31 vasketsov Note Added: 0007173
23-05-2012 19:33 vasketsov Note Edited: 0007173 View Revisions
23-05-2012 19:34 zed Note Added: 0007174
23-05-2012 19:34 zed File Added: epsg
23-05-2012 19:37 zed Note Edited: 0007174 View Revisions
23-05-2012 19:55 vasketsov Note Added: 0007175
23-05-2012 19:55 vasketsov File Added: UTMZoneConverter.rar
30-05-2012 23:03 vasketsov Assigned To vasketsov => vdemidov
30-05-2012 23:07 vasketsov Note Added: 0007253
31-05-2012 10:47 vdemidov Note Added: 0007259
31-05-2012 10:52 vdemidov File Deleted: karta-dv.zmp.rar
31-05-2012 10:53 vdemidov File Added: karta-dv.zmp.rar
31-05-2012 16:12 zed Note Added: 0007260
31-05-2012 16:19 vdemidov Note Added: 0007261
31-05-2012 16:23 zed Note Added: 0007262
31-05-2012 16:26 zed Note Added: 0007263
31-05-2012 16:29 zed Note Edited: 0007263 View Revisions
31-05-2012 17:27 vdemidov Note Added: 0007264
31-05-2012 17:33 Tolik Note Added: 0007265
31-05-2012 17:48 zed Note Added: 0007266
31-05-2012 18:08 vdemidov Note Added: 0007267
31-05-2012 19:39 zed File Added: proj480.zip
31-05-2012 19:45 zed Note Added: 0007268
31-05-2012 19:48 vdemidov Note Added: 0007269
31-05-2012 19:49 zed Note Added: 0007270
31-05-2012 20:01 zed Note Added: 0007271
31-05-2012 21:58 vasketsov Note Added: 0007272
01-06-2012 06:36 vdemidov Note Added: 0007274
01-06-2012 17:33 vasketsov Note Added: 0007277
01-06-2012 17:38 vasketsov Note Edited: 0007277 View Revisions
18-06-2012 08:18 vdemidov Status assigned => resolved
18-06-2012 08:18 vdemidov Fixed in Version => 120808
18-06-2012 08:18 vdemidov Resolution open => fixed
18-06-2012 09:00 vdemidov Target Version 40xxxx => 120808
18-06-2012 09:02 Tolik Note Added: 0007457
18-06-2012 09:14 vdemidov Note Added: 0007458
19-06-2012 07:18 zed Note Added: 0007512
19-06-2012 07:36 vdemidov Note Added: 0007514
19-06-2012 07:47 vdemidov Note Edited: 0007514 View Revisions
10-10-2012 11:46 Tolik Status resolved => closed
19-11-2013 11:05 Tolik Note Added: 0013284
19-11-2013 11:06 Tolik Note Edited: 0013284 View Revisions
19-11-2013 11:06 Tolik File Added: navici.zmp.zip



Copyright © 2007 - 2024 SAS.Planet Team