Создание полигона (Create Region)

MapInfo, MapBasic
Ответить
sputnik1986
Новоприбывший
Сообщения: 2
Зарегистрирован: 08 апр 2011, 09:29
Репутация: 0

Создание полигона (Create Region)

Сообщение sputnik1986 » 08 апр 2011, 10:32

Здравствуйте!
Я новичок в MapBasic, поэтому прошу сильно не пинать...
Пишу небольшую программу, которая будет добавлять контур земельного участка по координатам из кадастра...
До этого делалось все вручную, при помощи открытия текстового файла с координатами, хотелось бы автоматизировать, так как пользователи все норовят накосячить...:)
Нашел кучу примеров, вроде сделал все как написано, а желаемого не достиг :(

Алгоритм такой есть координаты в массиве, которые берутся из оконной формы. Далее просто создается новая таблица и записывается в нее 1 полигон (Region)
Проблема состоит в следующем: при открытии созданной таблицы в активной карте полигон не отображается...
При просмотре ее в виде списка есть новая запись в таблице... Как ее отобразить на карте?

P.S. В оригинале вершины полигона добавляются в цикле, здесь я нарочно упростил алгоритм, набросав построение квадрата

Код: Выделить всё

Sub build_sub
	'построить контур по введенным координатам
	Dim i As Integer
	Dim obj_region As Object
	Dim new_table_path,new_table_name As String
	new_table_name = "new_table"

	new_table_path = FileSaveAsDlg("",new_table_name,"TAB","Сохранить координаты нового участка как...")
	'если пользователь не нажал "отмена"
	If new_table_path Then
		'создать таблицу с контуром (полигон)
		Create Table new_table_name
		(	y_coord Float,
			x_coord Float)
			File new_table_path
			Type NATIVE
			Version 300
		'произвести настройки таблицы
		Create Map For new_table_name CoordSys Nonearth Units "m" Bounds (0,0)(25000,25000)
		
		'создать пустой объект типа "region"
		Create Region Into Variable obj_region 0

		Alter Object obj_region Node Add (12000,14000)
		Alter Object obj_region Node Add (13000,14000)
		Alter Object obj_region Node Add (13000,15000)
		Alter Object obj_region Node Add (12000,15000)
		
		'поместить область с вершинами в таблицу
		Insert Into new_table_name (Object) Values (obj_region)
	End If
End Sub

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Создание полигона (Create Region)

Сообщение Boris » 08 апр 2011, 18:33

В тексте программы не хватает одной важной строчки:

Код: Выделить всё

      Set coordsys table new_table_name
которая должна стоять ДО команд создания объектов, т.к. она определяет внутреннюю координатную систему (СК) программы на MapBasic'е и указывает в каких единицах мыслить передаваемые числа и как их потом преобразовывать в координатную систему таблицы. СК могут быть разными у переменной типа гео-объект и таблицы. В этом случае при вставке объекта в таблицу производится пересчет координатных систем.
По хорошему не хватает так же:

Код: Выделить всё

      Set Distance Units "m"
, что бы не было сомнений в чем указаны координаты
и

Код: Выделить всё

Commit Table new_table_name 
в конце

sputnik1986
Новоприбывший
Сообщения: 2
Зарегистрирован: 08 апр 2011, 09:29
Репутация: 0

Re: Создание полигона (Create Region)

Сообщение sputnik1986 » 12 апр 2011, 08:51

Спасибо большое за совет.

Реализовал весь алгоритм следующим образом

Код: Выделить всё

Sub build_sub

	'построить контур по введенным координатам
	Dim win_id,i,i_len,pos,l_pos As Integer
	Dim obj_region As Object
	Dim str,s_x,s_y,new_table_path,new_table_name As String
	new_table_name = "new_table"
    'получить идентификатор активного окна
	win_id = FrontWindow()
	'запросить путь размещения и имя новой таблицы
	new_table_path = FileSaveAsDlg("",new_table_name,"TAB","Сохранить координаты нового участка как...")
	
	'если пользователь не нажал "отмена"
	If new_table_path Then
	
		'получить имя таблицы
		pos = 1
		l_pos = 1
		While pos > 0
			pos = InStr(l_pos + 1,new_table_path,"\")
			If pos > 0 Then
				l_pos = pos
			End If
		Wend
		i_len = Len(new_table_path)
		new_table_name = Mid$(new_table_path,l_pos+1,i_len - l_pos - 4)
		
		'установить систему координат сеанса
		Set CoordSys NonEarth Units "m" Bounds (0,0)(25000,25000)
		Set Distance Units "m"
		'создать таблицу с координатами точек и контуром (полигон)
		Create Table new_table_name
		(	y_coord Float,
			x_coord Float)
			File new_table_path
			Type NATIVE
			Version 300
		'произвести настройки таблицы, включить возможность добавления графических объектов 
		Create Map For new_table_name CoordSys Nonearth Units "m" Bounds (0,0)(25000,25000)
		'установить настройки таблицы
		Set CoordSys table new_table_name
		
		'создать пустой объект типа "область"
		Create Region Into Variable obj_region 0
			Pen (3,2,255) 'задать тип границы
			Brush (1,0,0) 'задать тип заливки

		'запись координат точек в новую таблицу
		'цикл по точкам
		For i = 1 to i_itemCount Step 1
			str = s_pointsArray(i) 'массив строк, содержащий координаты точек с разделителем, указанным в след. строке кода
			pos = InStr(1,str,"   ")
			i_len = Len(str)
			s_x = Mid$(str,1,pos-1)
			s_y = Mid$(str,pos+3,i_len-pos-2)
			Insert Into new_table_name (y_coord,x_coord) Values (s_x,s_y)
			Alter Object obj_region Node Add (Val(s_x),Val(s_y))
		Next
		
		'поместить область с вершинами в таблицу
		Insert Into new_table_name (Object) Values (obj_region)
		'сохранить изменения
		Commit Table new_table_name 'As new_table_path Type NATIVE CoordSys Nonearth Units "m" Bounds (0,0)(25000,25000) Version 300
		'добавить таблицу к активной карте или создать новую карту, если нет активной карты
		If win_id Then
			Add Map Layer new_table_name
		Else
			Map from new_table_name
		End If
	End If
End Sub
Хотя по-моему

Код: Выделить всё

Set CoordSys table new_table_name
будет уже лишней после установки системы координат сеанса работы?

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Создание полигона (Create Region)

Сообщение Boris » 12 апр 2011, 13:57

sputnik1986 писал(а):
Хотя по-моему

Код: Выделить всё

Set CoordSys table new_table_name
будет уже лишней после установки системы координат сеанса работы?
После любой установки - будет лишней. Хотя так гарантировано совпадение СК проекта и СК обрабатываемой таблицы. Но это уже стилистика, а не необходимость.

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Создание полигона (Create Region)

Сообщение Slinger » 13 апр 2011, 08:06

Я в своё время, когда писал утилитки, задавал оба вида проекций. В смысле "Create map For TableName......" - включение режима mappable + установки проекции окна карты и затем уже сам "Set CoordSys.....", задающий проекцию самой таблицы. Обе проекции идентичны. Пробовал по одиночки обойтись (друг бе друга), так при экспорте в .mif в строке координатной системы была задана долгота/широта (в моём случае я задавал NonEarth)

SergS
Активный участник
Сообщения: 120
Зарегистрирован: 14 апр 2011, 13:24
Репутация: 5
Откуда: Екатеринбург

Re: Создание полигона (Create Region)

Сообщение SergS » 14 апр 2011, 13:41

Slinger писал(а):Я в своё время, когда писал утилитки, задавал оба вида проекций. В смысле "Create map For TableName......" - включение режима mappable + установки проекции окна карты и затем уже сам "Set CoordSys.....", задающий проекцию самой таблицы. Обе проекции идентичны. Пробовал по одиночки обойтись (друг бе друга), так при экспорте в .mif в строке координатной системы была задана долгота/широта (в моём случае я задавал NonEarth)
Это все не совсем так (точнее совсем не так):
"Create map For TableName......" - да можно назввать и рвключением режима mappable, но к установкам проекции окна карты никакого отношения не имеет, задает систему координат для указанной таблицы.
а "затем уже сам "Set CoordSys.....", задающий проекцию самой таблицы" на самом деле задает систему координат для программы mapbasic (или, выполненая в окне mapbasic - задает систему координат для текущего сеанса мапинфо)
можно иметь и разные системы координат - для таблицы и для программы. иногда бывает оправданно. В этом случае, если координаты объекта обрабатываются (изменяются, добавляются узлы....) в программе в одной СК, то при добалении объекта (или замены) в таблицу будет произведен пересчет

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость